访问XSSFWorkbook中的调色板

使用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方法返回ARGBhex代码,用它我可以确定RGB值(显然)。 我希望这有助于为有相同问题的人节省x个小时。

 ((XSSFColor) color).getARGBHex()) 

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

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

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

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

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

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

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