返回 网站动态
DevTool Team

JSON 转 Excel 完整指南:在线工具、Power Query 与 Python 怎么选

一步步把 JSON 转成 Excel。看清嵌套对象如何变成列、数组有哪几种导出方式,以及什么时候该用在线工具、Excel Power Query 还是 Python。

JSON 转 Excel 为什么没那么简单

JSON 和 Excel 对「形状」的理解不一样。JSON 是一棵树:对象里套对象,数组里装着还带数组的对象。而工作表是一个矩形:行、列,一个格子放一个值。

所以每一次 JSON 转 Excel,本质上都是一组决策,而不是一个机械步骤:

  • 文档里哪一部分才是表格?API 响应通常把真正的数据行包在 dataresults 这类字段里。
  • 嵌套对象怎么办?它必须变成额外的列。
  • 数组怎么办?一个格子放不下三个值,总得舍弃点什么。
  • null 怎么办?超长整数怎么办?布尔值呢?

把这些决策藏起来的工具能很快吐出一张表,也会安静地把其中几个决策做错。这篇指南把每个决策对数据的实际影响摊开讲清楚,让你能核对结果,而不是只能相信结果。

三条实用路径

方式 适合 代价
在线转换器 临时要把某个文件或 API 响应弄进 Excel 无需配置;但要确认工具是否上传数据
Excel Power Query 以后还要从同一数据源刷新的导入 需要学展开操作;只能活在某个工作簿里
Python(pandas) 定时任务与数据管道 需要运行环境;对单个文件属于杀鸡用牛刀

下文先把在线这条路走细,再说明另外两条什么时候才是更好的答案。

第一步:找到 JSON 里真正的表格

真实的 API 响应很少把数据行放在顶层,通常长这样:

{
  "data": [
    { "id": 1024, "name": "Alice Chen", "active": true },
    { "id": 1025, "name": "Bob Miller", "active": false }
  ],
  "page": 1,
  "total": 2
}

数据行在 data 里。pagetotal 是关于这次响应的元信息,不是表格的列。

好的转换器会自动识别这一点:它会去找 dataitemsrecordsrowsresultslist 这些常见的包裹字段名,取其中的数组。如果你的 API 用了别的名字,或者数组藏得更深,你可以自己填一个点号路径来指定根节点,比如 response.payload.orders

如果你让工具对着整个文档而不是那个数组转换,结果就是一行,其中某个单元格塞着整段 JSON。这是「转换结果看起来坏掉了」最常见的原因。

第二步:看清嵌套怎么变成列

拿一条同时包含嵌套对象、字符串数组和对象数组的记录:

{
  "data": [
    {
      "id": 1024,
      "name": "Alice Chen",
      "active": true,
      "score": null,
      "address": { "city": "Berlin", "zip": "10115" },
      "tags": ["pro", "beta"],
      "orders": [
        { "sku": "A-1", "qty": 2 },
        { "sku": "B-7", "qty": 1 }
      ]
    },
    {
      "id": 1025,
      "name": "Bob Miller",
      "active": false,
      "score": 91.5,
      "address": { "city": "Paris", "zip": "75001" },
      "tags": [],
      "orders": [{ "sku": "C-3", "qty": 5 }]
    }
  ]
}

用默认设置转换,得到的表格是这样:

Id Name Active Score City Zip Tags Orders
1024 Alice Chen TRUE Berlin 10115 ["pro","beta"] [{"sku":"A-1","qty":2},{"sku":"B-7","qty":1}]
1025 Bob Miller FALSE 91.5 Paris 75001 [] [{"sku":"C-3","qty":5}]

这张表里有三处值得细看。

嵌套对象变成了列,表头取的是路径最后一段。 来源路径是 address.city,但列头是 City。这是有意为之:把 address.city 当表头准确但难读,而表格终究是给人看的。完整点号路径会保留在映射面板里,所以你随时知道某一列是从哪来的。

代价出现在两个分支以同一个词结尾的时候。如果记录里同时有 user.namecompany.name,你会得到两个都叫 Name 的列。把文件发给别人之前,先在映射面板里改掉其中一个。

null 变成了空单元格。 不是文本 null,也不是数字 0。Alice 的 score 确实是缺失的,而空单元格正是表格表达「没有」的方式。这一点很关键:=AVERAGE() 会跳过空单元格,但会把 0 老老实实算进平均值。

类型保住了。 91.5 在 .xlsx 里是数值而不是字符串 "91.5"truefalse 是布尔值,所以 Excel 显示成 TRUEFALSE 并且可以直接筛选。那些把所有内容都写成文本的转换器,会逼你在导入后把每一列重新转一遍类型。

