首页 > 解决方案 > 如何在 Excel Power Query 中动态获取列名

问题描述

我在 Excel 中使用 Power Query 来读取 JSON 文件。我有一个示例工作脚本,如下所示:

let
    Source = Json.Document(File.Contents("E:\laureates.json")),
    #"Converted to Table" = Record.ToTable(Source),
    #"Expanded Value" = Table.ExpandListColumn(#"Converted to Table", "Value"),
    #"Expanded Value1" = Table.ExpandRecordColumn(#"Expanded Value", "Value", {"id", "firstname", "surname", "born", "died", "bornCountry", "bornCountryCode", "bornCity", "diedCountry", "diedCountryCode", "diedCity", "gender", "prizes"}, {"Value.id", "Value.firstname", "Value.surname", "Value.born", "Value.died", "Value.bornCountry", "Value.bornCountryCode", "Value.bornCity", "Value.diedCountry", "Value.diedCountryCode", "Value.diedCity", "Value.gender", "Value.prizes"})
in
    #"Expanded Value1"

#"Expanded Value1"表达式的第二个和第三个参数具有硬编码的列名称;此代码是通过用户界面生成的。

我想重用脚本。问题是,每当源文件更改时——具有不同的列名或新的列名——我都会遇到错误。一种解决方法是重新生成脚本。

如果我可以将第二个和第三个参数指定为将在运行时动态评估的表达式,我可以避免这个问题。

到目前为止,我的尝试都失败了:我将不胜感激有关如何将第二个和第三个参数替换为代码或表达式的任何提示。

标签: excelpowerquerym

解决方案


我认为您可以使用Record.FieldNames动态生成该列表。

像这样的东西:

Table.ExpandRecordColumn(
    #"Expanded Value",
    "Value",
    Record.FieldNames([Value]),
    List.Transform(Record.FieldNames([Value]), each "Value." & _)
)

编辑:正如 AAsk 指出的那样,上述语法是不正确的,因为它试图在表级操作中提取行上下文。而不是[Value]每一行,我们需要使用一个有代表性的应用于整个列,并且#"Expanded Value"{0}[Value]从第一行开始的记录 Picking 应该可以工作。

Table.ExpandRecordColumn(
    #"Expanded Value",
    "Value",
    Record.FieldNames(#"Expanded Value"{0}[Value]),
    List.Transform(Record.FieldNames(#"Expanded Value"{0}[Value]), each "Value." & _)
)

List.Transform有在每个"Value."列名的开头添加,但使用Record.FieldNames(#"Expanded Value"{0}[Value])两次就可以了。


推荐阅读