使用 EPPlus 进行条件格式化
Conditional Formatting using EPPlus
我正在尝试实现以下目标:我有一个 C# 应用程序,它执行一些数据处理,然后使用 EPPlus 输出到 .xlsx
。我想向 excel 添加一些条件格式并尝试了以下方法,首先我制作了一个空白模板 excel 并设置了所有条件格式规则,然后尝试将数据转储到其中。下面的片段是我的方法。 p
是一个 Excel 包。目前这不起作用,数据写入正确但是我设置的格式规则丢失了。我猜是因为它在写入之前基本上清除了所有内容。任何帮助将不胜感激!
Byte[] bin = p.GetAsByteArray();
File.Copy("C:\template.xlsx", "C:\result.xlsx");
using (FileStream fs = File.OpenWrite("C:\result.xlsx")) {
fs.Write(bin, 0, bin.Length);
}
注意 :: 我也尝试了以下方法来避免整个外部模板情况。检查下面的代码片段。问题是,在生成 .xlsx 并打开它之后,它说文件具有不可读或不可显示的内容,需要修复它,在我修复之后,一切都很好,条件格式也有工作了。我不知道为什么要这样做,也不知道如何在打开文件时消除错误。
string _statement = "$E1=\"3\"";
var _cond = ws.ConditionalFormatting.AddExpression(_formatRangeAddress);
_cond.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_cond.Style.Fill.BackgroundColor.Color = Color.LightCyan;
_cond.Formula = _statement;
任何帮助将不胜感激!!
使用 fs.Write
的方法将简单地用 epplus 生成的文件覆盖复制的文件,因为您是在 byte/stream 级别进行的。所以那不会让你得到你想要的。 (@MatthewD 在他的 post 中向您展示了这一点)。
至于应用格式本身,你所拥有的应该可以工作,但如果你遇到那种错误,我怀疑你正在混合对 excel 文件的 epplus 和非 epplus 操作。这就是你应该粗略地做的事情:
[TestMethod]
public void Conditional_Format_Test()
{
//
var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
if (existingFile.Exists)
existingFile.Delete();
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.Add(new DataColumn("Col1", typeof(int)));
datatable.Columns.Add(new DataColumn("Col2", typeof(int)));
datatable.Columns.Add(new DataColumn("Col3", typeof(int)));
for (var i = 0; i < 20; i++)
{
var row = datatable.NewRow();
row["Col1"] = i;
row["Col2"] = i * 10;
row["Col3"] = i * 100;
datatable.Rows.Add(row);
}
using (var pack = new ExcelPackage(existingFile))
{
var ws = pack.Workbook.Worksheets.Add("Content");
ws.Cells["E1"].LoadFromDataTable(datatable, true);
//Override E1
ws.Cells["E1"].Value = "3";
string _statement = "$E1=\"3\"";
var _cond = ws.ConditionalFormatting.AddExpression(new ExcelAddress(ws.Dimension.Address));
_cond.Style.Fill.PatternType = ExcelFillStyle.Solid;
_cond.Style.Fill.BackgroundColor.Color = Color.LightCyan;
_cond.Formula = _statement;
pack.SaveAs(existingFile);
}
}
为了扩展@Ernie 代码示例,这里有一个工作示例,它根据单元格的值对范围进行着色。根据单元格的值 (<.01, <.05, <.1),范围内的每个单元格可以有三种颜色中的任何一种。
ExcelRange rng = ws.Cells[statsTableRowStart, 10, statsTableRowStart + gud.levels.level.Count() - 1, 10];
OfficeOpenXml.ConditionalFormatting.Contracts.IExcelConditionalFormattingExpression _condp01 = ws.ConditionalFormatting.AddExpression(rng);
_condp01.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_condp01.Style.Fill.BackgroundColor.Color = System.Drawing.Color.OrangeRed;
_condp01.Formula = new ExcelFormulaAddress(rng.Address) + "<.01";
OfficeOpenXml.ConditionalFormatting.Contracts.IExcelConditionalFormattingExpression _condp05 = ws.ConditionalFormatting.AddExpression(rng);
_condp05.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_condp05.Style.Fill.BackgroundColor.Color = System.Drawing.Color.OliveDrab;
_condp05.Formula = new ExcelFormulaAddress(rng.Address) + "<.05";
OfficeOpenXml.ConditionalFormatting.Contracts.IExcelConditionalFormattingExpression _condp1 = ws.ConditionalFormatting.AddExpression(rng);
_condp1.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_condp1.Style.Fill.BackgroundColor.Color = System.Drawing.Color.LightCyan;
_condp1.Formula = new ExcelFormulaAddress(rng.Address) + "<.1";
我正在尝试实现以下目标:我有一个 C# 应用程序,它执行一些数据处理,然后使用 EPPlus 输出到 .xlsx
。我想向 excel 添加一些条件格式并尝试了以下方法,首先我制作了一个空白模板 excel 并设置了所有条件格式规则,然后尝试将数据转储到其中。下面的片段是我的方法。 p
是一个 Excel 包。目前这不起作用,数据写入正确但是我设置的格式规则丢失了。我猜是因为它在写入之前基本上清除了所有内容。任何帮助将不胜感激!
Byte[] bin = p.GetAsByteArray();
File.Copy("C:\template.xlsx", "C:\result.xlsx");
using (FileStream fs = File.OpenWrite("C:\result.xlsx")) {
fs.Write(bin, 0, bin.Length);
}
注意 :: 我也尝试了以下方法来避免整个外部模板情况。检查下面的代码片段。问题是,在生成 .xlsx 并打开它之后,它说文件具有不可读或不可显示的内容,需要修复它,在我修复之后,一切都很好,条件格式也有工作了。我不知道为什么要这样做,也不知道如何在打开文件时消除错误。
string _statement = "$E1=\"3\"";
var _cond = ws.ConditionalFormatting.AddExpression(_formatRangeAddress);
_cond.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_cond.Style.Fill.BackgroundColor.Color = Color.LightCyan;
_cond.Formula = _statement;
任何帮助将不胜感激!!
使用 fs.Write
的方法将简单地用 epplus 生成的文件覆盖复制的文件,因为您是在 byte/stream 级别进行的。所以那不会让你得到你想要的。 (@MatthewD 在他的 post 中向您展示了这一点)。
至于应用格式本身,你所拥有的应该可以工作,但如果你遇到那种错误,我怀疑你正在混合对 excel 文件的 epplus 和非 epplus 操作。这就是你应该粗略地做的事情:
[TestMethod]
public void Conditional_Format_Test()
{
//
var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
if (existingFile.Exists)
existingFile.Delete();
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.Add(new DataColumn("Col1", typeof(int)));
datatable.Columns.Add(new DataColumn("Col2", typeof(int)));
datatable.Columns.Add(new DataColumn("Col3", typeof(int)));
for (var i = 0; i < 20; i++)
{
var row = datatable.NewRow();
row["Col1"] = i;
row["Col2"] = i * 10;
row["Col3"] = i * 100;
datatable.Rows.Add(row);
}
using (var pack = new ExcelPackage(existingFile))
{
var ws = pack.Workbook.Worksheets.Add("Content");
ws.Cells["E1"].LoadFromDataTable(datatable, true);
//Override E1
ws.Cells["E1"].Value = "3";
string _statement = "$E1=\"3\"";
var _cond = ws.ConditionalFormatting.AddExpression(new ExcelAddress(ws.Dimension.Address));
_cond.Style.Fill.PatternType = ExcelFillStyle.Solid;
_cond.Style.Fill.BackgroundColor.Color = Color.LightCyan;
_cond.Formula = _statement;
pack.SaveAs(existingFile);
}
}
为了扩展@Ernie 代码示例,这里有一个工作示例,它根据单元格的值对范围进行着色。根据单元格的值 (<.01, <.05, <.1),范围内的每个单元格可以有三种颜色中的任何一种。
ExcelRange rng = ws.Cells[statsTableRowStart, 10, statsTableRowStart + gud.levels.level.Count() - 1, 10];
OfficeOpenXml.ConditionalFormatting.Contracts.IExcelConditionalFormattingExpression _condp01 = ws.ConditionalFormatting.AddExpression(rng);
_condp01.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_condp01.Style.Fill.BackgroundColor.Color = System.Drawing.Color.OrangeRed;
_condp01.Formula = new ExcelFormulaAddress(rng.Address) + "<.01";
OfficeOpenXml.ConditionalFormatting.Contracts.IExcelConditionalFormattingExpression _condp05 = ws.ConditionalFormatting.AddExpression(rng);
_condp05.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_condp05.Style.Fill.BackgroundColor.Color = System.Drawing.Color.OliveDrab;
_condp05.Formula = new ExcelFormulaAddress(rng.Address) + "<.05";
OfficeOpenXml.ConditionalFormatting.Contracts.IExcelConditionalFormattingExpression _condp1 = ws.ConditionalFormatting.AddExpression(rng);
_condp1.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_condp1.Style.Fill.BackgroundColor.Color = System.Drawing.Color.LightCyan;
_condp1.Formula = new ExcelFormulaAddress(rng.Address) + "<.1";