C#使用EPPLUS动态设置Excel单元格颜色不生效的解决方法
EPPLUS动态设置单元格字体颜色失效的排查与修复
核心常见原因
- 遗漏保存操作:EPPLUS的所有单元格修改都是在内存中完成的,未显式调用
Save()方法时,所有样式调整都不会写回实际文件,这是最高发的问题。 - 行号匹配错位:循环计算的目标行号和工作表实际数据行不对应,导致样式被设置到了空单元格或者无关单元格上,看起来像功能失效。
- 颜色值识别异常:部分EPPLUS版本在直接引用
System.Drawing.Color.Red这类命名颜色时,会因为索引色映射规则不匹配导致颜色赋值无效。 - 保存流程静默失败:EPPLUS 5.x及以上版本如果未正确配置许可证,执行保存时会抛出异常,如果未捕获异常,会导致内存中的修改无法持久化。
修复后完整实现代码
var costStructureReport = new { CurrentQuotation = rptCostStructure.GetCostStructureReport() }; var reportEngine = new ReportEngine(); string fileName = reportEngine.ProcessReport(ReportNames.ProjectDownload_Template, reportname + ".xlsx", costStructureReport); // 使用using自动释放文件句柄,避免文件锁定 using var ep = new ExcelPackage(new FileInfo(fileName)); var sheet1 = ep.Workbook.Worksheets["SPR_ProjectDownload"]; int dataStartRow = 2; // 确认模板中第一行业务数据的实际行号,不要硬编码错误值 var quotationList = costStructureReport.CurrentQuotation; for(int i = 0; i < quotationList.Count; i++) { // 跳过空行,避免样式设置到空白单元格 if (string.IsNullOrWhiteSpace(sheet1.Cells[dataStartRow + i, 2].Text)) { continue; } if (quotationList[i].MaterialCost_ByUser) { // 显式传入带Alpha通道的完整ARGB值,避免颜色映射异常 sheet1.Cells[dataStartRow + i, 2].Style.Font.Color.SetColor(System.Drawing.Color.FromArgb(255, 255, 0, 0)); sheet1.Cells[dataStartRow + i, 12].Style.Font.Color.SetColor(System.Drawing.Color.FromArgb(255, 255, 0, 0)); sheet1.Cells[dataStartRow + i, 12].Style.Font.Bold = true; } } // 执行保存,将所有样式修改写入实际文件 ep.Save();
快速验证步骤
- 调试时直接读取目标单元格的颜色属性,确认赋值是否生效:查看
sheet1.Cells[目标行, 目标列].Style.Font.Color.Rgb的返回值,正常红色对应的返回值为FFFF0000,如果返回其他值说明行号引用错误。 - 核对工作表实际数据范围:通过
sheet1.Dimension拿到的工作表实际起始行、结束行,和循环使用的起始行号做对比,避免行偏移。 - 确认许可证配置:如果使用EPPLUS 5.0以上版本,需要在程序启动时设置正确的许可证上下文,否则保存操作会被拦截。
内容的提问来源于stack exchange,提问作者user981849
相关产品推荐
相关产品推荐