第三步:决定数组变成什么

上面表格里的 tagsorders 还是 JSON 文本——忠实,但在表格里没什么用。单元格里表示数组有三种方式,选哪种取决于你打算拿这个文件干什么。

保留 JSON 文本(默认)。什么都不丢。适合表格只是中间产物、后面还有程序会再解析这个单元格的场景。

拼接值。 ["pro","beta"] 变成 pro, beta,空数组变成空单元格。当数组里装的是简单标签、并且这张表是给人看的,这是正确选择。

计数。 ["pro","beta"] 变成 2,空数组变成 0。当你在做报表、关心的是「有几个」而不是「是哪些」时用它。因为结果是真正的数字,你可以立刻求和与排序。

源数据 保留 JSON 拼接 计数
["pro","beta"] ["pro","beta"] pro, beta 2
[] [] (空) 0
[{"sku":"A-1"},{"sku":"B-7"}] 完整 JSON 文本 {"sku":"A-1"}, {"sku":"B-7"} 2

注意最后一行:把对象数组拼接起来,会得到没人愿意读的东西。当数组里装的是对象而不是标签时,这三种方式都不合适——你需要的是第二张工作表。这部分见JSON 数组转 Excel 工作表

第四步:当心超长数字

这一条会悄无声息地毁掉数据,而且几乎没有转换器会提。

JavaScript 的数字类型,以及 Excel 自身的显示精度,都无法精确保存超过约 15 到 16 位有效数字的整数。像 9007199254740993123 这样的订单号,只要中途被当成数字处理,就会变成 9007199254740993000。不报错,文件也能正常打开,只是 ID 错了。

解决办法是把超长整数写成文本而不是数字:

字段 JSON 里的值 Excel 里的值 类型
orderId 9007199254740993123 9007199254740993123 文本
small 42 42 数值

只有 16 位及以上的整数会被这样处理,普通数字仍然保持数值类型,不影响你继续做计算。如果你曾经把一串长 ID 粘进表格、发现末尾变成了一堆 0,就是这个原因。

第五步:下载前先看预览

在任何转换流程里,最有价值的习惯就是下载之前先看一眼表格。具体看这几项:

  1. 行数对不对?如果只有一行、外加一个巨大的单元格,说明根节点选错了(第一步)。
  2. 你关心的列都在吗?还是某个字段只存在于部分记录里?
  3. 数值列是右对齐的吗?如果是左对齐,说明它是以文本形式进来的。
  4. 有没有两列表头撞名(比如两个 Name)?
  5. 长 ID 是不是完整到最后一位?

能直接编辑预览的转换器——改表头、删掉不需要的列、修正某个单元格——可以省掉一次导出到 Excel 再回头改的往返。

想跳过这些步骤: 我们的免费 JSON 转 Excel 工具会在浏览器里完成上面全部五步。它自动识别数组根节点、展平嵌套对象、让你选择数组的导出方式、提供可编辑预览,并在本地生成 .xlsx——JSON 全程不会上传到服务器。

什么时候该改用 Excel Power Query

当这次转换不是一次性的时候,Power Query 才是对的工具。

适合用它的情况:

  • 数据来自一个会变化的 URL,你希望点「刷新」而不是重新转换一遍。
  • 这个工作簿是别人会反复打开的周期性报表。
  • 你需要把 JSON 和工作簿里已有的其他表连接起来。

不适合的情况:你只想拿到一次文件。Power Query 要求你通过界面逐层手动展开嵌套,一条嵌套四层的记录意味着大量点击。

什么时候该改用 Python

当转换需要在你不参与的情况下反复执行时,就该写代码了。

import json
import pandas as pd

with open("response.json", encoding="utf-8") as f:
    payload = json.load(f)

# json_normalize 会把嵌套对象展平成点号命名的列
df = pd.json_normalize(payload["data"], sep=".")

df.to_excel("output.xlsx", index=False, sheet_name="Export")

pd.json_normalize 处理嵌套对象很称职。对象数组则需要一个明确的决定,和第三步是同一个问题:

# 一个订单一行,并把父级的标识字段带下来
orders = pd.json_normalize(
    payload["data"],
    record_path="orders",
    meta=["id", "name"],
)

with pd.ExcelWriter("output.xlsx") as writer:
    df.to_excel(writer, sheet_name="Customers", index=False)
    orders.to_excel(writer, sheet_name="Orders", index=False)

Python 这条路有两点要留意。to_excel 需要安装 openpyxl。另外 pandas 会把 19 位的 ID 读成浮点数并四舍五入,所以那些列要传 dtype=str,或者在写出前先转成字符串。

