You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#写入Excel文件时部分内容字体颜色未按预期显示求助

排查Excel单元格字体颜色未正确设置的问题

看起来你的代码里大部分单元格保持默认黑色,核心问题出在触发颜色设置的条件过于严格,同时还有一些逻辑上的小问题,我来帮你拆解分析:

核心问题:颜色设置的触发条件太窄

你的颜色设置逻辑被包裹在这个条件里:

if (i > 1 && j > 0 && j < 9 && (Convert.ToDouble(data[i, 9])) < 0.05 && (Convert.ToDouble(data[i, j])) != 0.0)

这个条件同时满足多个限制,只要有一个不满足,单元格就不会进入颜色设置流程,保持默认黑色:

  • i > 1:跳过前两行(索引0和1),如果你的数据有效行不止从第三行开始,这会漏掉前面的行
  • j > 0 && j <9:只处理第2到第9列(j从1到8),其他列完全不触发颜色设置
  • Convert.ToDouble(data[i,9]) <0.05:第10列(j=9)的数值必须小于0.05,否则当前行的所有目标列都不会变色
  • Convert.ToDouble(data[i,j]) !=0.0:当前单元格值不能是0,否则跳过

如果你的数据中有大量行/列不满足这些条件,自然会显示黑色。你需要根据实际需求调整这些限制,比如如果要处理所有数据行(除了表头),可以把i >1改成i >=1(假设第一行是表头)。

其他逻辑问题

  1. 独立的if语句可能导致冲突
    你现在用三个独立的if,如果某个情况下多个条件同时满足(比如assess5=3,assess50=11),后面的颜色会覆盖前面的。应该改成if-else if-else结构,确保每个单元格只匹配一个颜色规则:

    if (assess5 < 3 && assess50 < 10)
    {
        builder.Append(" Green");
        oRng.Font.Color = XlRgbColor.rgbGreen;
    }
    else if (assess5 >= 3 && assess50 <= 10)
    {
        builder.Append(" Orange");
        oRng.Font.Color = XlRgbColor.rgbOrange;
    }
    else if (assess5 > 3 && assess50 > 10)
    {
        builder.Append(" Red");
        oRng.Font.Color = XlRgbColor.rgbRed;
    }
    else
    {
        // 处理三个条件都不满足的情况,比如设置默认黑色或者不做处理
        oRng.Font.Color = XlRgbColor.rgbBlack;
    }
    
  2. 危险的goto导致无限循环
    如果三个颜色条件都不满足,FontChecker保持50,会一直跳转到RepeatFontCheck,进入死循环。上面的else分支可以直接解决这个问题,不需要依赖FontChecker和goto。

  3. 类型转换的潜在异常
    Convert.ToDouble(data[i,9])和Convert.ToDouble(data[i,j])如果遇到无法转换为数值的内容,会抛出异常,导致程序崩溃。建议改用double.TryParse做安全转换:

    if (i > 1 && j > 0 && j < 9)
    {
        if (double.TryParse(data[i,9]?.ToString(), out double col9Value) && 
            double.TryParse(data[i,j]?.ToString(), out double cellValue) &&
            col9Value < 0.05 && cellValue != 0.0)
        {
            // 颜色设置逻辑
        }
    }
    
  4. 检查评估函数的返回值
    确认Assessment5Day和Assessment50Day的返回值是否符合你的预期。比如如果Assessment5Day返回的数值范围不在你判断的区间内(比如返回0-5,但你判断的是<3、>=3、>3),也会导致颜色不触发。可以在代码里加调试输出,查看这两个函数的实际返回值。

修复后的代码片段示例

这里是调整后的核心逻辑部分:

if (i > 1 && j > 0 && j < 9)
{
    if (double.TryParse(data[i,9]?.ToString(), out double col9Value) && 
        double.TryParse(data[i,j]?.ToString(), out double cellValue) &&
        col9Value < 0.05 && cellValue != 0.0)
    {
        ListBuilder(i, j, cellValue);
        int assess5 = Convert.ToInt32(Assessment5Day(i, j, cellValue));
        int assess50 = Convert.ToInt32(Assessment50Day(i, j, cellValue));

        if (assess5 < 3 && assess50 < 10)
        {
            builder.Append(" Green");
            oRng.Font.Color = XlRgbColor.rgbGreen;
        }
        else if (assess5 >= 3 && assess50 <= 10)
        {
            builder.Append(" Orange");
            oRng.Font.Color = XlRgbColor.rgbOrange;
        }
        else if (assess5 > 3 && assess50 > 10)
        {
            builder.Append(" Red");
            oRng.Font.Color = XlRgbColor.rgbRed;
        }
        else
        {
            // 处理其他情况,保持默认黑色
            oRng.Font.Color = XlRgbColor.rgbBlack;
        }
    }
}

额外建议

  • 调试时可以在颜色设置的代码块里加断点,查看哪些单元格进入了这个逻辑,哪些没有,从而定位条件是否符合预期。
  • 对于Excel操作,确保oRng对象正确获取到了目标单元格,避免空引用(你的代码里oSheet.Cells[i+1,j+1]是Excel的1-based索引,逻辑是对的)。

内容的提问来源于stack exchange,提问作者loumbut5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:40