使用十六进制更改Excel单元格背景颜色会导致Excel在电子表格中显示完全不同的颜色。

16

我正在设置一个Excel单元格的背景色,比如下面这样:

worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;

然而,当我在Excel中打开电子表格时,发现颜色完全不同(在上述情况下,结果电子表格中的颜色为0xDCDCEF)。我尝试了几种不同的颜色,它总是会改变,我没有看到任何规律。

这是有什么原因吗?我甚至尝试通过编写Color.FromArgb(241, 220, 219).ToArgb()来设置颜色,但是出现了同样的问题。


5
Excel的哪个版本?在Excel 2007之前,你只能使用56种不同的颜色,而且Excel会将你尝试设置的颜色默默地映射到调色板中最接近的一个颜色(结果有时是不可预测的)。 - Tim Williams
嗨Tim - 我正在使用Excel 2010,根据我所阅读的一切,这应该是可能的。 - Amberite
那么电子表格以兼容模式打开了? - Hans Passant
Hans - 我不确定我理解的相关性,但据我所知,C#是以正常模式打开Excel的,当我稍后自己打开Excel程序时,它也不在兼容模式下。 - Amberite
7个回答

21

我终于弄清楚了,经过大量的测试,其实问题非常简单。显然,Excel的Interop库存在一个错误,会颠倒红色和蓝色值,因此我需要传递BGR而不是RGB的十六进制值,这样颜色就可以正常工作了。令人惊讶的是,在互联网上没有其他地方记录这个错误。

因此,如果有人遇到这个问题,只需将Excel值传递为BGR值即可。(或者如果使用Color.FromArgb(),请传递Color.FromArgb(B, G, R))


1
太棒了!我刚刚在用VBA编写一个将interior.color转换为RGB的函数,这篇文章解释了为什么它之前没有正常工作! - Gaijinhunter
哇,几个月前我遇到了这个问题,让我感到非常疯狂。很高兴我偶然间找到了解决方法。谢谢! - codeConcussion
感谢您在这里记录下来。我已经进行了指定的更改,颜色翻译得非常好。 - Leo Gurdian

8

您需要将颜色从十六进制转换为Excel的颜色系统,方法如下:

ColorConverter cc = new ColorConverter();
worksheet.Cells[1, 1].Interior.Color = ColorTranslator.ToOle((Color)cc.ConvertFromString("#F1DCDB"));

这不算是一个bug,因为Excel的颜色系统一直都是这样。这只是让C#与Excel交互更加繁琐的另一件事情。


2
请注意,这不是一个错误!红色从低位开始,绿色在中间,蓝色占据了最高位。
B G R 00000000 00000000 00000000
计算方法为:(65536 * 蓝色) + (256 * 绿色) + (红色)
谢谢。

不,你在这里是错误的。Excel的帮助文件本身就说明要将其作为RGB传递,而不是BGR。位数并不重要,因为预期的使用方式是传递RGB。当您需要干扰.NET自己的内置函数(如FromArgb)并反转参数以使Excel正常工作时,那就是一个错误。 - Amberite

1

我也想发布我的代码,但是没有适合我的复制和粘贴解决方案。 基于Sandesh的代码:

private void ColorMe(Color thisColor){
rng = xlApp.ActiveCell;
Color mycolour = ColorTranslator.FromHtml("#" + thisColor.Name.Substring(2, 6));
rng.Interior.Color = Color.FromArgb(mycolour.R, mycolour.G, mycolour.B);
}

1

可以从 HTML 十六进制 字符串中解析出 RGB 颜色

Color colour = ColorTranslator.FromHtml("#E7EFF2");

如果您有单独的 alpha 值,那么您可以应用它 (文档):
Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color transparent = Color.FromArgb(128, colour);

1

这是可能解释答案的背景信息。

如果使用HTML指定颜色#FF9900,您将获得Excel称为浅橙色的颜色。如果指定颜色#003366,则会获得Excel称为深青色的颜色。但是,如果您想要使用vba获得浅橙色或深青色,必须指定&H0099FF和&H663300。

也就是说,虽然vba函数是RGB(&Hrr,&Hgg,&Hbb),但它生成的数字是&Hbbggrr,因为这是Excel显示引擎想要的。

我猜编写Excel Interop的人不知道Excel使用非标准数字来指定颜色。


1
尝试使用worksheet.cells(1,1).interior.color = rgb(241, 220, 219)编辑我有点傻,刚刚注意到您没有使用VBA 8)。这可能有点困难,但您可以尝试将其发送为十进制数吗?就价值而言,... interior.color = &HF1DCDB在VBA中有效,= 15850715也是如此。

是的,我正在使用C#和Excel Interop :) ...但是是的,这是一个非常奇怪和烦人的问题。我尝试过使用十进制,使用十六进制(显然),使用1580715,所有东西都会产生其他颜色,并且我根本不知道Excel如何得出那种颜色。如果有一些模式,我至少会编写代码... - Amberite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接