返回 网站动态
DevTool 团队

用 Power Query 把 JSON 导入 Excel(以及什么时候别这么做)

Excel 不能像打开表格那样打开 .json 文件。本文一步步讲 Power Query 的导入路径:嵌套 Record 与 List 怎么展开、类型怎么修,以及什么时候先转 .xlsx 反而更快。

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 语句;一次性鉴权请求通常先用客户端拿到响应文件再转换更省事。

相关阅读