我想一个单元格的前景颜色设置为十六进制代码给定的颜色。 例如,当我尝试将其设置为红色:
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
不管是什么十六进制数值在我的解码功能的参数设置,则getIndexed函数总是返回黑色。
难道说我可能是做错了什么? 我认为这是一个错误,但我不知道...
我想一个单元格的前景颜色设置为十六进制代码给定的颜色。 例如,当我尝试将其设置为红色:
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
不管是什么十六进制数值在我的解码功能的参数设置,则getIndexed函数总是返回黑色。
难道说我可能是做错了什么? 我认为这是一个错误,但我不知道...
好消息是,如果你使用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定义您可以使用这样的方法。
对于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);
使用XSSFColor
为XSSFWorkbook
。 XSSFColor
可以采取byte[] rgb
或java.awt.Color
。 见下面的例子:
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);
看到GuenSeven的答案
XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb cellStyle.setFillForegroundColor(myColor); cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
XSSFCellStyle接受的POI版本以上3.07方法setFillForegroundColor颜色......所以首先检查您的版本,以避免让在我面临...需要短参数以前版本的问题。
我不想使用AWTS颜色,因为没有构造,是专为时下接收的字节数组(我使用的版本3.17):有一个构造函数public XSSFColor(byte[] rgb, IndexedColorMap colorMap)
,是说招对我来说:
byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);