14

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

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

但是,当我随后在 Excel 中打开电子表格时,我看到出来的颜色完全不同(在上述情况下,生成的电子表格中的颜色是 0xDCDCEF)。我尝试了几种不同的颜色,它总是改变它,我看不到图案。

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

4

7 回答 7

19

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

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

于 2011-09-15T02:28:56.883 回答
8

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

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

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

于 2011-09-15T03:21:26.920 回答
2

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

BGR
00000000 00000000 00000000

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

谢谢你。

于 2012-02-02T09:26:11.903 回答
1

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

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

于 2011-09-14T21:58:56.677 回答
1

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

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

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

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

于 2011-11-12T19:18:08.103 回答
1

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

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

如果您有单独的 alpha 值,则可以应用此值(文档):

Color colour = ColorTranslator.FromHtml("#E7EFF2");
Color transparent = Color.FromArgb(128, colour);
于 2014-09-19T12:47:41.810 回答
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);
}
于 2016-10-19T13:41:55.230 回答