最近項目中要將較大數據生成Excel2003或Excel2007文件。
由于POI很好的采用了面向接口編程的思想,所以其實生成Excel2003和生成Excel2007的代碼多數是可以復用的。
我的做法是:
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文件用
即可。
后續的Sheet,Row 都是根據 workbook 創建的。
問題的出現:
在對每一個Cell進行設置Style和Value的時候,我先根據DB中的配置,取得每個單元格的格式,再對其進行設定值。

2

3

4

5

6

7

8

9

10

11

12

再進行設置其他單元格格式。
只列實現代碼:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

取得的Style,再調用Cell對象的 cell.setCellStyle(Style) 進行設置格式。
因為這段代碼是生成Excel2003和Excel2007時候都要用到的。
生成1w的數據,Excel2003是沒有問題的,速度很快。
但是同樣的數據,生成Excel2007時,速度慢的可以,讓人不能接受。
最后調查得出的結果是:瓶頸在于org.apache.poi.xssf.usermodel.XSSFWorkbook 在生成字體和樣式對象時。
問題的解決:
由于對于文件體的單元格設置,每一列幾乎是相同的。所以將生成字體和單元格樣式的代碼做了一些小調整:

2

3

4

5

6

7

8

9

10

11

12

13

14

取得樣式

2

3

4


5

6

7

8

這樣改了之后,速度立刻提高了。
當然,在用完之后,記得clear。
這里要注意的是,緩存HashMap對象中的Key的設定。
Key在組合時要體現出你的單元格格式,又不會因為組合,使得緩存中對象混亂了。
本文為原創,歡迎轉載,轉載請注明出處BlogJava。