在 Python 中將 Excel 活頁簿轉換為 JSON,通常意味著使用 pandas 或 openpyxl 載入 .xlsx 檔案、呼叫 to_json 或建立字典清單,然後將結果寫入磁碟。輸出是每個資料列一個 JSON 物件,其中鍵來自選定工作表的第一列,值來自下方儲存的儲存格。一個 1,000 列的庫存表會變成 1,000 個物件的陣列,一個 50 列的發票記錄會變成 50 個物件,而空白儲存格則會變成 null,而不是空字串或零。轉換是一次刻意的交接:活頁簿留在原處,JSON 成為您實際發佈的檔案。有趣的問題在於轉換在哪裡執行、轉換器真正讀取了什麼,以及它所產生的 JSON 是工作表的忠實呈現,還是有所遺漏的簡化版本。

Excel 轉 JSON 實際會產生什麼
JSON 是結構化資料的純文字表示,而非試算表的複製品。它不包含欄寬、條件式格式、圖表、影像、註解、篩選、列印設定、活頁簿保護、命名範圍或原始公式來源文字。.xlsx 檔案的這些部分刻意不在匯出範圍內。真正轉移過去的是結構化網格:第一列的標頭名稱、下方的記錄,以及每列一個 JSON 物件。
由於 JSON 物件需要唯一的字串鍵,工作表的標頭列必須是一組乾淨的欄位名稱。重複的項目會被靜默合併,空白會變成模稜兩可的鍵,而合併的標頭儲存格會產生從未被預期作為欄位名稱的值。修正雜亂標頭的正確位置是試算表本身;一個會自創欄位名稱的轉換器會讓輸出更難以稽核。
Python 通常如何將 Excel 轉換為 JSON
在 Python 的轉換路徑中,有兩個函式庫佔據主導地位。pandas 是較高階的選項,幾乎總是教學首先介紹的項目。openpyxl 是較低階的選項,它直接讀取 OOXML 檔案,讓您對每個儲存格的解讀方式擁有更多控制權。
使用 pandas 的路徑簡短且眾所周知:
import pandas as pd df = pd.read_excel("sales.xlsx", sheet_name="Q1") records = df.to_dict(orient="records") import json; json.dump(records, open("sales.json", "w"), indent=2)
orient="records" 是產生物件陣列的參數,這是多數 API 和 JavaScript 程式碼所預期的形狀。read_excel 在底層對 .xlsx 檔案使用 openpyxl,因此底層的讀取是相同的。
使用 openpyxl 的路徑更明確地處理讀取儲存值而非公式文字:
from openpyxl import load_workbook wb = load_workbook("sales.xlsx", data_only=True, read_only=True) ws = wb["Q1"] rows = ws.iter_rows(values_only=True) headers = next(rows) data = [dict(zip(headers, row)) for row in rows]
data_only=True 旗標是其中最重要的一個。沒有它,openpyxl 會將任何其儲存值為計算結果的儲存格,以公式字串形式回傳。有了它,您會得到活頁簿上次運算後所快取的儲存值。該快取值也是 JSON 取用者會看到的內容,這就是為什麼一個從未在 Excel 中開啟過的活頁簿,在 Python 轉換時,其公式儲存格可能會匯出為空白。
Python 與伺服器型轉換器的限制所在
兩種 Python 方法都有實務上的摩擦。pandas 會帶入 NumPy 和其他幾個相依套件,這使得新專案的安裝明顯比單純一個 pip install pandas 所暗示的更為沉重。openpyxl 較輕量,但您仍須自行編寫 JSON 序列化程式碼,並決定如何處理缺失值、日期和重複項目。當要匯出的工作表不只一個時,任一方法都會多增加一個迴圈。
託管式轉換器則增加了不同類型的摩擦。它們要求您將活頁簿上傳到遠端伺服器、等待結果,然後下載檔案。對於公開的範例試算表而言,這種工作流程沒問題;但對於任何包含客戶資料、財務記錄或受內部資料處理政策規範的內容,都是不可接受的。伺服器可能會保留複本、記錄檔案名稱,而且幾乎完全不在您的掌控之中。
Python 與伺服器工具之間也值得明確指出一些共同的限制:
- 兩種路徑都不會重新計算公式;只匯出儲存的值。
- 巨集、外部連結和內嵌指令碼基於安全因素會被忽略。
- 日期通常會匯出為數值序號,因為兩種方法都不知道地區設定或預期的格式。
- 多個工作表需要使用迴圈或對每張工作表分別進行轉換。
- 具有缺失、空白或合併標頭列的活頁簿,會產生鍵為 null、None 或編號的模糊 JSON 物件。
若要進行乾淨的匯出,來源工作表需要一列由唯一且非空的欄位名稱組成的標頭列,以及形狀一致的資料列。如果來源雜亂,JSON 也會雜亂。
在瀏覽器中將工作表本機匯出為 JSON
如果目標是在不安裝 Python 且不上傳活頁簿的情況下交付 JSON,本機瀏覽器匯出是最簡單的路徑。Excel 轉 JSON 轉換器會在您的瀏覽器分頁中讀取一個 .xlsx 活頁簿,選取一個工作表,並產生可供下載的 JSON 檔案。該活頁簿不會被傳送到伺服器、加入佇列或加以保留。
- 在您的瀏覽器分頁中開啟 Excel 轉 JSON 轉換器。
- 選擇一個大小不超過 20 MB 的本機 .xlsx 活頁簿。
- 選取其第一列包含唯一欄位名稱的工作表。
- 將工作表轉換為 JSON,並下載產生的檔案。
- 開啟下載的 JSON,並在將記錄傳遞給另一個系統之前檢查它們。
第一個非空列會被視為欄位名稱列,且每個標頭都必須是非空且唯一的。否則重複的鍵會覆寫 JSON 物件中的資料,這是一種靜默的損毀。接下來的每一列會變成一個 JSON 記錄,而空儲存格則會變成 null。儲存的文字、數值和布林值會以一般 JSON 值的形式保留。
在讀取活頁簿之前,頁面會驗證傳統的 ZIP 目錄、將檔案大小限制為 20 MB、拒絕 Zip64 和多片磁碟封包,並限制所宣告的展開封包大小和項目數。這些限制減少了意外造成的瀏覽器記憶體壓力;它們並不保證每個小型檔案都易於解析。損壞的、加密的、超過大小限制的或不受支援的活頁簿會停止並顯示錯誤,而不是產生部分下載。所選工作表的定址儲存格數也必須維持在 100,000 以內。
本機匯出保留與捨棄的內容
JSON 是一種資料表示法,而非試算表的複製品,瀏覽器匯出對於 .xlsx 檔案的哪些部分會轉移、哪些部分會留下,說明得很明確。下表總結了這個界線。
| 活頁簿元素 | 在 JSON 中的結果 |
|---|---|
| 儲存的文字、數值和布林值儲存格 | 以一般 JSON 值保留 |
| 空白儲存格 | 變成 null |
| 標頭列(第一個非空列) | 變成物件鍵 |
| 日期儲存格 | 保留其儲存的數值;不會推斷地區設定 |
| 公式儲存格 | 僅匯出其儲存值;不重新計算 |
| 巨集、外部連結、內嵌指令碼 | 忽略 |
| 圖表、影像、註解 | 捨棄 |
| 條件式格式、篩選、欄寬 | 捨棄 |
| 列印設定、活頁簿保護、命名範圍 | 捨棄 |
| 活頁簿中的其他工作表 | 不匯出;每次轉換一個工作表 |
如果匯出前的視覺檢查是必要的,請先在 Excel 檢視器中開啟該活頁簿。此匯出不會合併活頁簿、正規化值、推斷巢狀物件、驗證商業結構描述,或修復公式,也無法確保另一個應用程式會以相同方式解讀每個 JSON 值。請將原始活頁簿保留為資料來源。
在交接之前驗證 JSON 檔案
JSON 檔案一旦存到磁碟後,在將其傳遞給另一個系統之前,請先進行驗證。標頭衝突、儲存格值中殘留的未跳脫引號、或被截斷的記錄,都可能產生一個可以剖析但意義與試算表所表示內容不同的 JSON 檔案。請將該檔案透過 JSON 驗證器執行,確認它能解譯,然後快速瀏覽前幾筆記錄,確認鍵與您預期的標頭相符。
JSON 驗證器會檢查檔案是否有效、以行列位置回報語法錯誤,並顯示結構診斷,讓您能看出頂層是否為您所預期的記錄陣列。如果驗證器回報錯誤,修正通常在來源工作表中:含有引號的標頭、儲存格中多餘的逗號,或經空白正規化後與其他標頭衝突的標頭。
就日常工作而言,正確的順序是:準備工作表使標頭列唯一且非空、一次匯出一個工作表、驗證 JSON,並將原始活頁簿保留在 JSON 旁邊,讓日後對任何值的疑問都能指向一個真實的依據。
延伸閱讀:無需上傳即可檢視 Excel 線上歷史紀錄。