Power Query中用List.Generate循环调用分页API并合并结果
在Power Query中用List.Generate循环调用分页API并合并结果
核心思路
先调用一次API拿到总页数等元数据,接着用List.Generate生成包含所有分页数据的列表,最后把列表里的所有表格合并成一个完整输出表。
完整实现代码
第一步:定义单页API请求函数
先写一个自定义函数负责获取单页数据,同时返回分页元数据:
let GetAPIPage = (pageNumber as number) as record => let // 替换成你的API地址,这里假设分页参数是page,每页固定1000条 APIUrl = "https://your-api-endpoint.com/data?page=" & Text.From(pageNumber) & "&pageSize=1000", // 发送HTTP请求并解析JSON RawResponse = Web.Contents(APIUrl), ParsedResponse = Json.Document(RawResponse), // 提取当前页的数据(根据你的API返回结构调整字段名) PageTable = Table.FromRecords(ParsedResponse[results]), // 提取分页元数据(当前页、总页数,同样按实际结构调整) CurrentPageNum = ParsedResponse[currentPage], TotalPageCount = ParsedResponse[totalPages] in // 返回包含数据和元数据的记录 [PageData=PageTable, CurrentPage=CurrentPageNum, TotalPages=TotalPageCount] in GetAPIPage
第二步:用List.Generate循环获取所有页并合并
let // 先获取第一页,拿到总页数 FirstPage = GetAPIPage(1), TotalPages = FirstPage[TotalPages], // 用List.Generate生成所有页的数据集 AllPageResults = List.Generate( // 初始状态:当前页1,累积数据是第一页表格,总页数已确定 () => [CurrentPage=1, AccumulatedTables={FirstPage[PageData]}, TotalPages=TotalPages], // 终止条件:当前页不超过总页数就继续 (state) => state[CurrentPage] <= state[TotalPages], // 迭代逻辑:页码+1,把下一页数据追加到累积列表 (state) => [ CurrentPage = state[CurrentPage] + 1, AccumulatedTables = state[AccumulatedTables] & {GetAPIPage(state[CurrentPage])[PageData]}, TotalPages = state[TotalPages] ], // 每次迭代返回当前的累积表格列表 (state) => state[AccumulatedTables] ), // 取列表最后一项,就是所有页的表格集合 FullTableList = List.Last(AllPageResults), // 合并所有表格成最终输出表 FinalCombinedTable = Table.Combine(FullTableList) in FinalCombinedTable
关键部分解释
- GetAPIPage函数:封装了单页API请求的逻辑,返回的记录既包含当前页数据,也带分页元数据,方便后续判断是否还要继续迭代。
- List.Generate参数:
- 初始状态:设置起始页码为1,累积数据初始化为第一页的表格,同时传入总页数。
- 终止条件:当前页码不超过总页数时继续循环。
- 迭代逻辑:每次页码加1,调用API获取下一页数据,把新表格追加到累积列表里。
- 结果提取:每次迭代返回当前的累积表格列表,最后取列表的最后一项就是完整的所有页数据集合。
- Table.Combine:把所有分页表格合并成一个统一的大表格,就是最终需要的输出。
注意事项
- 务必根据你的API实际返回结构调整字段名,比如
results、currentPage、totalPages这些字段,要和API返回的JSON结构对应。 - 可以给
GetAPIPage加错误处理,避免某一页请求失败导致整个流程中断,比如把PageTable的代码改成:
PageTable = try Table.FromRecords(ParsedResponse[results]) otherwise Table.FromRecords({})
- 如果API的分页参数不是
page,比如是offset(偏移量),只需要调整APIUrl里的参数即可,比如用offset=(pageNumber-1)*1000来计算偏移量。
内容的提问来源于stack exchange,提问作者Renier Wessels
相关产品推荐
相关产品推荐