JSON 转 Excel 和 JSON 转 CSV 怎么选

两者相邻,但不相同。

.xlsx .csv
数据类型 数字、布尔、日期保留类型 全部是文本
多工作表 支持 不支持,一个文件一张表
格式 冻结表头、筛选器、列宽
编码问题 没有,编码由格式本身定义 常见,尤其是中文内容在 Excel 里
适合脚本处理/版本对比
被其他工具导入 支持广泛 几乎万能

给人看的选 .xlsx,给程序读的选 .csv。如果数据里有中文而受众用 Excel,.xlsx 能彻底绕开乱码问题——CSV 需要哪些额外处理,见 JSON 转 CSV 指南

常见问题与成因

只有一行,一个超大单元格。 根节点指向了整个文档而不是数组。把根节点设为存放记录的那个字段。

部分记录缺列。 转换器是根据实际见到的字段来建列的。如果 500 条记录里只有 3 条有 email 字段,那一列会存在但大部分是空的——这是正确行为,而且它在告诉你数据本身的情况。

两列表头相同。 两个不同路径以同一段结尾。在映射面板里改掉一个。

长 ID 末尾变成 0。 整数超过 15 到 16 位后的精度丢失。改用会把它写成文本的转换器,或者在源 JSON 里就给它加引号。

数字求不了和。 它是以文本形式进来的。看对齐方式:文本默认左对齐,数字右对齐。

处理大文件时浏览器卡死。 浏览器端转换受内存限制,具体上限取决于设备和浏览器,没有一个通用的「安全文件大小」可以引用。拆分输入,或者改走 Python 那条路。

常见问题

怎么把 JSON 文件转成 Excel?

有三条实用路径。临时转一个文件,用在线转换器最快:粘贴 JSON 或上传文件,核对预览表格,下载 .xlsx。如果希望以后能从同一数据源刷新,用 Excel 自带的 Power Query。如果转换需要定时跑或嵌进数据管道,用 Python 加 pandas。对单次的 API 响应或数据导出来说,在线转换器几乎总是最短的路径。

在线转换 JSON 到 Excel 安全吗?

完全取决于工具。很多转换器会把文件上传到服务器处理,如果 JSON 里有客户数据、密钥或内部标识,这就是问题。纯浏览器端的转换器用 JavaScript 在本地完成解析和 .xlsx 生成,数据不离开你的电脑。粘贴敏感内容前先看清工具的说明,生产数据优先选本地处理。别只看宣传:真正本地处理的工具,在你断网之后依然能正常工作。

不装 Microsoft Excel 能生成 .xlsx 文件吗?

能。.xlsx 是一种公开的打包格式标准,转换器、脚本和各类库都可以在没有 Excel 的情况下写出合法的工作簿。生成的文件可以用 Excel、WPS Office、Google 表格、LibreOffice Calc 和 Numbers 打开。只有当你要用 Power Query 刷新、宏这类 Excel 专有功能时,才必须装 Excel 本身。

该把 JSON 转成 Excel 还是 CSV?

给人看的选 .xlsx,因为它能让数字保持数值、布尔保持布尔,还支持多工作表、冻结表头和筛选器。给程序读的选 .csv,因为它是纯文本,便于版本对比,几乎任何工具都能导入。如果数据里有中文而受众用 Excel,.xlsx 还能彻底绕开 CSV 常见的编码乱码问题。

为什么转换结果只有一行?

因为转换器对着整个 JSON 文档转换,而不是对着存放记录的那个数组,于是整份文档变成了一行,其中一个单元格塞着全部内容。把根节点设成存放记录的字段即可,通常是 dataitemsresultsrows。这是转换结果看起来坏掉最常见的原因。

JSON Lines(.jsonl)怎么转成 Excel?

JSON Lines 是一行一个 JSON 对象,并不是一份合法的完整 JSON 文档,所以大多数解析器会直接报错。在开头加一个左方括号、结尾加一个右方括号、记录之间加逗号,把它包成数组,就能像普通 JSON 一样转换。Python 里可以直接用 pd.read_json(path, lines=True) 读取。

小结

JSON 转 Excel 是一连串关于「形状」的决策:表格在哪、嵌套如何变成列、数组变成什么、哪些值需要防着表格软件本身。一旦知道每个决策的效果,核对一次转换结果大约只要三十秒。

单个文件用在线转换器并看预览;需要刷新的报表用 Power Query;需要定时执行的写那十行 pandas。

立即把 JSON 转成 Excel → —— 免费,全程在浏览器本地运行,不上传、免注册。