使用Excel Power Query导入JSON数据:如何为嵌套字段生成单行记录
Excel Power Query: 处理嵌套JSON生成Load层级表格的高效方案
我完全理解你的需求——要把这种嵌套结构的JSON转换成以load_id/docket_no为核心的逐行表格,还要保留关联的file_no,同时适配大规模数据(不用手动指定每个load_id)。你的原始M代码因为手动展开了固定的load_id列,所以遇到大量数据会失效,还丢失了file_no,下面是更通用的解决方案:
完整的M代码
let Source = Json.Document(File.Contents("H:\Software\Site Apps\example-records.json")), RecordsTable = Record.ToTable(Source[records]), RenamedColumns = Table.RenameColumns(RecordsTable,{{"Name", "record_id"}, {"Value", "RecordDetails"}}), ExpandedRecordDetails = Table.ExpandRecordColumn(RenamedColumns, "RecordDetails", {"file_no", "loads"}, {"file_no", "loads"}), ConvertLoadsToTable = Table.AddColumn(ExpandedRecordDetails, "LoadTable", each Record.ToTable([loads])), ExpandedLoadTable = Table.ExpandTableColumn(ConvertLoadsToTable, "LoadTable", {"Name", "Value"}, {"load_id", "LoadDetails"}), ExpandedLoadDetails = Table.ExpandRecordColumn(ExpandedLoadTable, "LoadDetails", {"docket_no"}, {"docket_no"}), ReorderedColumns = Table.ReorderColumns(ExpandedLoadDetails,{"record_id", "file_no", "load_id", "docket_no"}), CleanedTable = Table.RemoveColumns(ReorderedColumns,{"loads"}) in CleanedTable
代码逻辑拆解(为什么能解决你的问题)
- RecordsTable: 把
records节点下的所有键值对转换成表格,每个record_id对应一行,Value列包含该记录的完整信息(file_no和loads) - RenamedColumns: 重命名列名让后续步骤更直观,避免默认的
Name/Value造成混淆 - ExpandedRecordDetails: 展开
RecordDetails列,直接提取file_no和loads,这一步就把你需要的file_no保留下来了 - ConvertLoadsToTable: 关键一步!对每一行的
loads嵌套记录,用Record.ToTable()自动转换成表格——不管有多少个load_id,都会被拆成一行行的键值对,完全不用手动指定列名,完美适配大规模数据 - ExpandedLoadTable: 展开刚才生成的
LoadTable,把每个load_id拆成独立行,同时保留对应的record_id和file_no,确保数据关联正确 - ExpandedLoadDetails: 展开
LoadDetails提取docket_no,得到最终需要的字段 - ReorderedColumns/CleanedTable: 最后调整列顺序、清理冗余列,让表格结构更整洁
用这个代码处理你的示例JSON,会生成结构清晰的表格:
| record_id | file_no | load_id | docket_no |
|---|---|---|---|
| record_id_1 | 5792C | load_id_1 | 3116115 |
| record_id_1 | 5792C | load_id_2 | 3116118 |
| record_id_1 | 5792C | load_id_3 | 3208776 |
| record_id_2 | 5645C | load_id_4 | 2000527155 |
| record_id_2 | 5645C | load_id_5 | 2000527156 |
| record_id_2 | 5645C | load_id_6 | 2000527146 |
内容的提问来源于stack exchange,提问作者Andrew Allen




