强制只读 Apache POI 中的第一张纸

问题描述 投票:0回答:2

我使用 Apache POI 仅读取 Excel 文件第一张表中的数据。提交的 xlsx 文件通常只有 1 张,大约 2.5MB(数据行数略多于 13 万行),一切进展缓慢但顺利,没有错误。但是,如果提交的 xlsx 包含多个工作表,并且其他工作表中也包含大量数据,则执行会抛出 OutOfMemoryError: Java 堆空间错误。现在我试图弄清楚是否有可能总是只读取第一张纸上的数据而不用担心内存错误(我正在使用 -Xmx1024m -Xms512m 参数运行它)

编辑:这是我的代码

InputStream inputStream = new FileInputStream(new File(excelfile));
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

    if (workbook.getNumberOfSheets() != 1) {
      throw new Exception("Make sure excel only has 1 sheet");
    }

程序在第二行抛出错误(如果 Excel 文件在第二张纸上也有大量数据)

java excel apache apache-poi
2个回答
4
投票

Apache POI通常会触发很多与内存相关的问题,我强烈建议使用monitorjbs代替https://github.com/monitorjbl/excel-streaming-reader

 InputStream is = new FileInputStream(new File(filePath));
                Workbook workbook = StreamingReader.builder()
                        .rowCacheSize(100) // number of rows to keep in memory (defaults to 10)
                        .bufferSize(2048) // buffer size to use when reading InputStream to file (defaults to 1024)
                        .open(is)) {

            Sheet sheet = workbook.getSheetAt(0);

0
投票

您可以覆盖

parseSheet
以忽略不需要的工作表。

final String sheetName = "Sheet1";
XSSFWorkbook wb = new XSSFWorkbook(excelfile) {
    @Override
    public void parseSheet(java.util.Map<String, XSSFSheet> shIdMap, CTSheet ctSheet) {
        if (sheetName.equals(ctSheet.getName())) {
            super.parseSheet(shIdMap, ctSheet);
        }
    }
};

© www.soinside.com 2019 - 2024. All rights reserved.