【问题标题】:How to retrieve the hexadecimal value (like Hex: #E5FFCC) from XSSFColor object如何从 XSSFColor 对象中检索十六进制值(如 Hex:#E5FFCC)
【发布时间】:2019-02-16 00:46:35
【问题描述】:

我正在使用 Apache POI 读取 .xlsx 文件。我想检索单元格背景颜色的十六进制代码。我可以看到打印 rgb 值的功能,但我正在寻找十六进制代码。

Workbook workbook = WorkbookFactory.create(new FileInputStream (new File(SAMPLE_XLSX_FILE_PATH)));
    Sheet sheet = workbook.getSheetAt(0);
    DataFormatter dataFormatter = new DataFormatter();
    for (Row row: sheet) {
        for(Cell cell: row) {
            String cellValue = dataFormatter.formatCellValue(cell);
            XSSFCellStyle cellStyle = (XSSFCellStyle)cell.getCellStyle();
            XSSFColor cellColor = cellStyle.getFillForegroundXSSFColor();
            if(cellValue.equals("sh")){
                System.out.print(cellValue + "\t");
                System.out.println(" cellColor 0: " + cellColor.getRgb()[0]);
                System.out.println(" cellColor 1: " + cellColor.getRgb()[1]);
                System.out.println(" cellColor 2: " + cellColor.getRgb()[2]);
         }
     }

更新:1

正如@Zardo 所建议的:

if(cellValue.equals("sh")){
                System.out.print(cellValue + "\n");
                System.out.println(" cellColor 0: " + cellColor.getRgb()[0]);
                System.out.println(" cellColor 1: " + cellColor.getRgb()[1]);
                System.out.println(" cellColor 2: " + cellColor.getRgb()[2]);
                String hex = String.format("#%02x%02x%02x", cellColor.getRgb()[0],cellColor.getRgb()[1], cellColor.getRgb()[2]);
                System.out.println(hex.toUpperCase());
            }

输出是:

sh
cellColor 0: -1
cellColor 1: -52
cellColor 2: -1
#FFCCFF

我认为它提供的颜色信息不正确。

【问题讨论】:

  • getARGBHex() 方法不能满足您的需求吗?
  • 我使用的是 3.6 版本的 Apache poi。我没有这个方法。你用的是哪个版本@Gagravarr
  • Apache POI 3.6 是古老的,有大量已知的错误,以及一些已知的安全问题!你真的需要尽快更新! POI 3.11 看起来是第一个使用该方法的版本

标签: java excel colors hex apache-poi


【解决方案1】:

您获得该颜色的原因是因为您使用的 getRgb() 函数实际上也返回透明度 (argb)。这个值是第一位的,你只需要考虑数组中的额外值:

if(cellValue.equals("sh")){
    System.out.print(cellValue + "\n");
    System.out.println(" cellColor 0: " + cellColor.getRgb()[0]);
    System.out.println(" cellColor 1: " + cellColor.getRgb()[1]);
    System.out.println(" cellColor 2: " + cellColor.getRgb()[2]);
    System.out.println(" cellColor 3: " + cellColor.getRgb()[3]);
    String hex = String.format("#%02x%02x%02x%02x", cellColor.getRgb()[0],cellColor.getRgb()[1], cellColor.getRgb()[2],cellColor.getRgb()[3]);
    System.out.println(hex.toUpperCase());
}

虽然大多数颜色系统不喜欢额外的十六进制透明度。当您对正确读取颜色感到满意时,可以跳过第一个值或将其删除。如果你想把它变成一个普通的 java.awt.Color,它可能看起来像这样:

Color.decode("0x"+colorHexStr.substring(2, colorHexStr.length()))

此外,您可能会发现XSSFColor cellColor = cellStyle.getFillForegroundXSSFColor(); 出乎意料地给出了空结果。我相信这与在 excel 中编码颜色的不同方案有关。我能够通过以下方式获得颜色:

CTColor ctFillColor=((XSSFCellStyle) cell.getCellStyle()).getFillBackgroundXSSFColor().getCTColor();
byte[] argb=ctFillColor.getRgb();
String hexColor=String.format("#%02x%02x%02x%02x", argb[0],argb[1], argb[2],argb[3]);
System.out.println(hexColor.toUpperCase());

【讨论】:

    【解决方案2】:

    如果您有 RGB 值,您可以将它们转换为十六进制颜色(或者我遗漏了什么?)

    Convert a RGB Color Value to a Hexadecimal

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2014-02-18
      • 2018-11-03
      • 2011-07-12
      相关资源
      最近更新 更多