Проблема условного формата EPPlus 'AddExpression' - PullRequest
0 голосов
/ 05 сентября 2018

Я надеюсь, что кто-то, у кого больше опыта, чем у меня с 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>;

Эта последняя строка, конечно, полностью состоит из псевдокода, если хотите.

Есть ли способ сделать это?

Спасибо всем

1 Ответ

0 голосов
/ 08 сентября 2018

Это не тот ответ, который я надеялся найти, но, возможно, это лучшее, что я могу сделать.

Я не нашел способа сделать то, что хотел, но я нашел другой способ решить МОЮ проблему. Я только что создал шаблонную электронную таблицу со всем условным форматированием на странице (мне повезло, что детали не зависят от содержимого, кроме количества строк; поэтому я просто создал ПУТЬ из строк, произвольно больше чем мне нужно)

Я сохранил этот файл XSLX как ресурс файла .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 минут. Я надеюсь, что это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...