http://lqw.iteye.com/blog/525982
測試共同條件:
資料總數為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資料/sheet 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 能 能