EPPlus条件格式化整列的字符串长度

时间:2016-06-15 13:01:17

标签: c# excel excel-formula epplus

我正在使用EPPlus生成带有验证和条件格式的Excel文档。我想检查单元格中文本的长度,如果大于指定长度,则用颜色填充。我希望这可以在整个专栏中完成。

var address = new ExcelAddress("$A:$A");
var condition = workSheet.ConditionalFormatting.AddExpression(address);

condition.Formula = "=IF(LEN(A1)>25, TRUE, FALSE)";
condition.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
condition.Style.Fill.BackgroundColor.Color = Color.Green;

当我打开生成的Excel电子表格时,它会显示一个错误,要求恢复数据。

3 个答案:

答案 0 :(得分:1)

对于像我一样看着此线程并在打开excel时出错的人,请注意,您不能使用“ =”来启动条件表达式。

此外,我的Excel公式区域格式要求我应使用“;”表示多个参数,但在这种情况下,公式似乎像“,”作为分隔符。以下代码段应该起作用:

123abc

答案 1 :(得分:0)

当我测试这个

using (var app = new ExcelPackage())
{
   var workSheet = app.Workbook.Worksheets.Add("asdf");
   var address = new ExcelAddress("$A:$A");
   var condition = workSheet.ConditionalFormatting.AddExpression(address);
   workSheet.Cells["A1"].Value = "asdfasdfasdfasdfasdfasfdasd";
   condition.Formula = "=IF(LEN(A1)>25, TRUE, FALSE)";
   condition.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
   condition.Style.Fill.BackgroundColor.Color = System.Drawing.Color.Green;
   var destinationPath = @"../../GeneratedExcelFile.xlsx";
   File.WriteAllBytes(destinationPath, app.GetAsByteArray());
}

它没有导致任何错误,因此我认为问题是由您提供的代码之外的其他内容引起的

答案 2 :(得分:0)

以下是条件格式的全新方法: 您可以使用LINQ根据您的条件检索单元格地址。只需确保在列表中添加用于存储Excel行号的附加属性(下面的 iRow )。

string sRng = string.Join(",", YourModel.Where(l => l.YourColumn.Length > 25)
    .Select(a => "A" + 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); 
}

这种方法快速,灵活,与条件格式不同,不会牺牲Excel性能。这是完整的文章:

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

EPPlus有什么好处我没有看到范围地址的限制 - 在单个字符串中,你可以传递大约15,000-20,000个单元格的地址,并立即格式化所有这些地址。 唯一的缺点是,用户不能动态播放数据并希望了解格式的变化(例如Excel条件格式)。