1. 程式人生 > >POI操作EXCEL出現的單元格格式丟失問題的解決方案

POI操作EXCEL出現的單元格格式丟失問題的解決方案

1、問題截圖:

2、問題分析:

在網上找過一些答案,都說是excel2003版本的問題,對單元格的樣式有限制。當時公司沒有網路,也不能查詢到更多的資料、

後經過領導批准找到另外的資料圖:

3、執行測試:

<1> 針對單個SHEET和多個SHEET兩種情況,執行批量寫入,檢視在多少資料量時會發生格式丟失異常。

分析結果:執行單個SHEET寫入,資料總行數超過5000行就會出現格式丟失;多個SHEET寫入,資料總行超過2500行會出現格式丟失。

<2>  針對出現格式丟失的SHEET,再次執行該SHEET的寫入,檢視是否是由於SHEET本身引起的問題。

分析結果:未發現異常,格式全部正確。

<3>  手動修改生成的EXCEL的單元格格式,檢視資料是否可以回覆正常。

分析結果:經過手動格式刷重新整理,單元格格式恢復正常,資料也恢復正常。

4、最後討論結果

EXCEL本身確實對同一種樣式的單元格寫入有數量的限制。若使用者工作簿中存在著4000種以上的單元格格式組合,那麼在執行許多命令時(包括排序),Excel都會提示“不同的單元格格式太多”。

這裡的單元格格式組合,指工作簿中任意單元格,若所設定的單元格格式與其他單元格有任何細微的差別,即成為一種單元格格式組合。例如,有兩個單元格,都設定單元格格式為紅色宋體12號字,若其中一個單元格的數字格式使用2位小數,而另一個單元格的資料格式不使用小數,則兩個單元格各使用一種單元格格式組合。

但經過多次不同形式的測試我們發現儘管EXCEL有諸多格式限制,但其本身只是一個數據的載體不負責資料的寫入,寫入的過程是我們使用POI框架完成的操作。其單元格的樣式也是通過POI框架構建並寫入的,如果我們可以在寫入時控制單元格樣式的建立,應該可以解決這個問題

5、解決方式

通過觀察彙總流程和程式碼,現在源系統中的資料寫入功能執行無誤,但效能不佳。且存在單元格格式頻繁建立的弊端,源系統建立的單元格樣式是跟隨單元格的建立而生成的,假設1張表有10行資料,10列,那麼建立單元格樣式就要重複執行100次,效率十分低,並且會導致“單元格丟失”問題的出現。通過分析,我們得知系統已規範了excel中的單元格格式總計

6種分別是常規型別、會計專用、整數、日期yyyy-mm、日期yyyy-mm-dd、百分比。所以我們可以提前的建立好這六種單元格樣式,在不同的單元格使用時直接呼叫就可以,避免了樣式的批量建立,不僅避免了單元格丟失異常,還大大提升了效能。通過優化子系統部分程式碼,將單元格樣式提前建立放入HashMap中,到使用時直接呼叫。測試結果顯示問題未出現,單元格格式未丟失,資料正確。

6、具體程式碼跟蹤

<1>問題程式碼

<2>新增程式碼

7、結論:

使用POI寫入excel資料時,如果使用的excel版本是2003,當批量建立過多的樣式(格式)時容易發生單元格丟失問題(這樣操作效能也差勁),所以需要嚴格控制單元格樣式的建立和生成,提前將樣式建立,放入Map中,等用到的時候直接從Map中去,避免了樣式的頻繁建立和單元格樣式丟失問題,大大提升了效能。