使用EPPlus进行条件格式化

本文关键字:条件 格式化 EPPlus 使用 | 更新日期: 2023-09-27 18:01:32

我试图实现以下目标:我有一个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;

任何帮助将不胜感激!!

使用EPPlus进行条件格式化

使用fs.Write的方法将简单地用epplus生成的文件覆盖复制的文件,因为您是在字节/流级别这样做的。所以那不会让你得到你想要的。(@MatthewD在他的帖子里给你看了这个)。

至于应用格式本身,你所拥有的应该工作,但如果你得到那种错误,我怀疑你混合了excel文件的epplus和非epplus操作。您应该大致这样做:

[TestMethod]
public void Conditional_Format_Test()
{
    //http://stackoverflow.com/questions/31296039/conditional-formatting-using-epplus
    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 & lt;。05年,& lt; 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";