如何从XSSFColor对象检索十六进制值(如Hex:#E5FFCC)

时间:2018-09-11 13:33:39

标签: java excel colors hex apache-poi

我正在使用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

enter image description here

enter image description here

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

2 个答案:

答案 0 :(得分:0)

如果您具有RGB值,则可以将其转换为十六进制颜色(或者我缺少什么?)

Convert a RGB Color Value to a Hexadecimal

答案 1 :(得分:0)

获得该颜色的原因是因为您使用的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());