Excel 打不开 JSON,但可以导入它
双击 .json 文件不会得到一张表格。Excel 没有 JSON 查看器,这种格式也没有它能直接显示的行列。
Excel 有的是 Power Query——一层理解 JSON 结构、能把数据重组成表的数据导入与转换引擎。它真的擅长这件事,但也比多数人预期的更费手:每一层嵌套都要自己展开。
本指南讲完整条导入路径,也直说它什么时候是错误选择。
开始之前:先确认你的版本
Power Query 的可用性并不统一,这一点绊倒的人比任何操作步骤都多:
| 版本 | 状态 |
|---|---|
| Excel 2016 及以后,Windows | 内置,在「数据」选项卡 |
| Excel 2010 / 2013,Windows | 需要单独安装 Power Query 加载项 |
| Excel for Mac | 支持较晚,连接器比 Windows 少 |
| Excel 网页版 | 受限,查询编辑能力不等价于桌面版 |
不同发行版的菜单措辞也会变。如果下文的路径在你的功能区里对不上,找「获取数据」「Get & Transform」或「新建查询」——同一个功能在不同版本下的不同名字。
第 1 步:加载文件
在「数据」选项卡:获取数据 → 自文件 → 自 JSON,选中文件。
Excel 不会往单元格里放任何东西。它打开的是 Power Query 编辑器——一个独立窗口,显示文档的顶层结构。
多数人在这里遇到第一个意外:什么都还没导入。Power Query 是一块暂存区,只有当你点完「关闭并上载」,数据才会进工作表。
第 2 步:看懂眼前的结构
Power Query 用自己的词汇描述 JSON:
- Record —— 一个 JSON 对象
{...} - List —— 一个 JSON 数组
[...] - 其他 —— 普通值
一个典型的接口响应以单个 Record 打开,字段类似 data、page、total。你的数据行在 data 里,显示为一个 List。此刻什么都不可读,这是正常的。
真正干活的是两个动作,你会反复用到:
转换成表 把 List 变成行,用在装着记录列表的那个 List 上。
展开控件——列头里那个双向小箭头图标——把 Record 的字段或 List 的元素变成真正的数据。
第 3 步:找到你的记录
编辑器里如果是一个带 data、page、total 的 Record,点 data 字段钻进去,得到一个 Record 组成的 List。
点转换成表,对话框保持默认。得到单列(通常叫 Column1),每个单元格都写着 Record。
这一列黑箱是正常的。每个单元格是你的一条 JSON 对象,还没拆开而已。
第 4 步:反复展开
点 Column1 的展开图标。Power Query 列出它找到的字段,让你勾选要带出哪些。
取消勾选「使用原始列名作为前缀」,除非你想要每一列都叫 Column1.id、Column1.name。勾一次是轻度烦恼;嵌套四层还勾着,列名就没法看了。
点确定后,Record 列被替换成一列一个字段。
现在检查结果:凡是本身是对象的字段显示为 Record,是数组的显示为 List。每一种都要再来一轮展开。四层深的结构就是四轮。
展开 Record 列
同一个控件、同一个对话框:勾字段、去前缀、确定。嵌套对象很好办——字段名固定,产出的列也固定。
展开 List 列
List 给你一个选择,而且选择很关键:
展开到新行把父行按元素复制。一个带三个标签的客户变成三行,除了标签全部相同。想要「每个元素一行、之后透视」时这是对的;把对象数组拆成子表也是这条路:先展开到新行,再展开得到的 Record 列。
提取值保持一行,把元素用你选的分隔符拼进一个单元格。数组只是几个标签、想让表格保持一行一条记录时,用这个。
没有第三种选项能把数组以 JSON 文本塞进单元格——想要那个,Power Query 就不是工具了。
同一个查询里对多个 List 列都要「展开到新行」时要小心:展开两个独立数组会产生笛卡尔积——三个标签 × 四个订单 = 十二行,多数没有意义。一个查询只展开一个数组,或拆成多个查询之后再关联。
第 5 步:修类型
Power Query 会猜列类型,而且猜错得足够频繁,值得每次都检查。类型标识在每个列头。
两个要专门盯的问题:
数字被导入成文本就求不了和。把列类型改成小数或整数。
长 ID 丢尾巴。 16 位以上的标识符没法被精确表示成数字。Power Query 若把这种列猜成数字,末几位会静默地变成 0——不报任何错。上载前把列类型设为文本。订单号、雪花 ID、账号都算在内,这是整个流程里破坏力最大的默认行为。
日期也要查。JSON 通常带 ISO 8601 字符串,Power Query 一般能识别;Unix 时间戳到货时是普通整数,需要转换。
第 6 步:关闭并上载
主页 → 关闭并上载,结果以真正的 Excel 表格落进工作表。
查询随工作簿保存。「数据 → 全部刷新」会对当前文件或 URL 重跑全部步骤。这就是用 Power Query 的全部理由:转换是可重复的,不是一次性粘贴。
直接从接口导入
获取数据 → 自其他源 → 自网站,粘贴接口地址,之后是同一套展开与修类型。
公开接口很好用。涉及鉴权就迅速变尴尬:自定义请求头和 POST 要在高级编辑器里手写 M 代码,而存在工作簿里的凭据在文件被分享时是真实的安全问题。一次性鉴权请求,用客户端拿到响应文件再转换通常更省事也更安全。
什么时候不该用 Power Query
Power Query 靠重复摊薄学习成本。任务不重复,成本就是纯开销。
用 Power Query:
- 源文件或 URL 会变,想点刷新就更新
- 工作簿是别人也要打开的周期性报表
- 要把 JSON 与工作簿里已有的表做关联
- 转换本身需要可审计、可复现
先转 .xlsx:
- 数据只要用一次
- 嵌套很深,手工展开意味着几十次点击
- 想在进工作簿之前先看结果表
- 所在平台的 Power Query 对 JSON 支持有限
对一个嵌套文件的老实话:能自动找到数组根、一次拍平所有层级的转换器,完成时间大约等于 Power Query 里点完两个展开对话框。
一次性文件的更快路径: 本站的 JSON 转 Excel 工具会自动识别记录数组、一次展平全部嵌套对象、把对象数组导出到独立工作表,直接下载 .xlsx。全程在浏览器里运行,文件不上传——不适合贴进云服务的数据同样能用。
Power Query 常见问题
每个单元格都是 Record 或 List。 结构还没展开。对那一列用展开控件。
列名长成 Column1.data.address.city。 展开时前缀选项没去掉。重命名列,或去掉勾选重做展开。
行数莫名其妙变多。 两个 List 列都被展开到新行,产生了笛卡尔积。一个查询只展开一个数组。
某列求不了和。 类型是文本。改列类型。
ID 末尾变成 0。 15-16 位以上整数被设成了数字类型。把列改回文本再刷新。
文件挪了位置后刷新失败。 查询存的是绝对路径。在「查询设置」里更新源,或用固定位置。
有些行整列是空的。 JSON 记录本身不均匀。这是数据的样子,不是 bug——Power Query 用它遇到过的字段凑出列集合。
三种方法怎么选
| Power Query | 在线转换 | Python | |
|---|---|---|---|
| 准备工作 | 有 Power Query 就为零 | 无 | 环境加库 |
| 深层嵌套 | 行,每层手工一步 | 行,自动 | 行,写代码 |
| 可刷新 | 是 | 否 | 是,配调度 |
| 对象数组到独立工作表 | 手工,一个数组一个查询 | 自动 | record_path |
| 数据离开本机 | 否 | 工具上传才会 | 否 |
| 适合 | 周期报表 | 一次性文件 | 数据管道 |
常见问题
Excel 能直接打开 JSON 文件吗?
不能当作表格打开。双击 .json 不会出现行列结构,走「文件 → 打开」通常只能看到原始文本或导入提示。受支持的路径是「数据 → 获取数据 → 自文件 → 自 JSON」,它把文件加载进 Power Query 而不是工作表,之后还要把结构转成表、逐层展开嵌套,最后才会落到工作表里。
Power Query 的「自 JSON」入口在哪里?
在较新版本的 Windows Excel 里,位于「数据」选项卡的「获取数据 → 自文件 → 自 JSON」。可用性随版本与平台不同:Windows 上 Excel 2016 及以后内置,2010/2013 是独立加载项,Excel for Mac 支持较晚且连接器更少。找不到入口时先确认版本,再怀疑文件。
为什么我的 JSON 显示成 List 或 Record,而不是数据?
这是 Power Query 在表示尚未展开的结构:Record 对应 JSON 对象,List 对应 JSON 数组。对顶层的 List 用「转换成表」,再对 Record 列用展开控件把字段变成真正的列。每一层嵌套都要单独展开一次,这也是深层嵌套 JSON 点起来很累的原因。
Power Query 里怎么展开嵌套 JSON?
点击列头的展开图标。Record 列可以勾选要带出的字段;List 列要在两种方式里选:「展开到新行」把父行按元素复制成多行,「提取值」把元素用分隔符拼进一个单元格。每层重复一次,并取消勾选「使用原始列名作为前缀」,避免得到 data.address.city 这种列名。
该用 Power Query,还是先把 JSON 转成 .xlsx?
需要日后从同一文件或 URL 重复刷新、工作簿是周期性报表、或要把 JSON 与工作簿里已有的表做关联时,用 Power Query。只用一次、嵌套深到手工展开很繁琐、或想在进工作簿前先检查结果表时,先转 .xlsx 更快。
Power Query 能直接从 API 地址拉 JSON 吗?
可以,走「获取数据 → 自其他源 → 自网站」并填入接口地址。需要鉴权头或 POST 请求体的场景会明显变难,往往要手写 M 语句;一次性鉴权请求通常先用客户端拿到响应文件再转换更省事。
相关阅读
- 在线一步到位的转换:JSON 转 Excel 完整指南
- 对象数组怎么变成关联工作表:JSON 数组转 Excel
- 不需要 Excel 时:JSON 转 CSV 转换指南