Abh*_*ngh 2 java jdbc jxl apache-poi
我试图在将其转储到数据库之前使用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();
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误
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)
Run Code Online (Sandbox Code Playgroud)
当xlsx文件小于1 MB时,这非常适用.
我理解这是因为我的xlsx文件大约是5-10 MB而POI试图在JVM内存中一次加载整个工作表
什么是可能的解决方法?
请帮忙.
提前致谢!
有两种选择.选项#1 - 增加JVM堆的大小,以便Java有更多可用内存.使用UserModel代码在POI中处理Excel文件是基于DOM的,因此需要将整个文件(包括已分析的表单)缓冲到内存中.尝试像这样的问题,获取有关如何增加帮助的建议.
选项#2,更多的工作 - 切换到基于事件(SAX)处理.这一次只处理文件的一部分,因此需要的内存要少得多.但是,它需要你做更多的工作,这就是为什么你可能最好在这个问题上多扔几GB的内存 - 内存很便宜而程序员不是!该电子表格HOWTO页有关于如何做的的.xlsx文件的SAX解析说明,并有通过POI提供的各种示例文件,你可以看看的意见.
.
另外,你似乎是通过流加载文件,这很糟糕,因为它意味着更多的东西需要缓冲到内存中.有关详细信息,请参阅POI文档,包括有关如何直接使用文件的说明.
| 归档时间: |
|
| 查看次数: |
26382 次 |
| 最近记录: |