JAVA POI產生xlsx檔案時,跨Workbook共用物件(如CellStyle)造成Excel提示檔案需修復
編輯日期:2025-04-29
發布日期:2025-04-29
軟體開發
JAVA

前些時間工作上有遇到客戶下載下來的xlsx報表檔案用Excel開啟會跳提示

Xlsx fail alert

在查了許久之後,發現是使用POI設定的儲存格樣式的問題,具體是這樣的:

首先POI會建立Workbook(xlsx檔案),而其中.createSheet().createCellStyle().createDataFormat()等方法是針對建立的Workbook,是不能跨Workbook使用的,所以每次建新的Workbook的時候樣式之類的東西都需要重建一次,不過建過的樣式可以在同一份Excel文件內重複去套用。


簡單來說問題和解決方法就上面那樣,來說說當時是怎麼排查的好了。

xlsx檔案其實是可以用壓縮軟體開啟,每個Sheet路徑存放在xl/worksheets底下的xml檔,其中指定的樣式會在欄位<c>裡面以s="xxx"的方式指向特定ID的Style。也就是對應xl底下的styles.xml內的<cellXfs>內的內容。

排查的時候便是把幾項可疑的內容依序移除看看會不會移除後就能正常開啟,結果在s="xxx"這項移除的時候就找到問題了,後續就回頭找到上面的問題與解法。