如何在Power Query中拼接表中所有列的字段值并生成新列(支持任意列数)
如何在Power Query中拼接表中所有列的字段值并生成新列(支持任意列数)
嘿,这个需求我熟!要实现任意列数下自动拼接成列名=值&列名=值格式的新列,完全不用手动指定每一列,用Power Query的列表函数就能轻松搞定,完美适配列数变化的场景。
直接上可复用的完整M代码,你只需要替换数据源的表名就行:
let // 加载原始数据表,把Table1替换成你实际的表名称 Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], // 自动获取当前表的所有列名,适配列数变化 ColumnNames = Table.ColumnNames(Source), // 添加目标新列,核心逻辑在这里 AddConcatenatedColumn = Table.AddColumn(Source, "x", (currentRow) => let // 遍历所有列名,生成「列名=对应值」的字符串列表 NameValuePairs = List.Transform(ColumnNames, each _ & "=" & Text.From(currentRow[_])), // 用&符号把列表里的所有片段拼接成完整字符串 ConcatenatedText = Text.Combine(NameValuePairs, "&") in ConcatenatedText ) in AddConcatenatedColumn
关键逻辑拆解
我给你把核心部分拆解开讲,方便你理解和修改:
- 自动识别列名:
ColumnNames = Table.ColumnNames(Source)会自动抓取当前表的所有列名,不管你后续加列、删列,这段代码都不用改。 - 逐行处理数据:这里没有用普通的
each,而是用了(currentRow) =>的写法,这样我们能在函数内部直接拿到当前行的所有数据,方便调用每一列的值。 - 生成键值对列表:
List.Transform遍历每个列名,把列名和当前行对应的值拼接成列名=值的格式,Text.From是为了把数字、日期这类非文本类型转成文本,避免类型不匹配报错。 - 拼接成最终字符串:
Text.Combine用指定的分隔符(这里是&)把列表里的所有键值对片段连成一个完整的字符串。
可选优化:处理空值场景
如果你的表中存在空值,不想让拼接结果出现列名=这种空片段,可以给逻辑加个空值判断,自动跳过空值列:
把NameValuePairs那行替换成下面的代码即可:
NameValuePairs = List.RemoveNulls(List.Transform(ColumnNames, each if currentRow[_] <> null then _ & "=" & Text.From(currentRow[_]) else null)),
这样就搞定啦!不管你的表是2列还是10列,这段代码都能自动适配,完全不用手动调整列名~




