簡體   English   中英

使用Apache POI獲取Excel填充顏色

[英]Getting Excel fill colors using Apache POI

我正在使用Apache POI 3.17來閱讀Excel 2013工作簿。 用戶直接在Excel中創建和編輯工作簿。 然后我運行一個Java 8程序,它使用POI來讀取和處理工作簿。

有些單元格是彩色編碼的,所以我需要獲得填充顏色。 在許多情況下,這種方法很好,但有一組灰色/銀色的顏色不起作用,我不確定為什么。

例如,Excel單元格如下所示:

Excel示例

我獲取填充顏色的代碼是:

private String getFillColor(XSSFCell cell) {
    String fColorString = "None";
    if (cell != null) {
        XSSFCellStyle cellStyle = cell.getCellStyle();

        short sColorFore = cellStyle.getFillForegroundColor();
        short sColorBack = cellStyle.getFillBackgroundColor();
        XSSFColor xColorFore =  cellStyle.getFillForegroundColorColor();
        XSSFColor xColorBack =  cellStyle.getFillBackgroundColorColor();

        String s = "";
        s += " indexFore=" + sColorFore;
        s += " indexBack=" + sColorBack;
        s += " colorFore=" + ((xColorFore == null) ? "Null" : xColorFore.getARGBHex());
        s += " colorBack=" + ((xColorBack == null) ? "Null" : xColorBack.getARGBHex());
        System.out.println("Cell=" + cell.getAddress() + " " + cell.getStringCellValue() + s);

        if (xColorFore != null) {
            fColorString = xColorFore.getARGBHex();
        }8
    }
    return fColorString;
}

調用上面每個示例Excel單元格時的結果是:

Cell = BBH52 Pink indexFore = 0 indexBack = 64 colorFore = FFF79646 colorBack = null

Cell = BBH53無填充indexFore = 64 indexBack = 64 colorFore = Null colorBack = Null

Cell = BBH54 Gray 1 indexFore = 0 indexBack = 64 colorFore = FFFFFFFF colorBack = null

Cell = BBH55 Gray 2 indexFore = 0 indexBack = 64 colorFore = FFFFFFFF colorBack = null

Cell = BBH56 Gray 3 indexFore = 0 indexBack = 64 colorFore = FFFFFFFF colorBack = null

Cell = BBH57 Gray 4 indexFore = 0 indexBack = 64 colorFore = FFFFFFFF colorBack = null

Cell = BBH58 Gray 5 indexFore = 0 indexBack = 64 colorFore = FFFFFFFF colorBack = null

Cell = BBH59白色indexFore = 0 indexBack = 64 colorFore = FFFFFFFF colorBack = null

知道為什么灰色和白色的陰影都轉換為FFFFFFFF的十六進制值? 是否有更正確的方法來訪問實際的填充顏色? 謝謝。

“Excel 2013工作簿”是以Office Open XML格式存儲的工作簿。 那里的顏色可能有額外的第4個alpha通道,但也可能有ColorType.Tint屬性集。 實際上所有灰色陰影都是具有不同tint設置的RGB白色FFFFFF 例如,在xl/styles.xmlGrey 1是:

...
<fill>
 <patternFill patternType="solid">
  <fgColor theme="0" tint="-0.0499893185216834"/>
  <bgColor indexed="64"/>
 </patternFill>
</fill>
...

主題顏色0是白色FFFFFFtint -0.0499893185216834變暗,白色變為灰色。

所以我們必須考慮tint Fortunaltely apache poiExtendedColor為此提供了方法getRGBWithTint

因此,如果它們具有tint集,則以下示例也正確獲取填充顏色:

import java.io.FileInputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.hssf.util.HSSFColor;

public class ReadExcelColorHavingTint {

 private static String getFillColorHex(Cell cell) throws Exception { 
  String fillColorString = "none";
  if (cell != null) {
   CellStyle cellStyle = cell.getCellStyle();
   Color color =  cellStyle.getFillForegroundColorColor();
   if (color instanceof XSSFColor) {
    XSSFColor xssfColor = (XSSFColor)color;
    byte[] argb = xssfColor.getARGB();
    fillColorString = "[" + (argb[0]&0xFF) + ", " + (argb[1]&0xFF) + ", " + (argb[2]&0xFF) + ", " + (argb[3]&0xFF) + "]";
    if (xssfColor.hasTint()) {
     fillColorString += " * " + xssfColor.getTint();
     byte[] rgb = xssfColor.getRGBWithTint();
     fillColorString += " = [" + (argb[0]&0xFF) + ", " + (rgb[0]&0xFF) + ", " + (rgb[1]&0xFF) + ", " + (rgb[2]&0xFF) + "]" ;
    }
   } else if (color instanceof HSSFColor) {
    HSSFColor hssfColor = (HSSFColor)color;
    short[] rgb = hssfColor.getTriplet();
    fillColorString = "[" + rgb[0] + ", " + rgb[1] + ", "  + rgb[2] + "]";
   }
  }
  return fillColorString;
 }

 public static void main(String[] args) throws Exception {
  Workbook workbook = WorkbookFactory.create(new FileInputStream("workbook.xlsx"));
  //Workbook workbook = WorkbookFactory.create(new FileInputStream("workbook.xls"));
  Sheet sheet = workbook.getSheetAt(0);
  for (Row row : sheet) {
   for (Cell cell : row) {

    System.out.println("Cell=" + cell.getAddress() + " " + cell.toString() + " " + getFillColorHex(cell));

   }
  }
 }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM