我想将单元格的前景色设置为十六进制代码中的给定颜色。例如,当我尝试将其设置为红色:十六进制代码中的Apache POI XSSFColor
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
不管是什么十六进制数值在我的解码功能的参数设置,则getIndexed函数总是返回黑色。
难道是我可能做错了什么?我认为这是一个错误,但我不确定...
我想将单元格的前景色设置为十六进制代码中的给定颜色。例如,当我尝试将其设置为红色:十六进制代码中的Apache POI XSSFColor
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(),是合乎逻辑的,但是,不幸的是,它可以像你想象的那样为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
为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);
我无法使用.setFillForegroundColor(myColor);我该怎么办? – meme
@meme,升级到poi 3.0.7或更高版本,我使用3.10版本 –
在POI以上版本3.07方法setFillForegroundColor XSSFCellStyle接受的颜色......所以检查您的版本首先要避免出现问题I正面临......以前的版本需要短暂的参数。
你为什么需要getIndexed()?为了向后兼容?尝试删除。 – gtiwari333
如果将样式应用于单元格,它在Excel中是否正确显示为红色? – Gagravarr
我需要getindexed,因为该方法将只接受短期值。 – Neets