Я надеюсь, что кто-то, у кого больше опыта, чем у меня с 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>;
Эта последняя строка, конечно, полностью состоит из псевдокода, если хотите.
Есть ли способ сделать это?
Спасибо всем