如何使用 Power Query 编辑器在 Office Excel 中正确显示数据?

How to show data properly in Office Excel Using Power Query Editor?

我在 Office API 中的 JSON 输出低于 Excel 我正在通过 Web 从 API.

导入数据
   [{
        "level": 1,
        "children": [{
            "level": 2,
            "children": [{
                "level": 3,
                "name": "Chandni Chowk",
                "data": ["Data 1", "Data 2"]
            }],
            "name": "Delhi",
            "data": ["Delhi Area"]
        }],
        "name": "Country",
        "data": ["India", "Bangladesh"]
    }]

https://docs.microsoft.com/en-us/powerquery-m/quick-tour-of-the-power-query-m-formula-language

我有以上文件。

let
    Source = Json.Document(Web.Contents("MY API URL GOES HERE")),
    AsTable = Table.FromRecords(Source)
    ----
    ----
in
    #"Renamed Column2" 

我现在在 power 查询编辑器中有这个。

作为 Excel 文件中的输出,我需要这样。

Country       Delhi          Chandni Chowk         
India         Delhi Area     Data 1
Bangladesh                   Data 2

我可以从这个 JSON 中获取这些数据吗?或者我需要更改我的 JSON 输出格式以匹配 power 查询?

Power Query 将 JSON 解释为记录和列表的层次结构。我的目标是将 JSON 展平成这样的记录,然后将其转换成 table:

      Country : {"India", "Bangladesh"}
        Delhi : {"Delhi Area"}
Chandni Chowk : {"Data 1", "Data 2"}

在任何特定级别,我们可以使用 Record.FromList:

提取名称和数据值
Record.FromList({CurrentLevel[data]}, {CurrentLevel[name]})

对于第一级,这是

Record.FromList({{"India","Bangladesh"}}, {"Country"})

对应目标记录中的第一个字段。


在任何级别,我们都可以像这样导航到下一个级别:

NextLevel = CurrentLevel[children]{0}

使用这些构建块,我们现在可以编写一个自定义函数 Expand 来展平记录:

1 |    (R as record) as record =>
2 |    let
3 |        ThisLevel = Record.FromList({R[data]}, {R[name]}),
4 |        CombLevel = if Record.HasFields(R, {"children"})
5 |                    then Record.Combine({ThisLevel, @Expand(R[children]{0})})
6 |                    else ThisLevel
7 |    in
8 |        CombLevel

第 1 行:定义函数的语法。它需要一条记录 R 和 returns 做一些转换后的记录。

第3行:如何处理当前级别,如前所述。

第 4 行:检查记录是否有另一个级别可以向下展开。

第5行:如果是,则Record.Combine当前关卡的结果与下关卡的结果,其中下关卡的结果是通过导航到下关卡并递归应用来计算的我们正在定义的功能。三个级别看起来像:

Record.Combine({Level1, Record.Combine({Level2, Level3})})

第 6 行:当没有更多级别可以扩展时,递归停止。没有更多的组合,只返回最后一个级别。


剩下的就是把它变成我们想要的形状了。使用我们刚刚定义的 Expand 函数,我的查询如下所示:

let
    Source = Json.Document( < JSON Source > ),
    ExpandRecord = Expand(Source{0}),
    ToTable = Table.FromColumns(
                  Record.FieldValues(ExpandRecord),
                  Record.FieldNames(ExpandRecord)
              )
in
    ToTable

这使用了Record.FieldValues and Record.FieldName as arguments in Table.FromColumns.

如果您 select 第一个列表单元格:

,则在查询编辑器中使用 Expand 自定义函数后的步骤如下所示

最终结果如您所愿: