You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:54:15