XLSX 轉 JSON:瀏覽器端的類型感知轉換
這個工具的作用非常直接:你上傳一個 Excel(.xlsx)檔案,它會將第一個工作表內的資料表轉換成結構化的 JSON 檔案回傳給你。整個過程完全在你的瀏覽器中完成,伺服器不會收到任何資料。
看似簡單,但 XLSX 轉 JSON 與轉 CSV 有本質上的不同。XLSX 檔案本質上是一個壓縮的 XML 活頁簿,能夠承載多個工作表、多種儲存格類型(文字、數字、日期、布林值)、公式以及豐富的格式設定。JSON 則是一種具有型別且可嵌套的格式——支援物件、陣列、數字、布林值和空值。因此,在從 XLSX 轉換到 JSON 時,數字與布林值可以保留為具有型別的 JSON 值,而不是被強制轉成帶引號的字串。儲存格格式、公式(不會被重新計算)以及第一個工作表之外的資料都會被捨棄。不同於 CSV 將每一列壓平成純文字行,JSON 能將表格結構表示為物件陣列,並將欄位名稱作為鍵值。然而,XLSX 表格本身是平面的,不存在階層結構,因此不會自動產生巢狀 JSON。
輸入與輸出
- 輸入:一個 XLSX 檔案(可拖放或從檔案選擇器選取)。
- 輸出:一個可供下載的 JSON 檔案、預覽結果(前 8 列和前 8 欄)、轉換後的表格列數與欄數,以及輸出 JSON 的檔案大小。
規則與邊界情況
- 工具僅讀取 XLSX 檔案的第一個工作表。
- 使用儲存格的可見值;不計算公式——公式儲存格的結果是最後儲存時的值。
- 儲存格樣式、合併儲存格與格式化(字型、顏色、邊框)不會保留。
- 若 XLSX 檔案無法被解析,會顯示錯誤訊息「此 Excel 檔案無法開啟。」。
- 若第一個工作表沒有任何資料列,則會出現「此檔案沒有表格列。」錯誤。
- 檔案大小與列/欄數限制:若檔案超過 8 MB 大小,會顯示「此檔案太大。請使用小於 ‹max› 的檔案。」。同樣地,若表格超過 10,000 列或 200 欄,會顯示對應的錯誤。
- 其他錯誤訊息包括:「請選擇 CSV、JSON 或 XLSX 檔案。」、「無法轉換此檔案。」、「轉換已取消。」、「此轉換花費時間過長。請嘗試較小的檔案。」。
誰需要這個工具
- 一位 Web 開發者,收到產品資料的 Excel 試算表,需要轉換成 JSON 以提供 API 或前端應用程式使用。
- 一位資料分析師,希望快速將季度報告(XLSX)轉換成機器可讀的 JSON 格式,以便進行後續處理。
- 一個團隊,與偏好 JSON 而非 Excel 的外部合作夥伴協作,需要進行一次性轉換且無需安裝軟體。
- 任何注重隱私的使用者,希望在不上傳檔案到雲端服務的情況下完成 XLSX 轉 JSON 的轉換。
XLSX 的內部結構
XLSX 檔案遵循 Office Open XML(OOXML)標準,其核心是一個 ZIP 壓縮檔。解壓縮後,你會看到一個由 XML 檔案組成的目錄結構。xl/workbook.xml 定義了所有工作表的名稱與順序。xl/worksheets/sheet1.xml 包含實際的表格資料。
這個 XML 使用 <row> 和 <c>(cell)元素。每個儲存格標籤都有一個 r 屬性(如 A1、B2)來定位,以及一個可選的 t 屬性來表示資料型別:s(共享字串)、b(布林值)、e(錯誤)、inlineStr(內嵌字串)。若無 t 屬性,則 v 元素的內容會被視為數字或日期。共享字串儲存在 xl/sharedStrings.xml 中,可避免重複儲存大量重複文字。
JSON 的資料型別與語法
JSON 的核心規格定義於 RFC 7159。它支援六種型別:
- 物件:以
{}包覆的鍵值對集合,鍵必須是字串。 - 陣列:以 `` 包覆的有序值清單。
- 字串:以雙引號包覆的 Unicode 字元序列。
- 數字:可以是整數或浮點數,使用 base-10 表示法。
- 布林值:
true或false。 - 空值:
null。
轉換時,工具會將 Excel 中的表格每列對應成一個 JSON 物件,第一列作為鍵(欄位名稱),後續列作為值。陣列則用來包裝所有物件。
Excel 儲存格型別的對應方式
這是轉換中最關鍵也最常被誤解的部分。
- 數字:Excel 中不含
t屬性的儲存格,其v元素值會直接成為 JSON 中的數字型別。例如42會輸出為42,而不是"42"。這對需要數值計算的 API 至關重要。 - 布林值:Excel 以
t="b"標記的儲存格,其v值為0或1。工具會將其轉換為 JSON 的false或true。 - 文字:使用共享字串或
inlineStr的儲存格,轉換為 JSON 的字串型別。 - 日期:Excel 將日期儲存為序列值(serial number),例如
2024-01-01對應到45382(在某些版本中)。工具會讀取這個數字,並將其轉換為 ISO 8601 格式的字串,例如"2023-08-15T00:00:00.000Z"。 - 空白儲存格:轉換為 JSON 中的空字串
""。這不同於包含空字串""的儲存格。 - 錯誤值:
#DIV/0!等錯誤值會變成帶有該錯誤字串的 JSON 字串。
範例:Excel 表格
| Name | Age | Active |
|---|---|---|
| Alice | 30 | TRUE |
| Bob | FALSE |
轉換為 JSON
[
{ "Name": "Alice", "Age": 30, "Active": true },
{ "Name": "Bob", "Age": "", "Active": false }
]
注意 Age 的 30 是數字(無引號),Active 的 true 和 false 是布林值,而 Bob 的年齡空缺變成 ""。
為何公式會消失
工具讀取的是 XLSX 檔案中儲存的「最後計算值」,而非公式本身。這是設計上的必然:瀏覽器中用於解析 XLSX 的機制並未包含 Excel 的計算引擎。當你在 Excel 中輸入 =A1+B1 並儲存,檔案中同時記錄了公式字串 (<f>=A1+B1</f>) 和最後一次計算的結果值 (<v>5</v>)。轉換時,工具會略過 <f> 元素,僅使用 <v> 元素。因此,任何依賴自動重新計算的邏輯都無法在轉換後的 JSON 中重現。
為何只讀取第一個工作表
這是基於簡潔與常見使用模式的決定。絕大多數 XLSX 轉 JSON 的需求都集中在單一資料表上。若要處理多個工作表,你必須將每個工作表分別匯出為獨立的 XLSX 檔案,再個別進行轉換。
客戶端處理的隱私優勢
所有檔案處理都在瀏覽器內進行。你的瀏覽器會解析活頁簿——一個 XML 部分的 ZIP 套件——並在你的裝置上寫入轉換後的輸出。沒有任何資料片段透過網路傳輸。這意味著即使包含敏感資訊(如客戶名單、薪資資料),也不會離開你的電腦。
轉換後的資料驗證
成功轉換不代表資料完美無缺。常見的陷阱包括:
- 合併儲存格:僅左上角的儲存格有值,其餘為空,轉換後會產生大量空字串。
- 空白列:手動插入的空白列會造成 JSON 中出現全空字串值的物件,應事先清除。
- 隱藏欄位:Excel 中的隱藏欄位仍會被讀取並包含在 JSON 中,你必須在轉換前手動取消隱藏或刪除。
- 多行表頭:若第一列不是純粹的欄位名稱(例如跨越兩列),JSON 的結構會不如預期。
常見問題
轉換後的 JSON 中,日期顯示為一串數字,怎麼辦?
這是因為日期在 Excel 中儲存為序列值。工具會將其轉換為 ISO 8601 格式的字串(例如 "2023-08-15T00:00:00.000Z")。原始的 Excel 格式遮罩會被捨棄。若你需要特定的日期格式,你必須對 ISO 字串進行後續處理。
我的 Excel 檔案有 10 個工作表,如何全部轉換?
這個工具只處理第一個工作表。若你需要其他工作表的資料,你必須先在 Excel 中將該工作表移至第一個位置,然後再上傳。
為什麼 JSON 中的布林值變成字串 "TRUE" 或 "FALSE"?
這表示原始 Excel 檔案中的布林值儲存為文字,而非原生布林資料型別。檢查你的 Excel 表格,該欄位可能被設定為文字格式。在 Excel 中將該欄位改回「一般」格式後重新輸入 TRUE 或 FALSE,再進行轉換。
我的表格有合併儲存格,轉換後資料不完整,怎麼辦?
合併儲存格只有左上角有值。最佳做法是在轉換前取消合併,並將值複製到所有相關儲存格中。
轉換後 JSON 檔案大小比原始 XLSX 大很多,正常嗎?
很正常。XLSX 是壓縮格式(ZIP),而 JSON 是純文字。如果原始資料包含大量重複字串,XLSX 可透過共享字串表大幅減小體積,但 JSON 會完整儲存每個字串,導致檔案體積增加。
我可以控制 JSON 的輸出格式嗎?例如用陣列代替物件?
目前工具使用標準的物件陣列格式。若要更改結構,你需要在轉換後對 JSON 進行二次處理。