從Apache POI源代碼抓取XSSFSheetXMLHandler的源代碼;這相當簡單。
我發現克隆這個類來做所有我需要的東西比傳遞一個SheetHandler更有意義。在遇到處理大型XLSX文件的內存問題之前,我能夠實現用戶API完成的所有任務(樣式,顏色,邊框,合併單元格等)。
例如,我對startElement下的「c」處理程序進行了輕微更改。我將XSSFCellStyle保存爲類的一個屬性,然後我可以在cellHandler中使用它。
// c => cell
else if ("c".equals(localName)) {
// Set up defaults.
this.nextDataType = xssfDataType.NUMBER;
this.formatIndex = -1;
this.formatString = null;
cellRef = attributes.getValue("r");
String cellType = attributes.getValue("t");
String cellStyleStr = attributes.getValue("s");
if (stylesTable != null) {
if (cellStyleStr != null) {
int styleIndex = Integer.parseInt(cellStyleStr);
this.cellStyle = stylesTable.getStyleAt(styleIndex);
} else if (stylesTable.getNumCellStyles() > 0) {
this.cellStyle = stylesTable.getStyleAt(0);
}
}
並且(例如,在cellHandler)後使用它:
XSSFFont cellFont = cellStyle.getFont();
if(cellFont.getXSSFColor() != null) {
// set hex colour in style. drop first 2 hex characters since they represent alpha
styles.put(CSS_COLOR, "#"+cellFont.getXSSFColor().getARGBHex().substring(2));
}
合併單元:
else if ("mergeCell".equals(localName)) {
if (attributes.getValue("ref") != null) {
CellRangeAddress cra = CellRangeAddress.valueOf(attributes.getValue("ref"));
// store merged cell ranges in hashmap?
}
}