来自hex代码的Apache POI XSSFColor

我想以hex代码将单元格的前景色设置为给定的颜色。 例如,当我尝试将其设置为红色时:

style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed()); 

无论我在解码函数的参数中设置了什么hex值,getIndexed函数将始终返回黑色。

难道我可能做错了吗? 我认为这是一个错误,但我不确定……

好消息是,如果您使用的是XSSF,而不是HSSF,那么您的问题的解决方案相当容易。 您只需将样式变量强制转换为XSSFCellStyle。 如果你这样做,那么有一个版本的setFillForegroundColor采用XSSFColor参数,所以你不需要调用getIndexed()。 这是一些示例代码:

 XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle(); XSSFColor myColor = new XSSFColor(Color.RED); style.setFillForegroundColor(myColor); 

但是,如果您使用HSSF,那么事情就更难了。 HSSF使用调色板,它只是一个颜色数组。 传递给setFillForegroundColor的short值是调色板的索引。

所以你遇到的问题是将rgb值转换为调色板索引。 您使用getIndexed()提出的解决方案是合乎逻辑的,但是,不幸的是,它确实适用于XSSFColor的方式。

幸运的是,有一个解决方案。 目前,让我们假设您将使用默认调色板中的一种颜色,而不是使用自定义颜色。 在这种情况下,您可以使用HSSFPalette和HSSFColor类来解决问题。 这是一些示例代码:

 HSSFWorkbook hwb = new HSSFWorkbook(); HSSFPalette palette = hwb.getCustomPalette(); // get the color which most closely matches the color you want to use HSSFColor myColor = palette.findSimilarColor(255, 0, 0); // get the palette index of that color short palIndex = myColor.getIndex(); // code to get the style for the cell goes here style.setFillForegroundColor(palIndex); 

如果要使用默认调色板中尚未使用的自定义颜色,则必须将它们添加到调色板中。 HSSFPalette的javadoc定义了可用于执行此操作的方法。

XSSFColor用于XSSFWorkbookXSSFColor可以使用byte[] rgbjava.awt.Color 。 见下面的例子:

  1.  XSSFWorkbook wb = new XSSFWorkbook(); XSSFCellStyle cellStyle = wb.createCellStyle(); byte[] rgb = new byte[3]; rgb[0] = (byte) 242; // red rgb[1] = (byte) 220; // green rgb[2] = (byte) 219; // blue XSSFColor myColor = new XSSFColor(rgb); // #f2dcdb cellStyle.setFillForegroundColor(myColor); cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
  2. 看看GuenSeven的回答

     XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb cellStyle.setFillForegroundColor(myColor); cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 

对于4.0之前的Apache POI,您只需执行以下操作:

  XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192)); cellStyle.setFillForegroundColor(grey); 

从POI 4.0开始,您必须提供工作台IndexedColorMap:

  IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors(); XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192), colorMap); cellStyle.setFillForegroundColor(grey); 

XSSFCellStyle接受方法setFillForegroundColor中的颜色,以便poi版本高于3.07 …所以首先检查你的版本以避免遇到我面临的问题…以前的版本需要简短作为参数。

我不想使用AWTs Color,因为现在没有构造函数只接受一个字节数组(我使用的是版本3.17):有一个构造函数public XSSFColor(byte[] rgb, IndexedColorMap colorMap) ,我的诀窍:

 byte[] byteColor = new byte[]{(byte)255,0,0}; XSSFColor color = new XSSFColor(byteColor, null);