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

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

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

但是,当我在Excel中打开电子表格时,发现出现的颜色完全不同(在上述情况下,生成的电子表格中的颜色为0xDCDCEF)。 我尝试了几种不同的颜色,它总是改变它,我没有看到一种模式。

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

经过大量的testing,我终于明白了,这真的很简单。 显然,Excel的互操作库有一个错误,并且正在颠倒红色和蓝色的值,所以不是传递一个hex的RGB,我需要通过BGR,突然间颜色工作得很好。 我很惊讶,这个错误没有logging在互联网上的任何其他地方。

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

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

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

这不是一个真正的错误,因为Excel的颜色系统一直是这样的。 这只是让C#和Excel互操作而已。

请注意,这不是一个bug!红色从低位开始,绿色在中间,蓝色占据最高位

BGR
00000000 00000000 00000000

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

谢谢。

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

编辑我很笨,只是注意到你不使用VBA 8)。 这是一个很长的一段时间,但你可以尝试发送它作为十进制? 对于它的价值,… interior.color =&HF1DCDB在VBA中工作,如= 15850715。

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

如果使用HTML,则指定颜色#FF9900,您将得到Excel称为浅橙色的内容。 如果你指定颜色#003366,你会得到什么Excel称为深蒂尔。 但是,如果你想要淡橙色或暗淡黄色的vba你必须指定&H0099FF和&H663300。

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

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

RGB颜色本身可以从HTML hexstringparsing:

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

如果你有一个单独的字母值,你可以应用这个(文档):

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

只是想发布我的代码。 由于我没有复制和粘贴解决scheme。 基于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); }