我正在读取非常大的(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?
            }
        }

08-27 09:50