我想将单元格的前景色设置为十六进制代码中的给定颜色。例如,当我尝试将其设置为红色时:
style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
无论我在解码函数的参数中设置了什么十六进制值,getIndexed函数将始终返回黑色。
难道我可能做错了吗?我认为这是一个错误,但我不确定......
答案 0 :(得分:83)
好消息是,如果您使用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定义了可用于执行此操作的方法。
答案 1 :(得分:19)
对于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);
答案 2 :(得分:15)
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);
答案 3 :(得分:1)
您可以使用以下代码从String十六进制颜色(FFEEDDCC或112233格式)获取XSSFColor。如果您使用的是RGB,只需删除#个字符:
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFColor color = new XSSFColor(workbook.getStylesSource().getIndexedColors());
color.setARGBHex("#000000".substring(1));
答案 4 :(得分:0)
XSSFCellStyle接受方法setFillForegroundColor中的颜色,以便poi版本高于3.07 ...所以请先检查你的版本以避免遇到我面临的问题......以前的版本需要简短作为参数。
答案 5 :(得分:0)
我不想使用AWTs Color,因为现在没有构造函数只接受字节数组(我使用版本3.17):有一个构造函数public XSSFColor(byte[] rgb, IndexedColorMap colorMap)
,为我做了诀窍:
byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);