Conditional Formatting by Expression using EPPlus

人走茶凉 提交于 2019-11-26 22:58:11

问题


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)


回答1:


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-




回答2:


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/




回答3:


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.



来源:https://stackoverflow.com/questions/13196762/conditional-formatting-by-expression-using-epplus

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!