18

我正在尝试使用 EPPlus 的条件格式化功能来格式化一些范围。我阅读了很多文档,但没有任何地方提到条件格式表达式。

我很困惑。不知道如何使用该功能。以下是我的一些问题:

  1. 我们可以使用多个范围来放入参数 ExcelAddress(如“H1:H17,L1:L17”、“AA1:AA17”)
  2. 将公式放入公式属性中是否类似于 Interop Excel?(就像我们使用“A1”来表示当前单元格以在互操作 Excel 中进行格式化)
  3. 你能给我一个使用条件格式表达式的小演示代码。

谢谢!

(对不起,我写的英语不好)

4

3 回答 3

39

我自己找到了解决方案。请举一个示例代码:

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;

在上面的例子中,

  • _formatRangeAddress是表达式将应用于条件格式的范围。此范围内的第一个单元格将用于条件公式。(B3)。
  • _statement是用于计算条件的公式,该字符串 以等号(=)开头(与 MS Excel 的区别点),用于制作表达式的单元格是 _formatRangeAddress. (B3)。

希望这对其他需要的人有所帮助。-韩-

于 2012-11-05T10:08:56.537 回答
1

EPPlus 的 3.1 beta 版本支持条件格式。

看看这里的源代码:http: //epplus.codeplex.com/discussions/348196/

于 2012-11-02T14:04:58.437 回答
0

经过许多个月后,我找到了使用 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

另请参见此处的另一个示例:https ://stackoverflow.com/a/49022692/8216122 希望这对将来的某人有所帮助。

于 2018-02-28T15:34:24.763 回答