如何使用PowerQuery批量将表格扁平化为指定顺序的单行结构?
Power Query 批量表扁平化解决方案
单表转换核心逻辑(解决列顺序问题)
按以下步骤处理单表即可保证输出列顺序符合先遍历单个Aspect的所有CAT,再遍历下一个Aspect的规则:
- 导入单表后先给两类列标记固定顺序:
- 提取所有CAT列(CAT1~CAT5)按你需要的拼接顺序生成带索引的顺序表,索引从1开始递增
- 提取所有Aspect列按你需要的拼接顺序生成带索引的顺序表,索引从1开始递增
- 选中所有CAT列执行「逆透视其他列」操作,得到包含CAT列名、Aspect列名、对应值的三行结构
- 给每行匹配CAT顺序、Aspect顺序的索引值
- 新增自定义列拼接新列名,公式为
[Aspect列名] & ":" & [CAT列名] - 先按Aspect顺序升序排序,再按CAT顺序升序排序,保证后续转置后列顺序符合要求
- 仅保留新列名、值两列,执行转置、提升首行作为表头操作,即可得到顺序正确的单行结果
批量处理50个工作表代码模板
直接套用以下M代码即可实现全量自动化处理,按需替换标注的自定义参数即可:
let // 读取当前工作簿所有工作表 Source = Excel.CurrentWorkbook(), // 筛选仅保留Table1到Table50的工作表 FilterTargetTables = Table.SelectRows(Source, each Text.StartsWith([Name], "Table") and Value.FromText(Text.AfterDelimiter([Name], "Table")) >=1 and Value.FromText(Text.AfterDelimiter([Name], "Table")) <=50 ), // 单表处理自定义函数 ProcessSingleTable = (InputTable as table) as table => let // ---------- 此处修改为你实际的CAT列名,顺序按你需要的拼接顺序排列 ---------- CATList = {"CAT1","CAT2","CAT3","CAT4","CAT5"}, // 生成CAT顺序索引 CATOrderTable = Table.AddIndexColumn(Table.FromList(CATList, Splitter.SplitByNothing(), {"CAT名称"}), "CAT顺序", 1, 1), // 自动提取所有Aspect列(除CAT列外的所有列) AspectList = List.RemoveItems(Table.ColumnNames(InputTable), CATList), // 生成Aspect顺序索引,顺序和原表Aspect列从左到右顺序一致 AspectOrderTable = Table.AddIndexColumn(Table.FromList(AspectList, Splitter.SplitByNothing(), {"Aspect名称"}), "Aspect顺序", 1, 1), // 逆透视得到行列对应关系 UnpivotAspect = Table.UnpivotOtherColumns(InputTable, CATList, "Aspect名称", "Aspect值"), UnpivotCAT = Table.UnpivotColumns(UnpivotAspect, CATList, "CAT名称", "最终值"), // 关联顺序索引 MergeCATOrder = Table.NestedJoin(UnpivotCAT, {"CAT名称"}, CATOrderTable, {"CAT名称"}, "CAT索引", JoinKind.LeftOuter), ExpandCATOrder = Table.ExpandTableColumn(MergeCATOrder, "CAT索引", {"CAT顺序"}, {"CAT顺序"}), MergeAspectOrder = Table.NestedJoin(ExpandCATOrder, {"Aspect名称"}, AspectOrderTable, {"Aspect名称"}, "Aspect索引", JoinKind.LeftOuter), ExpandAspectOrder = Table.ExpandTableColumn(MergeAspectOrder, "Aspect索引", {"Aspect顺序"}, {"Aspect顺序"}), // 生成新列名并排序 AddNewColumnName = Table.AddColumn(ExpandAspectOrder, "新列名", each [Aspect名称] & ":" & [CAT名称]), SortByRule = Table.Sort(AddNewColumnName,{{"Aspect顺序", Order.Ascending}, {"CAT顺序", Order.Ascending}}), // 转置生成单行结果 KeepNeededColumns = Table.SelectColumns(SortByRule,{"新列名", "最终值"}), TransposeTable = Table.Transpose(KeepNeededColumns), PromoteHeader = Table.PromoteHeaders(TransposeTable, [PromoteAllScalars=true]) in PromoteHeader, // 批量应用转换规则 AddProcessResult = Table.AddColumn(FilterTargetTables, "处理结果", each ProcessSingleTable([Data])), // 合并所有表的处理结果 CombineAllResults = Table.Combine(AddProcessResult[处理结果]) in CombineAllResults
内容的提问来源于stack exchange,提问作者Nicolás Lope de Barrios
相关产品推荐
相关产品推荐

