Pactbeam
公開教材發佈 2026-10-22

程式或 AI 讀營建試算表,會在哪裡讀錯

Excel 檔裡有些數字,在讀它的軟體眼中,和你在畫面上看到的不一樣。這是我遇過的五種,以及與其猜一個答案,謹慎的讀者應該怎麼說。

寫給請軟體或 AI 助理讀成本表、預算表或請款檔(.xlsx)的人。例子都來自合成練習檔,其中一項是我在 Excel for Mac 上親手重現的。

10 月 7 日,我存了一個 Excel 檔,B1 顯示 20,可是依照當時 A1 的值,它的公式 =A1*2 應該算出 30。

一個讀檔函式庫打開這個檔案,回報的就是 20,看不出任何過期的跡象。讀存檔的軟體,包括 AI 助理在內,看到的都是 Excel 存下來的內容,而那裡面可能是過期的結果、一個從來不存在的日期,或是一格本來該是 0 的空白。

這些是我們在做自己的檢查工具時,一個一個撞到的,大多是先讀錯了才發現。下面每一項都寫了會發生什麼、在檔案裡怎麼看出來,以及我覺得一個謹慎的讀者,不管是人還是程式,應該怎麼說。

目的不是叫大家別用軟體,而是知道哪些答案後面,該加一句「這我無法確認」。

01五種讀錯

存下來的檔案和畫面不一致的五個地方

其中三項來自 Excel 儲存結果與日期的方式,兩項來自常用讀檔與匯入工具的處理方式。文中的工具與版本是我們用過的那幾個,其他工具的行為可能不同。

  1. 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. 2結果是 0,卻被讀成沒有值

    會發生什麼件數 0、差額空白,都是正常的公式結果。ExcelJS 4.4 把這類公式格讀成「沒有結果」,看起來像是從來沒算過。在我們自己的一次合成測試裡,有個工具接著就把一筆金額為 0 的資料當成缺資料排除掉。
    在檔案裡怎麼看出來存下來的結果其實還在工作表的 XML 裡,就在那一格的 <v> 元素。直接讀它,就能把 0 拿回來。
    比較謹慎的說法0 就當 0。工具說某個公式沒有結果時,先看原始值,再決定能不能把這一列當成空的。
  3. 31904 日期系統

    會發生什麼Excel 用數字記日期,起算點有兩種。1900 年 2 月以後的日期,同一個序號在 1900 和 1904 兩種日期系統下,會差 1,462 天。有些舊的 Mac 檔案用的是 1904。
    在檔案裡怎麼看出來活頁簿的設定裡有一個 date1904 標記。轉換任何日期之前先讀它,也要先讀它,才能判斷序號 0 和 60 是什麼意思。
    比較謹慎的說法用檔案自己的日期系統換算。如果兩份檔案的日期剛好差了四年左右,先查這個標記。
  4. 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. 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 的日期規則。寫這一頁時沒有讀任何真實建案的檔案。

你或你的軟體,有沒有遇過一個後來才發現是舊計算結果的數字?

如果你遇過這裡沒寫到的,我想把它加進來。寫信告訴我發生了什麼就好,不用寄檔案。

max@pactbeam.com

英文版完整保留同樣的五項、指示與來源。 EN

教材