使用 poi xssf 和 sax 解析器解析部分 xlsx 文件

parse part of xlsx file using poi xssf and sax parser

我正在尝试读取 excel sheet (.xlsx) 中 100 万条记录中的 10 行:

            FileInputStream myFile = new FileInputStream(file);
            OPCPackage pkg = OPCPackage.open(myFile);
            XSSFReader reader = new XSSFReader(pkg);

            MySheetContentHandler sheetHandler = new MySheetContentHandler();

            StylesTable styles = reader.getStylesTable();
            ReadOnlySharedStringsTable sharedStrings = new ReadOnlySharedStringsTable(pkg);
            ContentHandler handler = new XSSFSheetXMLHandler(styles, sharedStrings, sheetHandler, true);

            XMLReader parser = XMLReaderFactory.createXMLReader();
            parser.setContentHandler(handler);

            parser.parse(new InputSource(reader.getSheetsData().next()));

            pkg.close();

和 MySheetContentHandler:

@Override
public void cell(String cellReference, String formattedValue) {

    getRowList.add(formattedValue);
    if (count == 0) {
        columnsId.add(String.valueOf(columnCount++));
    }

}

@Override
public void endRow() {
    if (myNewList.size() < maxRecord) {
        myNewList.add(getRowList);
    }
}

@Override
public void headerFooter(String arg0, boolean arg1, String arg2) {

}

@Override
public void startRow(int rowNum) {
    getRowList = new ArrayList<String>();
    if (rowNum == 0) {
        count = 0;
    } else {
        count++;
    }
}

当调用方法parser.parse(new InputSource(reader.getSheetsData().next()));时,整个文件都被解析了,需要时间,我只想解析前10行,然后停止解析。

我通过互联网搜索这个问题,我发现最常见的方法是在您的特定条件适用时在内容处理程序中抛出运行时异常。

例如:

@Override
public void startRow(int rowNum) {
    getRowList = new ArrayList<String>();
    if (rowNum == 0) {
        count = 0;
    } else {
        count++;
    }

    if(count > SOME_LIMIT)
    throw new MyParsingTerminationException();
}

那么,你应该在 parse 方法周围捕获这个异常。

try {
     parser.parse(new InputSource(reader.getSheetsData().next()));
} catch (MyParsingTerminationException e) {
     // handle the termination
}