【问题标题】:Apache POI XSSFColor from hex code来自十六进制代码的 Apache POI XSSFColor
【发布时间】:2012-06-10 08:55:56
【问题描述】:

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

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

无论我在decode函数的参数中设置什么Hex值,getIndexed函数总是返回黑色。

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

【问题讨论】:

  • 为什么需要getIndexed()?为了向后兼容??尝试删除它。
  • 如果将样式应用于单元格,它在 Excel 中是否正确显示为红色?
  • 我需要 getindexed 因为该方法只接受一个短值。

标签: java apache-poi


【解决方案1】:

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

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFColor color = new XSSFColor(workbook.getStylesSource().getIndexedColors());
color.setARGBHex("#000000".substring(1));

【讨论】:

    【解决方案2】:

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

    byte[] byteColor = new byte[]{255,0,0};
    XSSFColor color = new XSSFColor(byteColor, null);
    

    【讨论】:

      【解决方案3】:

      对于 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);
      

      【讨论】:

      • 这也有效,并且提供了将 RGB 颜色应用于单元格的简单方法
      • 请注意,由于对 AWT 类的依赖,这可能会破坏您的服务器,并且服务器可能是无头的。还没查。
      • 感谢 POI 4.0 示例。这对我帮助很大。我建议的唯一更改是,您不能添加 XSSFColor,但必须添加 .getIndex()cellStyle.setFillForegroundColor(grey.getIndex())
      • 无论您使用什么 rgb 值,这都会使单元格变黑。
      • 您好,我使用的是 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;
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        XSSFColor 用于XSSFWorkbookXSSFColor 可以使用 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);
          
        2. 见 GuenSeven 的回答

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

        【讨论】:

        • 我无法使用 .setFillForegroundColor(myColor);我该怎么办?
        • @meme,升级到poi 3.0.7或更高版本,我用的是3.10版本
        【解决方案6】:

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

        【讨论】:

        • 我使用的是 XSSF,所以第一个解决方案成功了。非常感谢!
        • 这个palette.findSimilarColor(255, 0, 0); 把我从疯狂中救了出来。太感谢了。当然赞成。
        • 在我从工作簿创建样式而不是像下面的@JonathanL 答案那样从单元格中获取样式之前,上面的代码不起作用
        • 新的 XSSFColor(Color.RED) 现已弃用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        相关资源
        最近更新 更多