Apache的POI XSSFColor从十六进制代码(Apache POI XSSFColor f

2019-06-25 06:22发布

我想一个单元格的前景颜色设置为十六进制代码给定的颜色。 例如,当我尝试将其设置为红色:

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

不管是什么十六进制数值在我的解码功能的参数设置,则getIndexed函数总是返回黑色。

难道说我可能是做错了什么? 我认为这是一个错误,但我不知道...

Answer 1:

好消息是,如果你使用XSSF,而不是HSSF,然后解决你的问题是相当容易的。 您只需你的风格变量转换为XSSFCellStyle。 如果这样做,那么有setFillForegroundColor的一个版本,它接受一个XSSFColor参数,所以你不需要调用getIndexed()。 下面是一些示例代码:

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

但是,如果您使用的是HSSF,那么事情更难。 HSSF使用一个调色板,这是一个简单的颜色阵列。 您传递到setFillForegroundColor短值是一个索引调色板。

所以,你的问题是转换的RGB值转换为调色板索引。 该解决方案建议您使用getIndexed(),是合乎逻辑的,但是,unfortuntately,但它确实工作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定义您可以使用这样的方法。



Answer 2:

对于Apache POI 4.0以前,你可以简单地做到以下几点:

 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);


Answer 3:

使用XSSFColorXSSFWorkbookXSSFColor可以采取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); 


Answer 4:

XSSFCellStyle接受的POI版本以上3.07方法setFillForegroundColor颜色......所以首先检查您的版本,以避免让在我面临...需要短参数以前版本的问题。



Answer 5:

我不想使用AWTS颜色,因为没有构造,是专为时下接收的字节数组(我使用的版本3.17):有一个构造函数public XSSFColor(byte[] rgb, IndexedColorMap colorMap) ,是说招对我来说:

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


文章来源: Apache POI XSSFColor from hex code