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