PHP_XLSXWriter 處理長數字(超過 15 位)時的顯示異常問題
Contents
使用 PHP_XLSXWriter 匯出大數字到 Excel 時,如果欄位內容超過 15 位,常常會出現看起來像自動進位的狀況。這個問題第一次遇到時很容易誤判成程式匯出錯誤,但很多時候真正有問題的其實不是 PHP,而是 Excel 的數值表示方式。
問題長什麼樣子
例如原本資料是:
|
|
程式內部看起來是正確的,但 Excel 開啟後可能會變成:
|
|
如果這個欄位是會員編號、訂單號、條碼或身分識別碼,就會很麻煩,因為這些資料本來就不該被當成可運算數值。
為什麼會這樣
Excel 對數值精度本來就有限制。超過 15 位的數字,Excel 會以浮點數方式處理,因此後面的位數可能被捨去或改寫。
所以這不是 PHP_XLSXWriter 特有的 bug,而是 Excel 的既有行為。
實務上的解法
如果這個欄位本質上只是識別碼,不需要拿來做加減乘除,最穩的方式就是強制讓 Excel 把它當成字串。
可以改成這樣輸出:
|
|
利用公式返回字串,Excel 就比較不會把它當成一般數值處理。
什麼時候該這樣做
下面這些欄位我通常都會優先當字串匯出:
- 訂單編號
- 條碼號碼
- 身分識別碼
- 超長流水號
- 前面可能有 0 的資料
因為這些值的重點是「原樣保留」,不是做數學運算。
注意事項
1. 程式內也最好用字串保存
如果資料在 PHP 端就已經被當成數值型別處理,可能在匯出前就先失真了。這類欄位建議從資料來源開始就盡量用字串處理。
2. 使用者看到的不一定等於實際值
有時候程式端檢查沒問題,但使用者打開 Excel 後看到錯的內容,最後還是會回頭說系統有問題。所以這種顯示層行為也要一併考慮。
小結
Excel 超過 15 位數的處理限制是老問題,遇到時先不要急著怪匯出函式庫。只要欄位本質是識別碼,就應該盡量讓它以字串形式輸出,這樣才能避免 Excel 自動進位或精度遺失。