Apache poi excel颜色单元问题

Posted

技术标签:

【中文标题】Apache poi excel颜色单元问题【英文标题】:Apache poi excel color cell issue 【发布时间】:2015-03-19 14:55:15 【问题描述】:

我正在使用apache poi写excel数据。

String colour = "A2C465";
byte[] ret = new byte[3];
for(int i=0; i<3; i++)
    ret[i] = (byte)hexToInt(colour.charAt(i * 2), colour.charAt(i*2+1));


public int hexToInt(char a, char b)
        int x = a < 65 ? a-48 : a-55;
        int y = b < 65 ? b-48 : b-55;
        return x*16+y;
    

在循环迭代之后,我得到了 ret = -94,-60,101。但实际的 RGB 代码是 162,196,101(因为从 int 转换为 byte)。因此颜色在 excel 表中变得不同.你能帮我吗?

【问题讨论】:

请提供hexToInt(char c1, char c2)...的代码。为什么不简单地使用Integer.parseInt("A2", 16)Integer.parseInt("C4", 16)等等? 谢谢你的回复,我已经添加了代码 感谢您的回复 "字节数据类型是一个8位有符号二进制补码整数,最小值为-128,最大值为127(含)"。见docs.oracle.com/javase/tutorial/java/nutsandbolts/…。所以十六进制“A2” = int 162 = 字节 -94 和十六进制“C4” = int 196 = 字节 -60。您在字节数组中的结果没问题。您如何将此字节数组与 apache poi 一起使用?至少对于Class HSSFPalettepublic HSSFColor addColor(byte red, byte green,byte blue),字节应该像无符号一样工作。但是java.awt.Color 需要 R、G、B 的 int 值。 【参考方案1】:

Axel Richter 的评论有您正在寻找的答案,如果您需要将字节转换为 int,您应该使用按位并避免保留符号。以下示例将字节显示为其有符号值以及转换为 int 时。

    byte[] ret = DatatypeConverter.parseHexBinary("A2C465");
    for (byte b: ret) 
        int asInt = b & 0xFF;
        System.out.println(b + " vs " + asInt);
    

【讨论】:

【参考方案2】:

如果返回值为负,则加256!

-94+256 = 162

-60+256 = 196

101 将保持 101,因为一个字节的范围是 -128 到 127。

【讨论】:

以上是关于Apache poi excel颜色单元问题的主要内容,如果未能解决你的问题,请参考以下文章

APACHE POI - 无法为单元格提供背景颜色

无法设置填充颜色 Apache POI Excel 工作簿

POI对Excel单元格进行颜色设置

POI之Excel自定义单元格背景颜色

如何使用合并单元格值大于单元格宽度的 Apache-POI 增加 excel 行的高度?

poi读取Excel时,如果单元格设置的是数字格式,如何解决整数与小数问题