敏捷是一條很長的路,摸索著前進著
最近項目中要將較大數(shù)據(jù)生成Excel2003或Excel2007文件。
由于POI很好的采用了面向接口編程的思想,所以其實生成Excel2003和生成Excel2007的代碼多數(shù)是可以復(fù)用的。
我的做法是:
1.定義Excel2003FileCreator,用來生成Excel2003文件
2.定義Excel2007FileCreator,用來生成Excel2007文件,Excel2007FileCreator extends Excel2003FileCreator。
在Excel2003FileCreator中定義
protected org.apache.poi.ss.usermodel.Workbook workbook;
protected org.apache.poi.ss.usermodel.Sheet sheet;
private org.apache.poi.ss.usermodel.Row row
Workbook,Sheet ,Row均為接口。
只要在生成workbook時,確定是
org.apache.poi.hssf.usermodel.HSSFWorkbook // 生成Excel2003文件用
還是
org.apache.poi.xssf.usermodel.XSSFWorkbook // 生成Excel2007文件用
即可。
后續(xù)的Sheet,Row 都是根據(jù) workbook 創(chuàng)建的。
問題的出現(xiàn):
在對每一個Cell進行設(shè)置Style和Value的時候,我先根據(jù)DB中的配置,取得每個單元格的格式,再對其進行設(shè)定值。
再進行設(shè)置其他單元格格式。
只列實現(xiàn)代碼:
取得的Style,再調(diào)用Cell對象的 cell.setCellStyle(Style) 進行設(shè)置格式。
因為這段代碼是生成Excel2003和Excel2007時候都要用到的。
生成1w的數(shù)據(jù),Excel2003是沒有問題的,速度很快。
但是同樣的數(shù)據(jù),生成Excel2007時,速度慢的可以,讓人不能接受。
最后調(diào)查得出的結(jié)果是:瓶頸在于org.apache.poi.xssf.usermodel.XSSFWorkbook 在生成字體和樣式對象時。
問題的解決:
由于對于文件體的單元格設(shè)置,每一列幾乎是相同的。所以將生成字體和單元格樣式的代碼做了一些小調(diào)整:
這樣改了之后,速度立刻提高了。
當然,在用完之后,記得clear。
這里要注意的是,緩存HashMap對象中的Key的設(shè)定。
Key在組合時要體現(xiàn)出你的單元格格式,又不會因為組合,使得緩存中對象混亂了。 本文為原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處BlogJava。
Powered by: BlogJava Copyright © 李 明