使用XSSFSheetXMLHandler获取样式信息

时间:2016-10-27 11:58:19

标签: java apache-poi xssf

我正在阅读非常大的(150Mb)xlsx文件。我有自己的XSSFSheetXMLHandler.SheetContentsHandler来提取感兴趣的数据。 (它确实快速执行)。但是,对于每个单元格,重写方法

cell(String cellReference, String formattedValue, XSSFComment comment)

只获取单元格引用和值。

如何将样式(以及前景填充颜色)应用于此单元格? XSSFSheetXMLHandler为我提供了StylesTable数据 - 所以我知道存在哪些样式,所有我都没有是从每个单元格到StylesTable的任何指针。唯一的解决方案似乎是扩展XSSFSheetXMLHandler,然后开始逆向工程SAX解析。

这是唯一的方法吗?

1 个答案:

答案 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?     
            }
        }