天天看點

【poi】解決java導出excel 海量資料記憶體溢出問題

由于項目中有導出海量資料的需求,在谷歌和百度也沒有找到好的解決辦法,經過仔細研究發現poi-3.8版本以上提供新的模式可以滿足這個需求,寫在這裡希望能對有同樣需求的同行們有所幫助。

以下是測試代碼:

将工程打包成jar到C:,然後用指令行java -jar -Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M test.jar hssf 執行,在指令行視窗輸出到45000之後,輸出明顯減慢,

很快輸出如下異常:

5028850289502905029150292Exception in thread “main” java.lang.reflect.InvocationTargetExceptionat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:585)at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)Caused by: java.lang.OutOfMemoryError: Java heap space

繼續用指令行java -jar -Xms128m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M test.jar sxssf執行,

指令行視窗輸出速度一直保持不變,直到循環完了,并最終生成四十多M的excel—sxssf.xlsx

總結來說,這段代碼,我看了N久才看到樓主的意思。就是說 運作hssf.java就會記憶體溢出,是以換了個實作方式, 運作sxssf.java就ok了。是以解決方法就是參照sxssf這個類了。