java - 强制只读 Apache POI 中的第一张表

标签 java excel apache apache-poi

我使用 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 文件在第二张表上也有大量数据)

最佳答案

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);

关于java - 强制只读 Apache POI 中的第一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42993196/

相关文章:

vba - 返回代码似乎不会影响函数行为

apache - 将 SSL 添加到我的网站

java - 当您在 session 中存储对象并在新部署后尝试访问它时,捕获 ClassCastException 吗?

java - 根据初始化数据结构的方式,我在 Java 中得到不同的行为

vba - VBA 右键粘贴问题

mysql - Excel删除小数

ajax - 为 Laravel Ajax 调用打开 GZip

php - VPS、Apache MySql 和 phpMyadmin 错误

java - 我自己的代码与库

java - 如何构建 HQL 查询,即自动连接标记为 LAZY 的子表?