Java的Apache POI

我正在从excel文档中读取数据,每两周更新大约50,000行数据,在开始新表之前可能会达到约12万。 我正在使用Apache POI来获取数据。 我在下面得到这个例外,但我相信最重要的一个例外是由:java.lang.OutOfMemoryError:Java堆空间。 我已经testing了我的代码,使用更less的数据在不同的Excel表单上,并且能够读取数据。

如果您有任何关于如何阅读大型Excel文档的方法或build议,请分享。

org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:456) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461) at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:162) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:271) at excelreader.readExcelFile(excelreader.java:28) at excelreader.main(excelreader.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60) ... 13 more Caused by: java.lang.OutOfMemoryError: Java heap space at org.apache.xmlbeans.impl.store.Cur.createElementXobj(Cur.java:260) at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.startElement(Cur.java:2995) at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3207) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1822) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362) at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4678) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400) at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714) at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3454) at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1276) at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1263) at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345) at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotCacheRecords$Factory.parse(Unknown Source) at org.apache.poi.xssf.usermodel.XSSFPivotCacheRecords.readFrom(XSSFPivotCacheRecords.java:62) at org.apache.poi.xssf.usermodel.XSSFPivotCacheRecords.<init>(XSSFPivotCacheRecords.java:53) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:60) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:456) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461) at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:461) at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:162) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:271) at excelreader.readExcelFile(excelreader.java:28) at excelreader.main(excelreader.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

1.在java中解决OutOfMemoryError的一个简单方法是通过使用JVM选项"-Xmx512M"来增加最大堆大小,这将立即解决你的OutOfMemoryError问题。

Java虚拟机(JVM)以固定的较高内存限制运行,您可以通过此限制修改:

 -Xms<size> - Set initial Java heap size -Xmx<size> - Set maximum Java heap size $ java -Xms512m -Xmx1024m JavaApp 

2.解决Java中OutOfMemoryError的第二种方法相当困难,当你没有太多的内存时,甚至在增加最大堆大小之后,你仍然得到java.lang.OutOfMemoryError,在这种情况下,你可能想要分析你的应用程序,寻找任何内存泄漏。

所以要检查内存任务,你可以使用一些工具。没有它,它是非常困难的。 一些stream行的是:

Jmap是一个JDK6自带的命令行实用程序,可以让你在一个文件中进行堆内存转储。 这很容易使用下面的shwon:

jmap -dump:format = b,file = heapdump 6054

Eclipse内存分析器(MAT)
是从Eclipse基础分析Java堆转储的工具。 它有助于find类加载器泄漏和内存泄漏,并有助于最大限度地减less内存消耗。您可以使用MAT分析堆转储携带数百万的对象,它也可以帮助您提取内存泄漏的嫌疑。

这确实与堆大小有关。 我把它设置为2克,仍然出现内存错误。 我正在使用的excel文档是在一个数据透视表中,这是Apache POI的限制。 这导致了第一个例外

尝试java.exe -Xmx512m -jar yourjar.jar

它会将最大堆大小设置为512 MB。 或者如果512不够,请尝试更大的值。