如何在Power Query中合并列数与列布局不同的Excel工作表
方案可行性及优化实现
你的方案完全可行,不过更推荐用列名映射+标准化结构的方式替代手动移列,这样能适配自动导出文件可能出现的列顺序变动,流程稳定性更强。以下是具体实现步骤和代码:
核心思路
- 识别每个工作簿对应的表类型(BillTo/ShipTo)
- 对BillTo表:添加空的
SHIPTO_CUST列,保留原有结构 - 对ShipTo表:
- 将
BILLTO_CUST重命名为CUSTOMER_NUMBER(与BillTo的对应字段匹配) - 仅保留BillTo表包含的列名,缺失的列自动补空
- 将
- 合并两个标准化后的表,统一使用BillTo的表头结构
完整Power Query代码
let // 源文件夹路径 Source = Folder.Files("C:\Users\ME\OneDrive\Contact Template\Current Contacts"), // 加载每个工作簿的工作表数据并标准化结构 #"Added Custom" = Table.AddColumn(Source, "Standardized Data", each let // 加载工作簿并取第一个工作表数据 Workbook = Excel.Workbook(File.Contents([Folder Path] & [Name]), null, true), SheetData = Table.First(Workbook[Data]), // 识别表类型(按文件名判断,可根据实际调整) TableType = if Text.Contains([Name], "BillTo") then "BillTo" else "ShipTo", // 标准化BillTo:添加空的SHIPTO_CUST列 ProcessBillTo = if TableType = "BillTo" then Table.AddColumn(SheetData, "SHIPTO_CUST", each null) else // 标准化ShipTo:重命名字段+对齐BillTo列结构 let RenameKeyColumn = Table.RenameColumns(SheetData,{{"BILLTO_CUST", "CUSTOMER_NUMBER"}}), // 替换为实际BillTo的所有列名 TargetColumns = {"CUSTOMER_NUMBER", "CONTACT_NAME", "PHONE", "EMAIL", "SHIPTO_CUST", "ADDRESS"}, // 保留目标列,缺失列自动补空 AlignColumns = Table.SelectColumns(RenameKeyColumn, TargetColumns, MissingField.UseNull) in AlignColumns in ProcessBillTo), // 展开标准化后的数据表 #"Expanded Standardized Data" = Table.ExpandTableColumn(#"Added Custom", "Standardized Data", List.Distinct(List.Combine(Table.Column(#"Added Custom", "Standardized Data")))), // 提升第一行为表头(统一使用BillTo的表头结构) #"Promoted Headers" = Table.PromoteHeaders(#"Expanded Standardized Data", [PromoteAllScalars=true]), // 移除无关系统列 #"Removed Unnecessary Columns" = Table.RemoveColumns(#"Promoted Headers", {"Extension", "Date accessed", "Date modified", "Date created", "Attributes"}) in #"Removed Unnecessary Columns"
关键说明
- 需将代码中的
TargetColumns替换为实际BillTo表的完整列名列表,确保结构完全匹配 - 表类型识别逻辑可根据实际调整(比如改用工作表名判断:
TableType = if Table.First(Workbook[Name]) = "BillTo" then "BillTo" else "ShipTo") - 该流程全程自动化,无需手动编辑导出文件,可重复运行适配新生成的文件
内容的提问来源于stack exchange,提问作者Dizzy49
相关产品推荐
相关产品推荐

