跳到主要內容

← 返回部落格

如何把 JSON 轉成 CSV 與 Excel(以及轉回來)

程式講 JSON、試算表講 CSV 和 Excel,遲早你得把資料在它們之間搬。三種格式裝的是同一批列與欄——關鍵是轉換時別把它弄壞。這篇說明怎麼做。

引號規則不用解釋,直接看。 我們把 [{"name":"Ada","dept":"R&D","hours":7.5},{"name":"Bo","dept":"Sales, EU","hours":8}] 丟進 JSON 轉 CSV 工具,回來的是:

name,dept,hours
Ada,R&D,7.5
Bo,"Sales, EU",8

看最後一行。R&D 是裸的,但 Sales, EU 被加上雙引號 —— 因為它自己含有分隔符號。這一條規則就是大多數手寫 CSV 匯出壞掉的原因:值裡面的一個逗號,會悄悄把一欄變成兩欄。輸入複製過去就能自己驗。

三種格式各自的用途

  • JSON——給程式與 API 的結構化資料。表格型資料通常是物件陣列:[{"name":"Ann","age":30}, …],每個物件是一列。
  • CSV——純文字表格(逗號分隔)。通用、極小、幾乎什麼都能匯入。
  • Excel(.xlsx)——含格式、多工作表與公式的二進位試算表,也是多數同事真正會打開的檔。

JSON 轉 CSV

最好轉的 JSON 是扁平物件的陣列:每個物件成為一列,鍵成為標題列。巢狀物件無法乾淨對映成平面表格,請先攤平(或只期待最上層被轉換)。

另外注意標頭列是怎麼來的。我們的轉換器輸出 name,dept,hours,是讀第一個物件的鍵 —— 不是掃過每一筆記錄。如果你的第二筆記錄多了一個鍵,那個鍵沒有地方可去,這就是「攤平與正規化要在匯出之前做、不是之後」的實務理由。

JSON 轉 Excel

道理相同,但輸出是可直接用 Excel、Numbers 或 Google 試算表打開的 .xlsx——不必再匯入。要把資料交給整天用試算表的人時最方便。

CSV 或 Excel 轉回 JSON

反過來,把試算表變成程式可解析的物件陣列——很適合灌資料庫、餵 API 或載入測試資料。

攤平巢狀 JSON

CSV 與 Excel 是平面的格子,巢狀結構得先展開。慣例是把鍵改成點記法:

[{ "name": "Ann", "address": { "city": "Berlin", "zip": "10115" } }]

會變成有 name、address.city、address.zip 三欄的表。陣列比較棘手:一串值常被併進同一格("red; green"),一串物件則通常要一列一筆。轉換前先決定形狀,欄位才會一致。

分隔符、引號與編碼

CSV 的麻煩多半出在三件事:

  • 分隔符。「逗號分隔」不是通則。許多歐洲地區用逗號當小數點,Excel 反而預期用分號。若欄位沒被切開,換個分隔符試試。
  • 引號。 值裡若含分隔符、引號或換行,必須用雙引號包住,內部的引號要成對加倍:"她說 ""嗨"""。
  • 編碼。 存成 UTF-8。Excel 常需要 **BOM(位元組順序記號)**才能正確顯示重音或中日韓文字;少了它就會亂碼,例如 é。

引號是「一份 CSV 能不能原樣來回」的決定因素,而一個輸入就能定案。我們給自己的JSON ↔ CSV/Excel 轉換器兩筆記錄,其中一個值含逗號、另一個含 & 符號:

[{"name":"Ada","dept":"R&D","hours":7.5},{"name":"Bo","dept":"Sales, EU","hours":8}]

它回傳的是

name,dept,hours
Ada,R&D,7.5
Bo,"Sales, EU",8

只有 Sales, EU 被加了引號,R&D 沒有。整條規則就是這樣 —— 一個欄位只有在含分隔符、含引號字元、或含換行時才加引號,否則就裸著。一個什麼都加引號的轉換器仍然產出合法 CSV,但檔案會膨脹一倍,而且會弄壞那些直接比對原始字串的簡單解析器;一個什麼都不加的,會靜靜地把兩筆記錄變成三個欄位。

為什麼 Excel 會弄壞我的數字

用 Excel 打開 CSV,像 00123 這種 ID 會掉開頭的零、訂單號那類長數字串會變成科學記號(1.23E+11)、看起來像日期的內容會被「貼心地」改格式。這些是 Excel 的顯示轉換,不是你資料壞了。要保住原值,貼上前先把欄位設成文字格式,或用「資料 → 從文字/CSV」匯入並把該欄標成文字。轉換前先用 常見 JSON 錯誤那篇驗一下,別讓一個多餘的逗號毀掉整批轉換。

在瀏覽器本機做,不上傳

資料檔常含機敏資訊,會上傳的工具就是風險。以下工具完全在你的裝置上執行:

轉得乾淨的技巧

  • 讓 JSON 是鍵一致的物件陣列——才會 1:1 對映成欄位。
  • 先驗證 JSON(一個多餘逗號就會壞掉)。
  • 轉 Excel 時記得輸出是真正的 .xlsx,不是把 CSV 改名。

掌握「物件陣列」這個形狀,JSON、CSV、Excel 之間的搬移就變成兩下點擊、不上傳的小事。