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、具體程式碼跟蹤
<1>問題程式碼
<2>新增程式碼
7、結論:
使用POI寫入excel資料時,如果使用的excel版本是2003,當批量建立過多的樣式(格式)時容易發生單元格丟失問題(這樣操作效能也差勁),所以需要嚴格控制單元格樣式的建立和生成,提前將樣式建立,放入Map中,等用到的時候直接從Map中去,避免了樣式的頻繁建立和單元格樣式丟失問題,大大提升了效能。