我正在读取非常大的(150Mb)xlsx文件。我有自己的XSSFSheetXMLHandler.SheetContentsHandler来提取感兴趣的数据。 (它确实执行得很快)。但是,对于每个单元格覆盖的方法
cell(String cellReference, String formattedValue, XSSFComment comment)
只给我单元格的参考和价值。
如何获得应用于此单元格的样式(以及前景填充颜色)? XSSFSheetXMLHandler为我提供了StylesTable数据-所以我知道存在哪些样式,我所没有的就是从每个单元格到StylesTable的任何指针。唯一的解决方案似乎是扩展XSSFSheetXMLHandler,然后开始对SAX解析进行反向工程。
这是唯一的方法吗?
最佳答案
从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?
}
}