求助:基于Offset分页的REST API数据批量导入Excel PowerQuery实现
PowerQuery 遍历分页REST API全量导入Excel方案
API返回示例
{ "data": [ {"id": 1, "name": "Item 1"}, {"id": 2, "name": "Item 2"} ], "first": "/api/data?offset=0&limit=200", "previous": null, "next": "/api/data?offset=200&limit=200", "last": "/api/data?offset=1800&limit=200" }
完整PowerQuery代码
let // 替换为你的API根域名 baseUrl = "https://your-api-domain.com", // 封装单页数据拉取逻辑 getPage = (pageUrl as text) as table => let fullUrl = baseUrl & pageUrl, // 若需认证,添加Headers参数,示例:Headers=[Authorization="Bearer YOUR_TOKEN"] response = Web.Contents(fullUrl), jsonResponse = Json.Document(response), dataTable = Table.FromRecords(jsonResponse[data]) // 若需防限流,添加延迟:Function.InvokeAfter(()=>Table.FromRecords(jsonResponse[data]), #duration(0,0,0,1)) in dataTable, // 循环生成所有分页数据 allPages = List.Generate( // 初始值:第一页URL和对应数据 () => [pageUrl = "/api/data?offset=0&limit=200", data = getPage("/api/data?offset=0&limit=200")], // 终止条件:没有下一页时停止 each [pageUrl] <> null, // 迭代逻辑:获取当前页的next链接,拉取下一页数据 each let currentResponse = Json.Document(Web.Contents(baseUrl & [pageUrl])), nextPage = currentResponse[next] in [pageUrl = nextPage, data = if nextPage <> null then getPage(nextPage) else null], // 提取每一页的数据集 each [data] ), // 合并所有分页表格 combinedTable = Table.Combine(allPages), // 可选:根据唯一键去重(替换为你的实际唯一字段) removeDuplicates = Table.Distinct(combinedTable, {"id"}) in removeDuplicates
关键逻辑说明
getPage函数:统一处理单页数据的请求、解析、表格转换,便于复用和维护。List.Generate:PowerQuery的循环生成工具,自动遍历所有分页,直到API返回的next为null。Table.Combine:将所有分页的表格合并为一个完整数据集,直接导入Excel即可。
注意事项
- 替换
baseUrl为你的API实际根地址,初始页URL要和API第一页路径匹配。 - 若API需要身份验证,在
Web.Contents中添加Headers参数,比如Bearer Token。 - 若API有限流机制,在
getPage函数中添加Function.InvokeAfter实现请求延迟,避免被封禁。
内容的提问来源于stack exchange,提问作者Garrett Cross
相关产品推荐
相关产品推荐

