15

使用 POI 时,excel 文档中的单元格和字体包含颜色信息,这些信息并不总是返回 rgb 值,而且通常只提供索引值。索引值必须对照某物进行查找才能获得颜色。在 HSSFWorkbook (xls) 中有一种方法可用于获取调色板:

InputStream in = new FileInputStream("sheet.xls");
HSSFWorkbook wb = new HSSFWorkbook(in);
wb.getCustomPalette();

访问 XSSFWorkbook (xlsx) 时没有这样的方法,事实上我在相关类的任何地方都找不到调色板信息。我能够从 XSSFont 和 Cell 中获取索引值,但获得颜色“名称”的唯一方法是将其与 IndexedColors 枚举匹配。这让我回到了同样的原始问题;我仍然没有 rgb 值可以使用。

InputStream in = new FileInputStream("sheet.xlsx");
XSSFWorkbook wb = new XSSFWorkbook (in);
wb.getCustomPalette(); <-- fail!

我通过 CellStyle 获得 XSSFColor,如下所示:

CellStyle style = cell.getCellStyle();
XSSFColor color = style.getFillBackgroundColorColor();

通过 IndexedColors 获取颜色名称:

for (IndexedColors c : IndexedColors.values()) { if (c.index == indexColor){ System.out.println("Color: " + c.name()); } }

类似的问题:如何获取给定单元格的 (Java Apache POI HSSF) 背景颜色?

参考: http: //poi.apache.org/spreadsheet/quick-guide.html#CustomColors

更新 1:我终于找到了可行的方法。这种 XSSFColor 方法返回 ARGB 十六进制代码,用它我可以确定 RGB 值(显然)。我希望这有助于为遇到相同问题的人节省 x 小时数。

((XSSFColor) color).getARGBHex())

更新 2:令我沮丧的是,我发现某些单元格不返回包含 ARGBHex 数据的背景 XSSFColor。寻找解决方法。

4

3 回答 3

10

使用wb.getStylesSource(),你可以得到一个StylesTable,你可以从中得到所有的CellStyle对象。API有XSSFCellStyle许多方法来获取颜色对象 - 即XSSFColor. XSSFCellStyleAPI 还可以访问该样式中的所有字体 - 即,您XSSFFont可以再次从中获取XSSFColor该特定字体的对象。

一旦你可以访问它XSSFColor,调用getRGB()将返回一个 RGB 值的字节数组。

于 2013-08-07T19:44:24.047 回答
1

你不会在这里得到你正在寻找的东西。没有等效的 XSSF 版本的 HSSFPalette。不需要它,因为 HSSFWorkbook 可以使用的颜色数量非​​常有限。您提供的链接中给出的说明是您将获得的最接近的说明。如果您只是询问一旦我有一个 XSSFColor 对象,我如何弄清楚 getRGB() 的返回意味着什么颜色,您可以随时参考这个可以让您输入 RGB 值并查看颜色的网站,如果您正在寻找颜色名称,则基本上必须创建自己的实用程序,该实用程序将存储已知的颜色 rgb 值并有一些方法查看哪个最接近您的返回 RGB。这是我能做的最好的事情,我不知道有什么东西可以为你提供开箱即用的功能。

于 2013-08-07T20:22:04.523 回答
1

需要注意的一件事是 Excel 反转了普通单元格中实心填充图案的前景和背景的含义*。因此,也许您需要对getFillForegroundColorColor()具有纯色图案类型的单元格使用该方法。

此外,回顾您之前的问题,64 不是有效的颜色索引,因为范围是 0..63。索引 64 用于指示单元格中的默认前景色。

(*) 在条件格式单元格中它不会这样做!!

于 2013-08-08T14:42:50.837 回答