使用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。寻找解决方案。
答案 0 :(得分:9)
使用wb.getStylesSource()
,您可以获得StylesTable
,您可以从中获取所有CellStyle
个对象。 XSSFCellStyle
API有许多方法可以获取颜色对象 - 即XSSFColor
。 XSSFCellStyle
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用于指示单元格中的默认前景色。
(*)在条件格式单元格中,它不会这样做!!