java - EXcel 表 POI 验证 : Out Of Memory Error

标签 java jdbc apache-poi jxl

我正在尝试在将其转储到数据库之前使用 java 验证 excel 文件。

这是我的代码片段,它导致错误。

try {
        fis = new FileInputStream(file);
        wb = new XSSFWorkbook(fis);
        XSSFSheet sh = wb.getSheet("Sheet1");
        for(int i = 0 ; i < 44 ; i++){
            XSSFCell a1 = sh.getRow(1).getCell(i);
            printXSSFCellType(a1);
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这是我得到的错误
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.ArrayList.<init>(Unknown Source)
    at java.util.ArrayList.<init>(Unknown Source)
    at org.apache.xmlbeans.impl.values.NamespaceContext$NamespaceContextStack.<init>(NamespaceContext.java:78)
    at org.apache.xmlbeans.impl.values.NamespaceContext$NamespaceContextStack.<init>(NamespaceContext.java:75)
    at org.apache.xmlbeans.impl.values.NamespaceContext.getNamespaceContextStack(NamespaceContext.java:98)
    at org.apache.xmlbeans.impl.values.NamespaceContext.push(NamespaceContext.java:106)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1273)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.stringValue(XmlObjectBase.java:1484)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.getStringValue(XmlObjectBase.java:1492)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTCellImpl.getR(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFCell.<init>(XSSFCell.java:105)
    at org.apache.poi.xssf.usermodel.XSSFRow.<init>(XSSFRow.java:70)
    at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:179)
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:143)
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:130)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:286)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:207)
    at com.xls.validate.ExcelValidator.main(ExcelValidator.java:79)

当 xlsx 文件小于 1 MB 时,这工作得很好。

我明白这是因为我的 xlsx 文件大约 5-10 MB 并且 POI 尝试在 JVM 内存中一次加载整个工作表

什么是可能的解决方法?

请帮忙。

提前致谢!

最佳答案

有两种选择可供您选择。选项 #1 - 增加 JVM 堆的大小,以便 Java 有更多可用内存。使用 UserModel 代码处理 POI 中的 Excel 文件是基于 DOM 的,因此需要将整个文件(包括解析的表单)缓存到内存中。试试 question like this one有关如何增加帮助的建议。

选项 #2,这是更多的工作 - 切换到基于事件 (SAX) 处理。这一次只处理文件的一部分,因此需要的内存要少得多。然而,它需要你做更多的工作,这就是为什么你最好在这个问题上多投入几 GB 的内存——内存很便宜,而程序员不是! SpreadSheet howto page有关于如何对 .xlsx 文件进行 SAX 解析的说明,还有 various example files provided by POI你可以看看咨询。

.

此外,另一件事 - 您似乎正在通过流加载文件,这很糟糕,因为这意味着更多的东西需要缓冲到内存中。见 POI Documentation for more on this ,包括有关如何直接使用文件的说明。

关于java - EXcel 表 POI 验证 : Out Of Memory Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18147585/

相关文章:

java - SGE : Parallel Environment for a multithreaded java code

java - LibGDX 旋转 Sprite 时出现问题

java - 数据库中的数据如何在不同的 Activity 中分配给数组?

java - 从 Java 反编译 ANTLR

java - 无法执行 JDBC 批量更新

java - 使用 POI 将不同的数据类型写入 Excel

java - 在 Glassfish 中将 JDBC 资源配置到连接池

java - java应用程序中无限循环的内存不足和stackoverflow异常

Java Apache 兴趣点

java - 在两个主类之间传递 String 变量,将其传递到 String Array