Power Query遍历列单元格:批量处理网站数据及分表加载咨询
批量处理Power Query中多个网站数据的解决方案
没问题,我来帮你一步步搞定这三个问题,针对你用Power Query处理Table3里网站列表的需求,逐个解答:
1. 可以引入循环批量处理所有网站
当然可以,最优雅的方式是把处理单个网站的逻辑封装成自定义函数,然后遍历Table3里的所有网站URL批量执行。这样后续Table3新增网站时,刷新查询就能自动处理,不用改代码。
修改后的完整代码如下:
let // 定义处理单个网站的自定义函数 GetWebsiteData = (url as text) => let Source = Web.Page(Web.Contents(url)), Data0 = Source{0}[Data], #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Date", type date}, {"Open", type number}, {"High", type number}, {"Low", type number}, {"Close", type number}, {"Volume", type number}, {"Market Cap", type number}}), #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Market Cap", "Open", "High", "Low"}), #"Sorted Rows" = Table.Sort(#"Removed Columns",{{"Date", Order.Ascending}}) in #"Sorted Rows", // 获取Table3中的所有网站数据 Parameter = Excel.CurrentWorkbook(){[Name="Table3"]}[Content], // 过滤掉空的URL(避免报错) WebsiteList = Table.SelectRows(Parameter, each not Text.IsNullOrEmpty([Value]))[Value], // 批量处理每个URL,得到包含所有结果表的列表 ProcessedData = List.Transform(WebsiteList, each GetWebsiteData(_)), // 可选:如果需要把所有结果合并成一个表,就用Table.Combine;如果要保留单独表的列表,直接返回ProcessedData即可 CombinedTable = Table.Combine(ProcessedData) in CombinedTable
2. 若不想用循环,可手动修改代码索引依次处理
这个操作很简单,只需要修改原代码中指定URL的那一行索引值即可。
原代码中这一行:
URL= Parameter{1}[Value]
注意:Power Query中列表的索引是从0开始的,所以:
- 处理Table3中第一行的网站,改成
Parameter{0}[Value] - 处理第二行的网站,改成
Parameter{1}[Value] - 以此类推,每次修改大括号里的数字,就能切换处理不同的网站。
这种方法适合网站数量很少的场景,缺点是每个网站都要单独复制修改代码,效率较低。
3. 批量处理后可以将每个网站的结果加载至不同工作表
有两种实用的方法可以实现:
方法一:结合Power Query连接手动加载
- 用上面批量处理的代码,把
ProcessedData作为最终输出(也就是把最后一行的CombinedTable改成ProcessedData),然后关闭Power Query编辑器时选择仅创建连接。 - 转到Excel的「数据」选项卡,点击「连接」,右键点击这个新建的连接,选择「加载到」。
- 在弹出的窗口中,选择「表」,然后指定工作表名称(比如"网站1数据"),点击确定;重复这个步骤,每次在加载时选择列表中的不同索引(比如索引0对应第一个网站,索引1对应第二个),就能把每个网站的数据加载到单独的工作表。
方法二:合并表后用Excel拆分工作表
如果不想手动重复加载,可以先把所有网站的数据合并成一个带标识的表,再用Excel的拆分功能自动生成工作表:
修改自定义函数,给每个结果表加上来源URL的列:
let GetWebsiteData = (url as text) => let Source = Web.Page(Web.Contents(url)), Data0 = Source{0}[Data], #"Changed Type" = Table.TransformColumnTypes(Data0,{{"Date", type date}, {"Open", type number}, {"High", type number}, {"Low", type number}, {"Close", type number}, {"Volume", type number}, {"Market Cap", type number}}), #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Market Cap", "Open", "High", "Low"}), #"Sorted Rows" = Table.Sort(#"Removed Columns",{{"Date", Order.Ascending}}), // 添加来源URL列,用于区分不同网站的数据 #"Added Source URL" = Table.AddColumn(#"Sorted Rows", "来源网站", each url) in #"Added Source URL", Parameter = Excel.CurrentWorkbook(){[Name="Table3"]}[Content], WebsiteList = Table.SelectRows(Parameter, each not Text.IsNullOrEmpty([Value]))[Value], ProcessedData = List.Transform(WebsiteList, each GetWebsiteData(_)), CombinedTable = Table.Combine(ProcessedData) in CombinedTable
把这个合并后的表加载到Excel中,选中「来源网站」列,转到「数据」选项卡,点击「分析」组里的拆分工作表,Excel会自动把每个网站的数据分到单独的工作表中,工作表名称就是对应的网站URL(你也可以提前在Table3里加一列网站名称,用名称来拆分更友好)。
内容的提问来源于stack exchange,提问作者Olimpiu Horj
相关产品推荐
相关产品推荐

