我正在使用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电子表格时,它会显示一个错误,要求恢复数据。
答案 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条件格式)。