You need to enable JavaScript to run this app. C#使用EPPLUS动态设置Excel单元格颜色不生效的解决方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 10:15:09