程式或 AI 讀營建試算表,會在哪裡讀錯
Excel 檔裡有些數字,在讀它的軟體眼中,和你在畫面上看到的不一樣。這是我遇過的五種,以及與其猜一個答案,謹慎的讀者應該怎麼說。
10 月 7 日,我存了一個 Excel 檔,B1 顯示 20,可是依照當時 A1 的值,它的公式 =A1*2 應該算出 30。
一個讀檔函式庫打開這個檔案,回報的就是 20,看不出任何過期的跡象。讀存檔的軟體,包括 AI 助理在內,看到的都是 Excel 存下來的內容,而那裡面可能是過期的結果、一個從來不存在的日期,或是一格本來該是 0 的空白。
這些是我們在做自己的檢查工具時,一個一個撞到的,大多是先讀錯了才發現。下面每一項都寫了會發生什麼、在檔案裡怎麼看出來,以及我覺得一個謹慎的讀者,不管是人還是程式,應該怎麼說。
目的不是叫大家別用軟體,而是知道哪些答案後面,該加一句「這我無法確認」。
01五種讀錯
存下來的檔案和畫面不一致的五個地方
其中三項來自 Excel 儲存結果與日期的方式,兩項來自常用讀檔與匯入工具的處理方式。文中的工具與版本是我們用過的那幾個,其他工具的行為可能不同。
1存下來的結果已經過期
會發生什麼2026 年 10 月 7 日,我在 Excel for Mac(16.113.3)把計算模式設成手動,把 A1 改成 15,沒有重算就存檔。B1 的公式是 =A1*2,檔案存下來的卻是 A1 還是 10 時的結果 20。常用的讀檔函式庫 ExcelJS 4.4 讀到的也是 20。在檔案裡怎麼看出來Excel 知道結果過期時,會在活頁簿的計算設定裡寫下 calcCompleted="0"。但這個標記要存在才有用。依 r/excel 論壇上的一則回覆,LibreOffice 有時不寫這個標記,Google Sheets 匯出時通常標成已完成,openpyxl 則不寫。這三個我還沒有自己重現。比較謹慎的說法檔案裡有公式、又沒有可以信賴的標記時,就說這個值可能不是最新的。不要自己默默重算,再把新的數字當成檔案裡的數字交出去。2結果是 0,卻被讀成沒有值
會發生什麼件數 0、差額空白,都是正常的公式結果。ExcelJS 4.4 把這類公式格讀成「沒有結果」,看起來像是從來沒算過。在我們自己的一次合成測試裡,有個工具接著就把一筆金額為 0 的資料當成缺資料排除掉。在檔案裡怎麼看出來存下來的結果其實還在工作表的 XML 裡,就在那一格的 <v> 元素。直接讀它,就能把 0 拿回來。比較謹慎的說法0 就當 0。工具說某個公式沒有結果時,先看原始值,再決定能不能把這一列當成空的。31904 日期系統
會發生什麼Excel 用數字記日期,起算點有兩種。1900 年 2 月以後的日期,同一個序號在 1900 和 1904 兩種日期系統下,會差 1,462 天。有些舊的 Mac 檔案用的是 1904。在檔案裡怎麼看出來活頁簿的設定裡有一個 date1904 標記。轉換任何日期之前先讀它,也要先讀它,才能判斷序號 0 和 60 是什麼意思。比較謹慎的說法用檔案自己的日期系統換算。如果兩份檔案的日期剛好差了四年左右,先查這個標記。41900 系統裡的第 0 天和第 60 天
會發生什麼在 1900 日期系統裡,序號 0 會顯示成 1900/01/00,序號 60 會顯示成 1900 年 2 月 29 日,而那一天並不存在,是 Excel 為了和早期的試算表軟體相容才留下來的。在 1904 系統裡,同樣兩個序號是 1904 年 1 月 1 日和 3 月 1 日,都是真的日期。讀檔函式庫可能把這些都轉成看起來很正常的日期。在檔案裡怎麼看出來先確認日期系統,再讀原始的序號,最後才轉換成日期。比較謹慎的說法在 1900 系統下,序號 60 不是任何日期,要明白寫出來,不要把 1900 年 2 月 29 日當成付款日報出去。我們自己的工具在兩種系統下都把 0 當成缺值,這是我們的選擇,不是 Excel 的規則,所以要說清楚你用的是哪一條。5空白匯入後變成別的值
會發生什麼在我們的一次測試裡,原檔中空白的一格,經過一個通用的匯入工具之後,變成了文字「12」。畫面上完全看不出異狀。在檔案裡怎麼看出來把匯入後的值,和原檔 XML 裡的同一格對照。這一次是因為另一個檢查直接讀了原始檔,才發現的。比較謹慎的說法匯入的值在原檔裡找不到時,就說它的來源不明,也不要拿來用。
02請助理讀檔時
交檔案之前,我會先給它的幾句話
如果要把試算表交給 AI 助理,我會先給它幾條規則。這不會讓它的答案變正確,只是要求它在不知道的時候說不知道。助理會照做到什麼程度,我還沒有測試過,所以回來的答案我還是會再檢查。
「每個數字都附上工作表和儲存格位置,並說明這一格是公式還是手打的數字。如果活頁簿存檔時計算沒有完成,或你判斷不出來,就說這個值可能不是最新的。讀任何日期之前,先確認檔案是不是用 1904 日期系統;在 1900 系統下,序號 60 當成缺值,序號 0 在兩種系統下都當成缺值,除非我另外說明。空白不要補成 0,也不要在沒告訴我的情況下重算。無法確認的地方,寫『無法確認』,並說明需要什麼才能確認。」
03給做工具的人
讀檔案本身,不只讀函式庫給的答案
這幾項大多是往下多看一層,打開 .xlsx 裡的 XML,再和函式庫回傳的結果比對,才抓到的。讀檔函式庫是為了方便而設計的,遇到缺口會用合理的方式補上。但在請款檔裡,一個合理的補法,就可能悄悄改掉一筆金額。
檢查不了的地方,就列出來。對簽核的人來說,一張短短的「沒有檢查到」清單,比一份把它略過、看起來很乾淨的報告更有用。
04在我們的工作台
Pactbeam 怎麼處理這些
Pactbeam 讀的是檔案裡存下來的值,不重算 Excel;檢查不了的地方會列出來,不會默默跳過。上面五項,有些我們的工具已經處理,有些還沒有。我們還在一項一項做,這一頁也會跟著更新。
05邊界
這一頁無法判斷什麼
五項不是完整的清單,只是我們遇過、也查證得了的。其他的還在我們自己的候選清單上。
只有第一項是我親手重現的,而且只在一個版本的 Excel for Mac 上。關於 LibreOffice、Google Sheets 和 openpyxl 的說法,來自一則我們沒有重現的論壇回覆。函式庫的行為指的是文中列出的版本,新版可能不同。
這些都不能告訴你某個數字對不對,只能告訴你,單憑這個檔案,什麼時候無法證明一個數字是最新的或完整的。
06來源與示例
每一項從哪裡來
我們自己的重現與測試、一則論壇回覆,以及 Excel 的日期規則。寫這一頁時沒有讀任何真實建案的檔案。
- 觀察第 1 項:作者 2026 年 10 月 7 日在 Excel for Mac 16.113.3 重現。存下來的檔案記錄 calcMode="manual" calcCompleted="0" calcOnSave="0",B1 存的公式是 A1*2、存值 20,ExcelJS 4.4 讀到 20。
- 來源第 1 項其他軟體的部分:r/excel 論壇 2026 年 10 月 7 日的一則回覆,說明哪些軟體會寫下計算標記。我們沒有重現。
- 觀察第 2、5 項:我們 2026 年 10 月在做 Pactbeam 期間核對與資金工具時的合成測試。
- 推論第 3、4 項是 Excel 兩種日期系統的規則。我們自己的工具先讀 date1904,只在 1900 系統下把序號 60 當成缺值,並依我們自己的規則在兩種系統下都把 0 當成缺值,有自己的測試。給助理的那段指示是我寫的,沒有當成提示詞測試過。
- 合成示例所有數值都來自練習檔,沒有讀任何真實建案的檔案。
你或你的軟體,有沒有遇過一個後來才發現是舊計算結果的數字?
如果你遇過這裡沒寫到的,我想把它加進來。寫信告訴我發生了什麼就好,不用寄檔案。