【问题标题】:How can I setup Pagination in Excel Power Query?如何在 Excel Power Query 中设置分页?
【发布时间】:2019-11-22 18:06:15
【问题描述】:

我正在使用 JSON 从网络将财务数据导入 excel,但由于源使用分页(每页提供 50 个结果,我需要实现分页才能导入所有结果。

数据源是JSON:

    https://localbitcoins.com//sell-bitcoins-online/VES/.json?page=1 
    or https://localbitcoins.com//sell-bitcoins-online/VES/.json?page=2

?page=1, ?page=2, ?page=3

我使用下面的代码实现分页,但是收到错误:

= (page as number) as table =>
let
    Source = Json.Document(Web.Contents("https://localbitcoins.com//sell-bitcoins-online/VES/.json?page="  & Number.ToText(page) )),
    Data1 = Source{1}[Data],
    RemoveBottom = Table.RemoveLastN(Data1,3)
in
    RemoveBottom

当我调用一个参数(第 1 页为 1)来测试它时,我收到以下错误,我似乎无法找出原因?

An error occurred in the ‘GetData’ query. Expression.
Error: We cannot convert a value of type Record to type List.
Details:
    Value=Record
    Type=Type

为了记录,我尝试使用 ListGenerate 包含页面处理:

= List.Generate( ()=>
[Result= try GetData(1) otherwise null, page = 1],
        each [Result] <> null,
        each [Result = try GetData([page]+1) otherwise null, Page = [Page]+1],
        each [Result])

在 MS Excel 中使用 Power Query 实现分页的默认方式是什么?

【问题讨论】:

    标签: excel powerbi powerquery m


    【解决方案1】:

    我知道你在将近一个月前问过这个问题,并且可能已经找到了答案,但无论如何都会回复,以防它帮助其他人。

    这行Data1 = Source{1}[Data] 对我来说没有意义,因为我认为Source 将是一条记录,并且您不能对记录使用{1} 位置查找语法。

    下面的代码为我返回 7 页。您可能需要检查它是否获取了您需要/期望的所有页面。

    let
        getPageOfData = (pageNumber as number) =>
            let
                options = [
                    Query = [page = Number.ToText(pageNumber)]
                ],
                url = "https://localbitcoins.com/sell-bitcoins-online/VES/.json",
                response = Web.Contents(url, options),
                deserialised = Json.Document(response)
            in deserialised,
        responses = List.Generate(
            () => [page = 1, response = getPageOfData(page), lastPage = null],
            each [lastPage] = null or [page] <= [lastPage],
            each [
                page = [page] + 1,
                response = getPageOfData(page),
                lastPage = if [lastPage] = null then if Record.HasFields(response[pagination], "next") then null else page else [lastPage]
            ],
            each [response]
        )
    in
        responses
    

    List.Generate 中,我的selector 只选择[response] 字段以保持简单。您可以在 selector 本身(例如 each [response][data][ad_list])内更深入地钻取数据,或者创建一个新的步骤/表达式并使用 List.Transform 来执行此操作。

    经过一定程度的钻取和转换后,您可能会看到如下数据:

    但这取决于您需要数据的外观(以及您对哪些列感兴趣)。


    顺便说一句,我在上面的查询中使用了getPageOfData,但是这个特殊的 API 在其响应中包含了下一页的 URL。因此,第 2 页及之后的页面可能只是请求响应中的 URL(而不是调用 getPageOfData)。

    【讨论】:

    • 我从来没有修复它,所以我做了一个快速修复,复制我的查询并将每个页面下载到单独的选项卡上。现在我可以整合分页,它的效果要好得多。惊人的!谢谢
    • 我可以从电源查询中调用(录制的)宏吗?
    • @rphessing 据我所知,你不能那样做。但是,如果您提出一个新问题,其中包含有关您正在尝试做什么的信息,那么也许有人可以更好地帮助您。
    猜你喜欢
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多