試共同條件:
數據總數為110011條,每條數據條數為19個字段。
電腦配置為:P4 2.67GHz,1G內存。
一、POI、JXL、FastExcel比較
POI、JXL、FastExcel均為java第三方開源導出Excel的開源項目。
導出方案一:一次性全部導出到一個Excel文件中。
實際情況均報OutOfMemery錯誤,以下數據為報OutOfMemery數據時,數據到的最大數據數目,如表1所示:
表1:報OutOfMemery錯誤時所能處理的數據量
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萬條。
二、導出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數據庫。
三、總結
項目要求是大數據量導出Excel文件,POI、JXL、FastExcel不能完全滿足要求;使用XML 的電子表格導出實現了大數據量導出,但是格式為XML不是純正的Excel文件,為曲線救國。兩種導出形式的比較,如表5所示。
表5:合並5萬數據所用時間
POI、JXL、FastExcel | XML 的電子表格 | |
導出數據格式 | 為純Execl文件 | 為XML文件 |
導出數據量 | 小 | 較大 |
能否分Sheet | 能 | 能 |
能否添加樣式 | 能 | 能 |
能否添加圖片 | POI 能 | 不能 |
導出數據能否導入Access | 能 | 能 |