C#写入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(假设第一行是表头)。
其他逻辑问题
独立的
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; }危险的
goto导致无限循环
如果三个颜色条件都不满足,FontChecker保持50,会一直跳转到RepeatFontCheck,进入死循环。上面的else分支可以直接解决这个问题,不需要依赖FontChecker和goto。类型转换的潜在异常
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) { // 颜色设置逻辑 } }检查评估函数的返回值
确认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

