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