将Excel查询复制到Power BI时遇错误:无法找到Excel表'Request'
解决Power BI复制Excel Power Query代码的报错问题
我帮你拆解下这个问题,核心是Excel和Power BI的数据源上下文完全不一样,导致原来的代码在Power BI里跑不通,咱们一步步解决:
为什么会报错?
你遇到的Expression.Error: We couldn't find an Excel table named 'Request'错误,本质原因是:
- 在Excel里,
Excel.CurrentWorkbook()指的是你正在编辑的那个Excel文件,能直接读取里面的'Request'、'CurrentDate'这些命名表; - 但到了Power BI里,
Excel.CurrentWorkbook()指向的是Power BI内部的临时工作簿,根本不存在你Excel里的那些表,自然找不到。
你提到的日期判断错误,也是同一个道理——Power BI读不到Excel表中的日期字段。
分步解决办法
1. 替换Excel表引用为Power BI能识别的内容
首先得把原来依赖Excel表的参数(文件路径、起始日期、当前日期)替换成Power BI可用的形式,有两种方式:
方式一:手动定义参数(推荐,灵活易维护)
在Power BI查询编辑器里点击「管理参数」,创建几个参数:
Filepath1:填Excel中'Request'表第3行的文件路径(对应原代码里的{2}[Path])Filepath2:填Excel中'Request'表第4行的文件路径(对应原代码里的{3}[Path])StartDate:填Excel中'Request'表第6行的起始日期(对应原代码里的{5}[start])CurrentDate:填你需要的当前日期(可以设成动态的DateTime.LocalNow(),或者固定日期)
方式二:直接硬编码(适合临时测试)
如果只是临时用,直接把路径和日期写死在代码里就行,比如:
let Filepath1 = "X:\你的第一个文件路径.txt", Filepath2 = "X:\你的第二个文件路径.txt", StartDate = #date(2024,5,1), CurrentDate = #date(2024,5,20)
2. 修改日期判断逻辑
把原来依赖Excel表的日期判断,换成咱们定义的参数,修改后的逻辑是:
#"Appended Query" = if Date.Month(StartDate) = Date.Month(CurrentDate) then Source else Table.Combine({Source, Csv.Document(File.Contents(Filepath2),null,{0, 55, 62, 134, 145, 386, 398, 410},null,1200)})
3. 完整可运行的代码示例
这里用参数的方式给出完整代码,你可以直接复制到Power BI查询编辑器里,替换成自己的参数值:
let // 替换成你自己的参数值,或者用「管理参数」统一配置 Filepath1 = "X:\第一个文件的完整路径.txt", Filepath2 = "X:\第二个文件的完整路径.txt", StartDate = #date(2024,5,1), CurrentDate = DateTime.LocalNow(), // 动态获取当前日期,也可以改成固定日期 // 读取第一个CSV文件 Source = Csv.Document(File.Contents(Filepath1),null,{0, 55, 62, 134, 145, 386, 398, 410},null,1200), // 根据月份判断是否追加第二个文件 #"Appended Query" = if Date.Month(StartDate) = Date.Month(CurrentDate) then Source else Table.Combine({Source, Csv.Document(File.Contents(Filepath2),null,{0, 55, 62, 134, 145, 386, 398, 410},null,1200)}) in #"Appended Query"
额外优化小技巧
- 如果需要动态读取Excel里的参数,可以在Power BI中直接导入包含'Request'和'CurrentDate'表的Excel文件,然后在查询里引用这个导入的表,这样不用手动改参数;
- 日期格式尽量用Power Query标准格式
#date(年,月,日),避免因格式不兼容报错; - 给参数设置「从文件加载」的选项,以后更新路径或日期直接改Excel文件就行,不用动代码。
内容的提问来源于stack exchange,提问作者user245255




