17

I'm trying to format some range by using conditional Formatting feature of EPPlus. I read many document but there is nowhere mentions about Conditional Formatting Expression.

I'm very confusing. Don't know how to use that feature. Here are my some questions:

  1. Can we use multiple range to put into parameter ExcelAddress (like "H1:H17,L1:L17,"AA1:AA17")
  2. The formula is put into Formula property is somehow like Interop Excel or not? (like we use "A1" to represent for the current cell for formatting in interop excel)
  3. Can you give me a small demo code leg that use Conditional Formatting Expression.

Thank you!

(Sorry for bad English I wrote)

CAD bloke
  • 7,546
  • 6
  • 58
  • 104
Han
  • 2,988
  • 3
  • 21
  • 36

3 Answers3

36

I have found out solution by myself. Please take an example code:

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's value. It's 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;

In the above example,

  • _formatRangeAddress is the range that will be applied for the conditional formatting by the expression. The first cell in this range will be used in the condition formula. (B3).
  • _statement is the formula used to calculate the condition, this string doesn't start with equal sign (=) (difference point from MS Excel), the cell which is used to make expression is the first cell in the _formatRangeAddress. (B3).

Hope this is helpful to others who need. -Han-

Han
  • 2,988
  • 3
  • 21
  • 36
  • can u provide for the "Contains" text conditional formatting – Annadate Piyush Nov 01 '14 at 11:10
  • 1
    It is Excel function. I see that they use `ISNUMBER` and `SEARCH` funcions. http://office.microsoft.com/en-001/excel-help/check-if-a-cell-contains-text-HP003056106.aspx – Han Jan 11 '15 at 07:51
  • 1
    I want to use Conditional Formatting direct on Excel but I have no clear the `current` on your expression. You used as expression `IF(AND(ISBLANK(OFFSET(B3,0,-1)),ISBLANK(B3)),1,0)` and, in the code comment you says `// fill WHITE color if one of previous cell or current cell is BLANK:`. Where is the reference to `current` cell? I only see `B3`. – jotapdiez Aug 26 '15 at 14:42
  • Hi. The `_formatRangeAddress` starts from `B3`, so in the formula, I use `B3`, It's current cell. Previous cell is `OFFSET(B3,0,-1)`. The comment seems not to be right. I'll correct the example statement. – Han Aug 30 '15 at 05:12
1

There is support for conditional formatting in the 3.1 beta version of EPPlus.

Take a look at the source-code here: http://epplus.codeplex.com/discussions/348196/

Mennan
  • 4,091
  • 12
  • 49
  • 84
0

After many moons I found way more flexible and fast approach to do this using LINQ and EPPlus. All you need to do is: add extra property to your list to save Excel Row Numbers, and then retrieve cell addresses using LINQ. In this case it would look like this:

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); 
}

Here is the full article:

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

Also see here another example: https://stackoverflow.com/a/49022692/8216122 hope this helps somebody in the future.

Richard Mneyan
  • 538
  • 1
  • 11
  • 15