如何用Power Query合并Excel同工作表内多个非表格式数据区域
Power Query 动态合并同工作表横向非格式化同表头数据块方案
本方案全程不修改原始Excel文件,所有逻辑内置在Power Query中,后续替换新月度文件后仅需点击刷新即可得到合并结果,自动适配数据行数变化、新增同表头横向数据块的场景。
实现步骤
- 导入原始数据:从Excel工作簿获取数据时,选中存放多数据块的目标工作表,不要勾选「我的表格有标题」,将整个工作表作为无结构原始区域加载,完全不依赖原文件内的格式化表格定义。
- 定位数据块位置:将导入的完整工作表数据转为「行号-列号-单元格值」的长表结构,以第一列的固定表头文本作为定位锚点,筛选出所有等于该锚点值的单元格,即可得到每个横向数据块的起始列号、统一表头所在行号。
- 批量提取数据块:遍历所有识别到的数据块起始列,按固定列数(和表头列数一致)提取对应连续列,跳过表头行后向下提取所有连续非空行,自动匹配统一表头,自动剔除块间空列、块尾空行。
- 合并输出:将所有提取到的结构化数据块纵向追加合并,完成字段类型转换后即可加载使用。
核心M代码(可直接修改参数复用)
let // 下方3个参数替换为你实际的文件路径、工作表名、首列锚点表头文本即可 文件路径 = "C:\你的月度数据文件.xlsx", 目标工作表名 = "存放多数据块的工作表名", 首列锚点头 = "数据块第一列的固定列名", 源 = Excel.Workbook(File.Contents(文件路径), null, true){[Item=目标工作表名,Kind="Sheet"]}[Data], 加行号 = Table.AddIndexColumn(源, "行号", 0, 1, Int64.Type), 转长表 = Table.UnpivotOtherColumns(加行号, {"行号"}, "原列名", "单元格值"), 加列号 = Table.AddColumn(转长表, "列号", each List.PositionOf(Table.ColumnNames(源), [原列名]), Int64.Type), 定位表头 = Table.SelectRows(加列号, each [单元格值] = 首列锚点头), 表头行号 = List.Min(定位表头[行号]), 单块列数 = List.NonNullCount(List.Transform({0..Table.ColumnCount(源)-1}, each 源{表头行号}{_})), 块起始列列表 = List.Distinct(定位表头[列号]), 批量提取块 = List.Transform(块起始列列表, (起始列)=> let 选列 = Table.SelectColumns(源, List.Transform({起始列..起始列+单块列数-1}, each Table.ColumnNames(源){_})), 去表头前空行 = Table.Skip(选列, 表头行号+1), 提表头 = Table.PromoteHeaders(去表头前空行, [PromoteAllScalars=true]), 去空行 = Table.SelectRows(提表头, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {null, ""}))) in 去空行 ), 合并结果 = Table.Combine(批量提取块) in 合并结果
若需要适配文件路径动态变化的场景,可以把「文件路径」参数改为从单元格读取值,后续仅需在单元格更新新文件路径即可刷新,不需要进入PQ编辑器修改配置。
内容的提问来源于stack exchange,提问作者MmVv
相关产品推荐
相关产品推荐

