45

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

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

无论我在 decode 函数的参数中设置什么 Hex 值,getIndexed 函数都将始终返回黑色。

会不会是我做错了什么?我认为这是一个错误,但我不确定...

4

6 回答 6

99

好消息是,如果您使用的是 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 定义了您可以使用的方法。

于 2012-06-07T01:19:17.397 回答
32

对于 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);
于 2014-05-06T09:36:21.493 回答
17

用于. XSSFColor_ 可以带或。请参阅以下示例:XSSFWorkbookXSSFColorbyte[] 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);
    
于 2014-12-24T00:19:55.173 回答
2

我不想使用 AWTs Color,并且由于现在没有只接受字节数组的构造函数(我使用的是 3.17 版):有一个构造函数public XSSFColor(byte[] rgb, IndexedColorMap colorMap),这对我有用:

byte[] byteColor = new byte[]{255,0,0};
XSSFColor color = new XSSFColor(byteColor, null);
于 2018-03-23T14:06:27.610 回答
0

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

于 2015-08-20T08:48:48.817 回答
0

您可以使用以下代码从字符串十六进制颜色(FFEEDDCC 或 112233 格式)中获取 XSSFColor。如果您使用的是 RGB,只需删除 # 字符:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFColor color = new XSSFColor(workbook.getStylesSource().getIndexedColors());
color.setARGBHex("#000000".substring(1));
于 2020-03-23T11:40:38.400 回答