如何在C#中获取Excel单元格的字体颜色
解决Office Interop Excel获取单元格字体实际颜色的问题
问题根源
你之前的代码错误地使用了r.Style.Font来获取字体颜色——Style对应的是单元格应用的样式模板,而非单元格直接设置的实际格式。如果单元格是手动设置的字体颜色(未通过样式应用),Style.Font只会返回样式的默认颜色,这就是你得到全0和ColorIndex=1的原因。
正确实现方案
直接使用单元格自身的Font属性,而非Style下的Font,再通过ColorTranslator将OLE_COLOR类型的值转换为System.Drawing.Color:
Range thrange = ws.UsedRange.Columns["A:A", Type.Missing].Rows; foreach (Range r in thrange) { // 直接获取单元格的Font对象,而非Style中的Font Font font = r.Font; // 将OLE_COLOR类型的double值转换为System.Drawing.Color System.Drawing.Color color = System.Drawing.ColorTranslator.FromOle((int)font.Color); // 输出单元格值和十六进制颜色(如#FF0000对应红色) Console.WriteLine($" {r.Value} #{color.R:X2}{color.G:X2}{color.B:X2}"); }
关键说明
r.Font:直接指向单元格实际应用的字体格式,不管是通过样式还是手动设置,都能获取真实的颜色值。font.Color返回的是OLE_COLOR类型的double值,需要先转换为int,再用ColorTranslator.FromOle转换为GDI+的Color对象,才能正确解析RGB分量。- 转换后可通过
color.R、color.G、color.B获取RGB数值,或格式化为标准十六进制颜色字符串。
预期输出
运行代码后,对应测试单元格的输出会是:
cyan #00FFFF pink #FFC0CB blue #0000FF red #FF0000 orange #FFA500 purple #800080
内容的提问来源于stack exchange,提问作者Kit Ramos
相关产品推荐
相关产品推荐

