power query提供三种自动合并多源数据的方法:一、从文件夹批量导入合并同类结构表格;二、通过参数化路径连接多个固定名称工作簿;三、建立动态日期范围驱动的sql或web数据自动合并。

如果您在Excel中需要定期将多个来源的数据自动合并并保持更新,则Power Query提供了无需手动重复操作的高效解决方案。以下是实现此目标的具体方法:
一、从文件夹批量导入并合并同类结构表格
该方法适用于多个Excel或CSV文件存放在同一文件夹中,且各文件表头一致、数据结构相同。Power Query可自动识别文件夹内所有匹配文件,并将其内容纵向堆叠合并,后续刷新即可加载新增文件数据。
1、在Excel中点击【数据】选项卡,选择【获取数据】→【从文件】→【从文件夹】。
2、在弹出窗口中浏览并选中存放数据文件的文件夹,点击【确定】。
3、在导航器中勾选【Content】列右侧的复选框,点击【转换数据】进入Power Query编辑器。
4、在查询编辑器中,右键【Content】列,选择【提取值】→【不带分隔符】,确认后该列将变为二进制数据标识。
5、选中【Content】列,点击【转换】→【使用第一行作为标题】,确保列名正确识别。
6、点击【主页】→【关闭并上载】,数据将自动合并至新工作表;此后只要新增符合命名/格式规则的文件到该文件夹,刷新查询即可更新合并结果。
二、通过参数化路径连接多个固定名称工作簿
该方法适用于已知具体文件路径与名称(如“销售_202401.xlsx”“销售_202402.xlsx”)的多个工作簿,且各工作簿中目标工作表结构一致。通过构建参数表与自定义函数,可实现灵活增删源文件并一键刷新。
1、新建一个名为“SourceList”的工作表,在A1单元格输入“FilePath”,在A2开始逐行列出每个源文件的完整路径,例如:C:\Data\销售_202401.xlsx。
2、选中该列数据区域,按Ctrl+T创建为Excel表格,并勾选【表包含标题】,命名为“Table_Source”。
3、在Power Query编辑器中,点击【高级编辑器】,粘贴以下M代码(替换原有代码):
let Source = Excel.CurrentWorkbook(){[Name="Table_Source"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"FilePath", type text}}),
#"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "Data", each Excel.Workbook(File.Contents([FilePath]), null, true)),
#"Expanded Data" = Table.ExpandTableColumn(#"Invoked Custom Function", "Data", {"Name", "Data"}, {"SheetName", "Data"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded Data", each ([SheetName] = "汇总表")),
#"Expanded Data1" = Table.ExpandTableColumn(#"Filtered Rows", "Data", Table.ColumnNames(#"Filtered Rows"{0}[Data])),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Data1",{"FilePath", "SheetName"})
in #"Removed Columns"
4、点击【完成】,确认数据结构无误后关闭并上载至工作表。
5、后续如需新增数据源,只需在“SourceList”表末尾添加新路径,然后右键查询→【刷新】即可自动纳入合并范围。
三、建立动态日期范围驱动的SQL或Web数据自动合并
该方法适用于从数据库或API接口按日期维度拉取增量数据(如每日销售记录),通过参数化日期生成多个查询实例,再统一合并。所有日期逻辑由Power Query内部计算控制,无需手动修改连接字符串。
1、在Power Query编辑器中,点击【高级编辑器】,新建一个查询,命名为“DateRange”,输入以下M代码:
let StartDate = #date(2024, 1, 1),
EndDate = Date.StartOfWeek(DateTime.LocalNow(), Day.Sunday),
ListOfDates = List.Dates(StartDate, Duration.Days(EndDate - StartDate) + 1, #duration(1, 0, 0, 0)),
#"Converted to Table" = Table.FromList(ListOfDates, Splitter.SplitByNothing(), {"Date"}),
#"Changed Type" = Table.TransformColumnTypes(#"Converted to Table",{{"Date", type date}})
in #"Changed Type"
2、新建第二个查询,命名为“FetchByDate”,输入如下代码(以SQL Server为例,需替换服务器名、数据库名、表名):
let Source = (date as date) => let
dateString = Date.ToText(date, "yyyy-MM-dd"),
Source = Sql.Database("SERVER_NAME", "DB_NAME", [Query="SELECT * FROM sales WHERE sale_date = '" & dateString & "'"])
in Source
3、回到“DateRange”查询,选中【Date】列,点击【转换】→【运行自定义函数】,在弹出框中选择“FetchByDate”,点击【确定】。
4、新生成的列名为“FetchByDate”,点击其右上角展开图标,勾选全部字段并取消勾选【使用原始列名作为前缀】。
5、删除原【Date】列及空行,点击【关闭并上载】,所得结果即为按日期自动拉取并合并的全量数据集。










