Условное форматирование по выражению с использованием EPPlus

Я пытаюсь отформатировать диапазон, используя условную функцию форматирования EPPlus. Я прочитал много документов, но нигде не упоминается об условном форматировании.

Я очень запутан. Не знаю, как использовать эту функцию. Вот мои вопросы:

  • Можно ли использовать несколько диапазонов для ввода в параметр ExcelAddress (например, "H1: H17, L1: L17," АА1: AA17" )
  • Формула помещается в свойство Formula как-то вроде Interop Excel или нет? (например, мы используем "A1" для представления текущей ячейки для форматирования в interop excel)
  • Можете ли вы дать мне небольшую часть демо-кода, использующую условное форматирование?

Спасибо!

(Извините за плохой английский, я написал)

Ответы

Ответ 1

Я нашел решение самостоятельно. Возьмите пример кода:

ExcelAddress _formatRangeAddress = new ExcelAddress("B3:B10,D3:D10,F3:F10,H3:H10:J3:J10");
// fill WHITE color if previous cell or current cell is BLANK:
// B3 is the current cell because the range _formatRangeAddress starts from B3.
// OFFSET(B3,0,-1) returns the previous cell value. It excel function.
string _statement = "IF(OR(ISBLANK(OFFSET(B3,0,-1)),ISBLANK(B3)),1,0)";
var _cond4 = sheet.ConditionalFormatting.AddExpression(_formatRangeAddress);
_cond4.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_cond4.Style.Fill.BackgroundColor.Color = Color.White;
_cond4.Formula = _statement;

// fill GREEN color if value of the current cell is greater than 
//    or equals to value of the previous cell
_statement = "IF(OFFSET(B3,0,-1)-B3<=0,1,0)";
var _cond1 = sheet.ConditionalFormatting.AddExpression(_formatRangeAddress);
_cond1.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_cond1.Style.Fill.BackgroundColor.Color = Color.Green;
_cond1.Formula = _statement;

// fill RED color if value of the current cell is less than 
//    value of the previous cell
_statement = "IF(OFFSET(B3,0,-1)-B3>0,1,0)";
var _cond3 = sheet.ConditionalFormatting.AddExpression(_formatRangeAddress);
_cond3.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_cond3.Style.Fill.BackgroundColor.Color = Color.Red;
_cond3.Formula = _statement;

В приведенном выше примере

  • _formatRangeAddress - это диапазон, который будет применяться для условное форматирование по выражению. Первая ячейка в этом диапазон будет использоваться в формуле условия. (В3).
  • _statement формула, используемая для вычисления условия, эта строка не начинать с знака равенства (=) (разность точек из MS Excel), ячейка, которая используется для выражения, является первой ячейкой в _formatRangeAddress. (В3).

Надеюсь, это поможет другим, кому это нужно. -Han -

Ответ 2

Существует поддержка условного форматирования в бета-версии EPPlus 3.1.

Взгляните на исходный код здесь: http://epplus.codeplex.com/discussions/348196/

Ответ 3

После многих лун я нашел более гибкий и быстрый подход к этому, используя LINQ и EPPlus. Все, что вам нужно сделать: добавить дополнительное свойство в свой список, чтобы сохранить номера строк Excel, а затем получить адреса ячеек с помощью LINQ. В этом случае это будет выглядеть так:

string sRng = string.Join(",", YourModel.Where(f => f.YourField == null)
    .Select(a => "H" + a.iRow + ",L" + a.iRow + ",AA" + a.iRow)); // this address could be many pages and it works

if (sRng.Length > 0) {
    ws.Cells[sRng].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Green); 
}

Вот полная статья:

https://www.codeproject.com/Tips/1231992/Conditional-Formatting-in-Excel-with-LINQ-and-EPPl

Также см. Здесь другой пример: fooobar.com/info/4416851/... надеюсь, что это поможет кому-то в будущем.