访问XSSFWorkbook中的调色板

时间:2013-08-07 19:30:42

标签: java colors apache-poi

使用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()); } }

类似问题:How do I get the (Java Apache POI HSSF) Background Color for a given cell?

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

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

((XSSFColor) color).getARGBHex())

更新2:令我沮丧的是,我发现有些Cell没有返回包含ARGBHex数据的背景XSSFColor。寻找解决方案。

3 个答案:

答案 0 :(得分:9)

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

一旦您获得XSSFColor的访问权限,对getRGB()的调用将返回RGB值的字节数组。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

需要注意的一点是,Excel反转了普通单元格中实体填充图案的前景和背景的含义*。因此,您可能需要对具有实体模式类型的单元格使用getFillForegroundColorColor()方法。

另外,回到上一个问题,64不是有效的颜色索引,因为范围是0..63。索引64用于指示单元格中的默认前景色。

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