[轉]Java大數據量導出Excel的問題

試共同條件:
數據總數爲110011條,每條數據條數爲19個字段。
電腦配置爲:P4 2.67GHz,1G內存。

1、POI、JXL、FastExcel比較
POI、JXL、FastExcel均爲java第三方開源導出Excel的開源項目。

導出方案一:一次性所有導出到一個Excel文件中。
實際狀況均報OutOfMemery錯誤,如下數據爲報OutOfMemery數據時,數據到的最大數據數目,如表1所示:
表1:報OutOfMemery錯誤時所能處理的數據量 java


FastExecl POI JXL
10000數據/sheet 37465 28996 42270
5000數據/sheet 39096 31487 46270
3000數據/sheet 39000 32493 47860

小結:
多分sheet能必定程度上減小內存的使用,可是均由於程序中建立的Cell(即爲Excel中的一個單元格)沒法釋放,消耗大量內存,致使OutOfMemery錯誤;JXL表現最好,建立Cell內存使用較少。

導出方案二:先分多個Excel文件將數據所有導出,而後對多個Excel文件進行合併。
首先,測試將所有數據導出所用的時間,如表2所示,數據均測試三次取平均。
表2:導出所有數據所用時間 數據庫


FastExecl POI JXL
10000數據/文件 68s 33s 30s
5000數據/文件 68s 32s 33s
3000數據/文件 59s 33s 39s

小結:
均成功導出Excel文件,緣由是導出一個Excel文件,釋放所佔用的建立Cell的內存。
FastExecl表現最差,POI表現穩定,JXL隨着數據的增大,速度必定程度上增快。

而後,進行整合,因爲將多Excel合併成一個Excel文件的功能只有POI全部,故使用POI測試,結果如表3所示。
注:數據量大合併還會報OutOfMemery錯誤,故合併總數據量以5萬爲準。
表3:合併5萬數據所用時間 測試


時間
10000數據/文件 11s
5000數據/文件 11s
3000數據/文件 11s

小結:
使用POI對文件進行合併速度較快,但有數據量的限制。

總結:方案二比較可行,可是數據量有限制,爲5萬條。

2、導出XML 的電子表格
導出的格式相似爲純文本,能實現大數據量的存儲,並能實現分Sheet查看,且能添加簡單的樣式,符合項目要求。經實際測試Excel2003和Excel2007均能識別並正常打開查看。使用時間測試如表4所示,數據均測試3次取平均。
表4:生成所有數據所用時間 大數據


時間
10000數據/sheet 28.0秒
20000數據/sheet 30.1秒
30000數據/sheet 28.1秒
40000數據/sheet 26.5秒
50000數據/shee 28.2秒
55000數據/sheet 26.8秒
59000數據/sheet 30.1秒
59500數據/sheet 發生假死機現象
60000數據/sheet 發生假死機現象


可是導出的數據爲XML不是純正的Excel文件,如使用Excel文件的xls後綴保存,打開文件會彈出警告,但不影響閱讀。
且經實際測試,在Access2007和Access2003中可經過導入外部數據的方式,將導出的XML導入進Access數據庫。

3、總結
項目要求是大數據量導出Excel文件,POI、JXL、FastExcel不能徹底知足要求;使用XML 的電子表格導出實現了大數據量導出,可是格式爲XML不是純正的Excel文件,爲曲線救國。兩種導出形式的比較,如表5所示。
表5:合併5萬數據所用時間 圖片


POI、JXL、FastExcel XML 的電子表格
導出數據格式 爲純Execl文件 爲XML文件
導出數據量 較大
可否分Sheet
可否添加樣式
可否添加圖片 POI 能 不能
導出數據可否導入Access
相關文章
相關標籤/搜索