Как получить шестнадцатеричное значение (например, Hex: # E5FFCC) из объекта XSSFColor - PullRequest
0 голосов
/ 11 сентября 2018

Я использую 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 голосов
/ 01 августа 2019

Причина, по которой вы получаете этот цвет, заключается в том, что используемая вами функция 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());
0 голосов
/ 11 сентября 2018

Если у вас есть значения RGB, вы можете преобразовать их в шестнадцатеричный цвет (или я что-то упустил?)

Преобразование значения цвета RGB в шестнадцатеричное значение

...