gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:33:00 24 4
gpt4 key购买 nike

我正在尝试在将其转储到数据库之前使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com