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

how to convert excel to json in python
如何在本機使用 Python 將 Excel 轉換為 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 檔案。該活頁簿不會被傳送到伺服器、加入佇列或加以保留。

  1. 在您的瀏覽器分頁中開啟 Excel 轉 JSON 轉換器。
  2. 選擇一個大小不超過 20 MB 的本機 .xlsx 活頁簿。
  3. 選取其第一列包含唯一欄位名稱的工作表。
  4. 將工作表轉換為 JSON,並下載產生的檔案。
  5. 開啟下載的 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 線上歷史紀錄。

延伸閱讀:從 PPT 圖表中移除 Excel 連結:稽核活頁簿。