我正在设置一个Excel单元格的背景色,比如下面这样:
worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;
然而,当我在Excel中打开电子表格时,发现颜色完全不同(在上述情况下,结果电子表格中的颜色为0xDCDCEF)。我尝试了几种不同的颜色,它总是会改变,我没有看到任何规律。
这是有什么原因吗?我甚至尝试通过编写Color.FromArgb(241, 220, 219).ToArgb()来设置颜色,但是出现了同样的问题。
我正在设置一个Excel单元格的背景色,比如下面这样:
worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;
然而,当我在Excel中打开电子表格时,发现颜色完全不同(在上述情况下,结果电子表格中的颜色为0xDCDCEF)。我尝试了几种不同的颜色,它总是会改变,我没有看到任何规律。
这是有什么原因吗?我甚至尝试通过编写Color.FromArgb(241, 220, 219).ToArgb()来设置颜色,但是出现了同样的问题。
我终于弄清楚了,经过大量的测试,其实问题非常简单。显然,Excel的Interop库存在一个错误,会颠倒红色和蓝色值,因此我需要传递BGR而不是RGB的十六进制值,这样颜色就可以正常工作了。令人惊讶的是,在互联网上没有其他地方记录这个错误。
因此,如果有人遇到这个问题,只需将Excel值传递为BGR值即可。(或者如果使用Color.FromArgb(),请传递Color.FromArgb(B, G, R))
您需要将颜色从十六进制转换为Excel的颜色系统,方法如下:
ColorConverter cc = new ColorConverter();
worksheet.Cells[1, 1].Interior.Color = ColorTranslator.ToOle((Color)cc.ConvertFromString("#F1DCDB"));
这不算是一个bug,因为Excel的颜色系统一直都是这样。这只是让C#与Excel交互更加繁琐的另一件事情。
我也想发布我的代码,但是没有适合我的复制和粘贴解决方案。 基于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);
}
可以从 HTML 十六进制
字符串中解析出 RGB 颜色:
Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color transparent = Color.FromArgb(128, colour);
这是可能解释答案的背景信息。
如果使用HTML指定颜色#FF9900,您将获得Excel称为浅橙色的颜色。如果指定颜色#003366,则会获得Excel称为深青色的颜色。但是,如果您想要使用vba获得浅橙色或深青色,必须指定&H0099FF和&H663300。
也就是说,虽然vba函数是RGB(&Hrr,&Hgg,&Hbb),但它生成的数字是&Hbbggrr,因为这是Excel显示引擎想要的。
我猜编写Excel Interop的人不知道Excel使用非标准数字来指定颜色。
worksheet.cells(1,1).interior.color = rgb(241, 220, 219)
。
编辑我有点傻,刚刚注意到您没有使用VBA 8)。这可能有点困难,但您可以尝试将其发送为十进制数吗?就价值而言,... interior.color = &HF1DCDB在VBA中有效,= 15850715也是如此。