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

Power Query列表与表格转换错误:多表合并失败求助

Power Query多表格合并「值不匹配」报错解决方法

我想把多个表格合并为单个表格,文件路径存储在名为DataSource的表格中。使用以下代码时出现表达式错误:值不匹配,无法完成表格合并。我是Power Query新手,尝试调整代码但未解决,恳请帮助:

let
    // Step 1: Load the DataSource table
    DataSourceTable = Excel.CurrentWorkbook(){[Name="DataSource"]}[Content],

    // Step 2: Check if the table is empty
    IsTableEmpty = Table.IsEmpty(DataSourceTable),

    // Step 3: Extract the column containing the paths if the table is not empty
    WorkbookPaths = if IsTableEmpty then {} else Table.Column(DataSourceTable, "file path"),

    // Helper function to load worksheet data from a given file path (URL) with error handling
    LoadWorksheet = (url as text) as table =>
        let
            Source = try Excel.Workbook(Web.Contents(url)) otherwise #table({}, {}),
            WorkbookData = if Source[HasError] then #table({}, {}) else Source[Value],
            // Select the sheet named "Data"
            Sheet = Table.SelectRows(WorkbookData, each [Kind] = "Sheet" and [Name] = "Data"),
            // Check if the sheet exists and extract data if it does
            SheetData = if Table.IsEmpty(Sheet) then #table({}, {}) else Sheet{0}[Data]
        in
            SheetData,

    // Step 4: Load and combine all worksheets into a single table if paths are available
    CombinedTable = if IsTableEmpty then #table({}, {}) else List.Accumulate(
        WorkbookPaths, 
        Table.FromRecords({}), 
        (state, current) => Table.Combine({state, LoadWorksheet(current)})
    )
in
    CombinedTable

错误原因分析

  1. 路径加载函数误用:如果是本地文件路径,Web.Contents不适用,应该用File.Contents,错误的加载方式会返回异常结构,引发类型不匹配。
  2. 初始空表结构不兼容:Table.FromRecords({})是无列空表,后续加载的工作表有列,Table.Combine无法合并结构差异大的表。
  3. 异常处理类型混乱:try...otherwise中返回的#table({}, {})与Excel.Workbook返回的记录类型不匹配,导致后续Source[HasError]访问失败。

修正后的代码

let
    // 加载存储路径的DataSource表
    DataSourceTable = Excel.CurrentWorkbook(){[Name="DataSource"]}[Content],
    // 检查路径表是否为空
    IsTableEmpty = Table.IsEmpty(DataSourceTable),
    // 提取文件路径列(本地路径用File.Contents,网络路径替换为Web.Contents)
    WorkbookPaths = if IsTableEmpty then {} else Table.Column(DataSourceTable, "file path"),

    // 加载指定文件中"Data"工作表的函数,统一处理异常与列结构
    LoadWorksheet = (filePath as text) as table =>
        let
            // 本地文件用File.Contents,网络文件请改为Web.Contents
            Source = try Excel.Workbook(File.Contents(filePath)) otherwise null,
            // 仅加载成功时继续,否则返回空表(需与目标表结构一致)
            WorkbookData = if Source <> null then Source else #table(type table [列1=text, 列2=number, 列3=date], {}),
            // 筛选名为"Data"的工作表
            Sheet = Table.SelectRows(WorkbookData, each [Kind] = "Sheet" and [Name] = "Data"),
            // 获取工作表数据,不存在则返回结构匹配的空表(替换示例列为你的实际列)
            SheetData = if Table.IsEmpty(Sheet) then #table(type table [列1=text, 列2=number, 列3=date], {}) else Sheet{0}[Data]
        in
            SheetData,

    // 合并所有表格,用第一个表的结构作为初始累加器
    CombinedTable = if IsTableEmpty then #table({}, {}) else 
        let
            FirstTable = LoadWorksheet(List.First(WorkbookPaths)),
            RestTables = List.Skip(WorkbookPaths),
            FinalTable = List.Accumulate(RestTables, FirstTable, (state, current) => Table.Combine({state, LoadWorksheet(current)}))
        in
            FinalTable
in
    CombinedTable

关键修改说明

  • 替换Web.Contents为File.Contents(本地文件场景),确保路径加载正确。
  • 统一异常返回类型,避免类型混乱导致的错误。
  • 用第一个有效工作表的结构作为初始合并表,确保后续合并的表结构一致。
  • 工作表不存在时返回与目标结构匹配的空表,避免合并时结构不匹配。

额外注意事项

  • 确保所有要合并的Data工作表列名、数据类型完全一致,这是Table.Combine的核心要求。
  • 若不确定目标列结构,可先加载一个正确的工作表,复制其表类型替换到代码的空表定义中。
  • 检查DataSource表中的路径是否完整有效(本地路径需为绝对路径,如C:\Users\XXX\Documents\test.xlsx)。

内容的提问来源于stack exchange,提问作者Hardatwork84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:05:01