EPPlus条件格式'AddExpression'问题

问题描述 投票:0回答:1

我希望有人比EPPlus有更多的经验可以指出我更好的方向。

我在一张表(40列,大约600行)中有一个值表,在另一张表中有一个值列表。对于每一行,应通过将背景设置为红色来突出显示表中与列表中相应值(同一行)不匹配的任何值。

我找到了实现这一目标的方法;但它非常慢。它为大约24000个单元格中的每一个创建条件格式规则,这在任何情况下都是很长的时间,但是规则列表越大,每个单元需要添加的时间越长;总而言之,运行此循环需要半个小时:

    private static bool TryCreateConditionalFormatting(List<HVISettingSection> properties, int numberOfColumns, ExcelWorksheet ranges, ref ExcelWorksheet sxs)
    {
        bool success = true;


        int row = 4;
        foreach (HVISettingSection settings in properties)
        {
            row++; // to move beyond the section label
            foreach (var x in settings.SettingsList)
            {
                for (int col = 3; col < 3 + numberOfColumns; col++)
                {
                    var exacta = ranges.Cells[row, 3];
                    //ExcelFormulaAddress exactaAddr = new ExcelFormulaAddress(exacta.Address);
                    var neqRule = sxs.ConditionalFormatting.AddExpression(sxs.Cells[row, col]);
                    string _statement = string.Format(
                                         "AND(LEN(Ranges!{0})<>0, Ranges!{0}<>{1})",
                                         exacta.Address,
                                         new OfficeOpenXml.ExcelCellAddress(row, col).Address);

                    neqRule.Style.Fill.BackgroundColor.Color = Color.Red;
                    neqRule.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                    neqRule.Formula = _statement;
                }

            }
        }

        return success;
    }

我希望有一些方法可以为整行定义规则,但只能更改单个单元格的格式;而不是我的公式

string _statement = string.Format(
                                         "AND(LEN(Ranges!{0})<>0, Ranges!{0}<>{1})",
                                         exacta.Address,
                                         new OfficeOpenXml.ExcelCellAddress(row, col).Address);

我想要这样的事情:

string _statement = string.Format(
                                         "AND(LEN(Ranges!{0})<>0, Ranges!{0}<>{1})",
                                         exacta.Address,
                                         <process each address in a range, separately>;

当然,最后一行完全是由伪代码组成的。

有没有办法做到这一点?

谢谢大家

epplus conditional-formatting
1个回答
0
投票

这不是我希望找到的答案,但它可能是我能做的最好的。

我发现没办法真正做我想要的,但我确实找到了解决我的问题的另一种方法。我刚刚创建了一个模板电子表格,页面上有所有的条件格式(我很幸运,除了行数之外,细节不依赖于内容;所以我只创建了一个行的BUNCH,任意更多比我需要的)

我将该XLSX文件保存为.Net文件资源。然后,当我启动时,我这样做:

using (BinaryWriter bw = new BinaryWriter(File.Open(filename, FileMode.Create)))
{
    // this is the xslx file resource; just write it to the file
    bw.Write(Properties.Resources.SampleStatus);  
}

//  Now, turn around and read that file into EPP ExcelPackage
FileInfo myFile = new FileInfo(filename);
using (ExcelPackage ExcelFile = new ExcelPackage(myFile))
{
    // Access the worksheets in the excel file
    ExcelWorksheet sxsWorksheet = ExcelFile.Workbook.Worksheets["Side-By-Side"];
    ExcelWorksheet rangesWorksheet = ExcelFile.Workbook.Worksheets["Ranges"];

    // add all of the data content here

    // add any additional worksheets you want

    // ... and save it!
    ExcelFile.Save();
}

它很快 - 可能是5秒,而不是20-30分钟。我希望它可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.