所以我将Excel单元格的内部颜色设置为某个值,如下所示:
worksheet.Cells[1, 1].Interior.Color = 0xF1DCDB;
然而,当我在Excel中打开电子表格时,我看到出来的颜色完全不同(在上面的例子中,结果电子表格中的颜色是0xDCDCEF)。我尝试了几种不同的颜色,它总是改变它,我看不到一种模式。
这有什么理由吗?我甚至尝试通过编写Color.FromArgb(241,220,219).ToArgb()来设置颜色,同样的事情发生了。
答案 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);
}