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

时间:2011-09-14 21:55:12

标签: c# excel excel-vba interop excel-interop vba

所以我将Excel单元格的内部颜色设置为某个值,如下所示:

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

然而,当我在Excel中打开电子表格时,我看到出来的颜色完全不同(在上面的例子中,结果电子表格中的颜色是0xDCDCEF)。我尝试了几种不同的颜色,它总是改变它,我看不到一种模式。

这有什么理由吗?我甚至尝试通过编写Color.FromArgb(241,220,219).ToArgb()来设置颜色,同样的事情发生了。

7 个答案:

答案 0 :(得分:17)

经过大量的测试后,我终于想通了,这真的很简单。显然,Excel的Interop库有一个bug并且正在反转红色和蓝色值,所以我不需要传递RGB的十六进制,而是需要传递BGR,突然颜​​色工作得很好。我很惊讶这个错误没有记录在互联网上的任何其他地方。

因此,如果其他人遇到此问题,只需在BGR值中传递Excel值即可。 (或者,如果使用Color.FromArgb(),则传入Color.FromArgb(B,G,R))

答案 1 :(得分:7)

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

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

这不是一个真正的错误,因为Excel的颜色系统一直都是这样的。这只是让C# - Excel互操作变得痛苦的另一件事。

答案 2 :(得分:2)

请注意,这不是错误!红色从低位开始,绿色位于中间,蓝色位于最高位

B G R
00000000 00000000 00000000

计算公式为:(65536 *蓝色)+(256 *绿色)+(红色)

谢谢。

答案 3 :(得分:1)

尝试worksheet.cells(1,1).interior.color = rgb(241, 220, 219).

编辑我很蠢,只是注意到你没有使用VBA 8)。这有点长,但你可以尝试将其作为十进制发送吗?对于它的价值,... interior.color =& HF1DCDB在VBA中起作用= 15850715。

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

RGB颜色可以单独从HTML hex字符串进行解析:

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

如果您有单独的Alpha值,则可以应用此(docs):

Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color transparent = Color.FromArgb(128, colour);

答案 6 :(得分:1)

Just wanted to post my code, too. Since there was no copy&paste solution for me. Based on Sandesh 's code:

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);
}