如何基于Excel单元格值动态筛选Power Query中的country_name列(空值时不应用筛选)
如何基于Excel单元格值动态筛选Power Query中的country_name列(空值时不应用筛选)
嗨,看起来你需要实现一个灵活的动态筛选需求——根据Excel单元格的值过滤Power Query里的country_name列,而且单元格为空时就跳过这个筛选对吧?我来帮你调整代码,完美实现这个逻辑:
步骤1:读取Excel单元格的筛选值
首先你得在Power Query里获取目标单元格的值,假设你的筛选值放在Sheet1的A1单元格(如果实际位置不同,替换成你的工作表名和列名即可)。我们先定义一个变量来存储这个值:
CountryFilter = Excel.CurrentWorkbook(){[Name="Sheet1"]}[Content]{0}[Column1]
小提示:如果你的单元格所在列有自定义列名(比如把A列命名为"CountryFilter"),就把
[Column1]换成[CountryFilter];如果担心用户输入空格,还可以用Text.Trim()处理:CountryFilter = Text.Trim(Excel.CurrentWorkbook(){[Name="Sheet1"]}[Content]{0}[Column1]),这样空白或空格都会被当成空值处理。
步骤2:修改现有代码,添加动态筛选逻辑
接下来,在你现有的#"Filtered Rows"步骤之后,添加一个动态筛选的步骤。核心逻辑很简单:如果单元格值为空,就直接保留之前的筛选结果;如果有值,就过滤出country_name匹配的行。
修改后的完整代码如下:
let Source = OData.Feed("https://data.woodmac.com/query/upstream_weekly/imp-met/odata", null, [Implementation="2.0"]), field_company_net_annual_production_kbd_table = Source{[Name="field_company_net_annual_production_kbd",Signature="table"]}[Data], #"Filtered Rows" = Table.SelectRows(field_company_net_annual_production_kbd_table, each ([year] = 2024) and ([field_is_top_level] = "Y")), // 读取Excel单元格的筛选值 CountryFilter = Excel.CurrentWorkbook(){[Name="Sheet1"]}[Content]{0}[Column1], // 动态筛选country_name列:空值时跳过筛选 #"Filtered Country" = if CountryFilter = null or CountryFilter = "" then #"Filtered Rows" else Table.SelectRows(#"Filtered Rows", each [country_name] = CountryFilter), #"Removed Columns" = Table.RemoveColumns(#"Filtered Country",{"id_field_company_metrics", "id_field", "id_field_group", "field_is_top_level", "field_is_discovery", "id_country", "i..."}) in #"Removed Columns"
代码逻辑说明
- 我们先把单元格的值读取到
CountryFilter变量中 - 用
if...else做判断:如果CountryFilter是null或者空白字符串,就直接使用之前的#"Filtered Rows"结果;否则就筛选出country_name等于CountryFilter的行 - 最后让后续的
Removed Columns步骤基于新的筛选结果表#"Filtered Country"来执行
这样调整后,你的Power Query就会根据单元格内容自动切换筛选状态啦!
备注:内容来源于stack exchange,提问作者James Dunn
相关产品推荐
相关产品推荐

