Power Query使用命名范围参数读文件触发Formula.Firewall报错怎么办
场景与复现配置
基于Excel命名范围创建Power Query可调用参数,拼接生成动态文件路径读取txt/csv/xlsx格式文件时触发报错,相关配置如下:
- Excel工作表内定义命名范围
p_YearMonth,对应公式:
=TEXT(EOMONTH(TODAY();-1);"yyyymm")
- Power Query中新建同名查询
p_YearMonth读取该命名范围作为参数,对应M代码:
let Source = Excel.CurrentWorkbook(){[Name="p_YearMonth"]}[Content], #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}), Column1 = #"Changed Type"{0}[Column1] in Column1
- 写死固定路径的文件读取查询可正常运行,对应M代码:
let Source = Csv.Document(File.Contents("D:\myfiles\202205\test.txt"),[Delimiter=";", Columns=6, Encoding=1252, QuoteStyle=QuoteStyle.None]) in Source
- 拼接
p_YearMonth参数构造动态路径的查询运行失败,对应M代码:
let Source = Csv.Document(File.Contents("D:\myfiles\" & p_YearMonth & "\test.txt"),[Delimiter=";", Columns=6, Encoding=1252, QuoteStyle=QuoteStyle.None]) in Source
运行时返回报错信息:
Formula.Firewall: Query 'Query1' (step 'Source') references other queries or steps, so it may not directly access a data source. Please rebuild this data combination.
问题原因
该报错由Power Query内置的公式防火墙安全机制触发:防火墙默认禁止在直接访问外部数据源的步骤中,直接引用来自其他数据源的数值。本次场景中,File.Contents属于访问本地磁盘的外部数据源操作,p_YearMonth是读取当前Excel工作簿命名范围生成的独立查询、属于工作簿内部数据源,二者在同一个Source步骤中直接拼接计算,会被判定为存在跨数据源数据泄露风险,因此被拦截。写死固定路径时不存在跨数据源引用,因此可正常运行。
修正方案
可按需选择以下两种方案解决:
方案1:拆分查询步骤,隔离不同数据源的计算逻辑
禁止在调用File.Contents的同一步骤内直接拼接其他查询返回的参数值,将路径拼接逻辑单独拆分为独立步骤,让公式防火墙可以逐步骤完成数据源安全评估。修正后的读取查询M代码如下:
let // 先完成内部参数读取与路径拼接计算 TargetFilePath = "D:\myfiles\" & p_YearMonth & "\test.txt", // 再单独调用外部数据源访问接口,该步骤内不引用其他独立查询 Source = Csv.Document(File.Contents(TargetFilePath),[Delimiter=";", Columns=6, Encoding=1252, QuoteStyle=QuoteStyle.None]) in Source
若步骤拆分后仍报错,可打开Power Query编辑器,依次进入文件 > 选项和设置 > 选项 > 隐私分类,勾选「始终忽略隐私级别设置」,保存后重启Excel即可。
方案2:使用Power Query原生参数绑定Excel单元格,不生成独立参数查询
无需单独创建查询读取命名范围,直接在Power Query功能区点击「管理参数 > 新建参数」,参数值来源选择「从单元格获取」,直接绑定存放年月值的Excel命名单元格。这类原生参数不会被识别为独立数据源,拼接路径时不会触发防火墙拦截。
内容的提问来源于stack exchange,提问作者Elio Fernandes

