試共同條件:
數據總數爲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 | 能 | 能 |