来自十六进制代码的Apache POI XSSFColor

Nee*_*ets 36 java apache-poi

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

style.setFillForegroundColor(new XSSFColor(Color.decode("#FF0000")).getIndexed());
Run Code Online (Sandbox Code Playgroud)

无论我在解码函数的参数中设置了什么十六进制值,getIndexed函数将始终返回黑色.

难道我可能做错了吗?我认为这是一个错误,但我不确定......

小智 87

好消息是,如果您使用的是XSSF,而不是HSSF,那么您的问题的解决方案相当容易.您只需将样式变量强制转换为XSSFCellStyle.如果你这样做,那么有一个版本的setFillForegroundColor采用XSSFColor参数,所以你不需要调用getIndexed().这是一些示例代码:

XSSFCellStyle style = (XSSFCellStyle)cell.getCellStyle();
XSSFColor myColor = new XSSFColor(Color.RED);
style.setFillForegroundColor(myColor);
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用HSSF,那么事情就更难了.HSSF使用调色板,它只是一个颜色数组.传递给setFillForegroundColor的short值是调色板的索引.

所以你遇到的问题是将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);
Run Code Online (Sandbox Code Playgroud)

如果要使用默认调色板中尚未使用的自定义颜色,则必须将它们添加到调色板中.HSSFPalette的javadoc定义了可用于执行此操作的方法.

  • 现在不推荐使用新的XSSFColor(Color.RED)。 (2认同)

The*_*Man 23

对于4.0之前的Apache POI,您只需执行以下操作:

 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192));
 cellStyle.setFillForegroundColor(grey);
Run Code Online (Sandbox Code Playgroud)

从POI 4.0开始,您必须提供工作台IndexedColorMap:

 IndexedColorMap colorMap = workbook.getStylesSource().getIndexedColors();
 XSSFColor grey = new XSSFColor(new java.awt.Color(192,192,192), colorMap);
 cellStyle.setFillForegroundColor(grey);
Run Code Online (Sandbox Code Playgroud)

  • 这也有效,并提供了将RGB颜色应用于单元格的简便方法 (4认同)
  • 感谢您的POI 4.0示例。那对我很有帮助。我建议的唯一更改是,您不能添加XSSFColor,而必须添加**。getIndex()**:`cellStyle.setFillForegroundColor(grey.getIndex())` (3认同)
  • 您好,我使用的是 poi 4.0.1,我的 ide 无法识别 workbook.getStylesSource().getIndexedColors() 中的 getStyleSources()。为此你需要什么进口?我正在导入以下内容,但没有运气: import org.apache.poi.xssf.usermodel.XSSFColor; 导入 org.apache.poi.xssf.usermodel.IndexedColorMap; 导入 org.apache.poi.xssf.model.StylesTable; (3认同)
  • 无论您使用什么rgb值,这都会使单元格变黑。 (2认同)

Jon*_*n L 16

使用XSSFColorXSSFWorkbook.XSSFColor可以采取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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 看看GuenSeven的答案

    XSSFColor myColor = new XSSFColor(new java.awt.Color(242, 220, 219)); // #f2dcdb
    cellStyle.setFillForegroundColor(myColor);
    cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
    
    Run Code Online (Sandbox Code Playgroud)