我正在使用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
我认为它不能提供正确的颜色信息。
答案 0 :(得分:0)
如果您具有RGB值,则可以将其转换为十六进制颜色(或者我缺少什么?)
答案 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());