使用 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";