如何对表中的每行数据执行 Excel Web JSON 查询

Posted

技术标签:

【中文标题】如何对表中的每行数据执行 Excel Web JSON 查询【英文标题】:How do I do an Excel Web JSON query per row of a data in a table 【发布时间】:2021-10-05 20:52:23 【问题描述】:

我正在寻找一种方法来验证 Excel 表格中列出的交易的销售税率。我的 Excel 表有一个“地址”列,我想查询加利福尼亚销售税 API (https://services.maps.cdtfa.ca.gov/) 以获取由 API 提供的 JSON 提供的税率、管辖权和其他信息。我正在寻找的是一种获取地址表的方法,并且对于每一行,要么将来自 JSON 的信息附加到表中。查询实际上需要使用行中的信息在每一行上运行以创建查询。最终结果的示例是:

上述示例将使用 (https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByAddress?Address=1313%20Disneyland%20Dr&City=Anaheim&Zip=92802) 作为该特定行的查询。

编辑:我想我发现我的问题的第一部分是我不知道如何使用表行中的数据作为查询中的参数。我已经能够通过创建一个函数并将其作为一个新列调用来获得我正在寻找的结果,然后因为它是一个返回的 JSON,所以将其展开为行。

现在我遇到的问题是,有时返回的 JSON 是一种不同的格式,具体取决于是否有一个或多个费率是组合总费率的一部分。我不确定如何进行条件转换,我的try... otherwise 对我的方式没有帮助,因为在没有回复的情况下尝试转换空 JSON 时它会出错。

我最新的下面是我当前的代码。

(URLParam as text) =>
let
    Source = try Json.Document(Web.Contents(URLParam), 65001) otherwise MissingField.UseNull,
    rate = Source[taxRateInfo]0,
    #"Converted to Table" = Record.ToTable(rate),
    #"Transposed Table" = Table.Transpose(#"Converted to Table"),
    #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers","jurisdiction", type text, "rate", type number, "city", type text, "county", type text)
in
    #"Changed Type"

【问题讨论】:

为什么不直接运行更新查询来从您的字段中构建该 url 字符串 @dbmitch 很抱歉,但我不能 100% 确定您的意思。老实说,可能就这么简单,但我不知道怎么做。我认为我的问题是一些数据来自我的表,然后其余数据来自每行的单个查询。你能举个例子来说明你的建议吗?提前致谢! @dbmitch 也澄清一下。我最初在我的数据库中拥有的唯一数据是地址。其他信息来自不同的来源,查询基于单个行中的值,不像我可以UPDATE * WHERE.... 的 SQL 查询 您只想弹出一个税率窗口吗?或者您是否正在寻找保持该比率的新列?在解析每条记录的数据的函数中编写代码非常简单。是一次性的吗?所以您只需更新一次表格吗?或者它是临时的 - 只需按一下按钮,一条记录就会更新? @dbmitch 我希望将上图中正确的 5 列添加到现有表中。从技术上讲,它只需要更新一次,但一个函数听起来可能是我正在寻找的,但不确定如何在 VBA 中设置查询,你会推荐每行 5 个单独的查询,还是一个函数“溢出”到相邻的细胞?谢谢! 【参考方案1】:

这是一个有两个地址的表

第一个返回单一税率 第二个返回两个

我们编写了一个自定义函数,将地址转换为api调用,然后返回税率信息RecordsList

我把它命名为fnCaTax

(adr as text)=>

let 
    baseURL = "https://services.maps.cdtfa.ca.gov/api/taxrate/GetRateByAddress?",
    
    x = List.Transform(Text.Split(adr,","),each Text.Trim(_)),
    address = Text.Replace(x0," ","+"),
    city = Text.Replace(x1," ","+"),
    stateZip = Text.Split(x2," "),
    state = stateZip0,
    zip = stateZip1,

    apiCall=baseURL &
                "&Address=" & address &
                "&City=" & city &
                "&Zip=" & zip,

    json = Json.Document(Web.Contents(apiCall)),
    taxRateInfo = json[taxRateInfo]    
    
in taxRateInfo

然后我们将List 扩展为新行,并将List 中的Records 扩展为新列

...
    #"Invoked Custom Function" = Table.AddColumn(#"Expanded Column1", "fnCaTax", each fnCaTax([Column1])),
    #"Expanded fnCaTax" = Table.ExpandListColumn(#"Invoked Custom Function", "fnCaTax"),
    #"Expanded fnCaTax1" = Table.ExpandRecordColumn(#"Expanded fnCaTax", "fnCaTax", 
        "rate", "jurisdiction", "city", "county", "tac", "rate", "jurisdiction", "city", "county", "tac")
in
    #"Expanded fnCaTax1"

获取:

我没有测试错误的地址或地址的缺失部分。如果可能的话,你应该补充一下

【讨论】:

这几乎正是我正在寻找的!我有最后一个问题...如果地址的第一部分后面没有逗号,您有什么建议...我正在与我的 IT 团队合作,可能会添加它,但这是一个限制因素我收到的数据。无论哪种方式,我都会将此标记为答案。谢谢! @Michael 我建议创建一个List 的城市进行检查;或者可能只是提供邮政编码,如果 API 接受的话。 好的,谢谢罗恩。不幸的是,加利福尼亚需要街道地址、城市和邮政编码来确定费率。但我将与我的 IT 团队合作添加分隔符。感谢您的帮助!

以上是关于如何对表中的每行数据执行 Excel Web JSON 查询的主要内容,如果未能解决你的问题,请参考以下文章

仅对表中的一列授予更改

用javascript怎么实现把excel中的数据批量导入到数据库表中

如何将excel表中的数据导入到sql server表中?

MyBatis学习总结——使用MyBatis对表执行CRUD操作

如何在sqlite中对表中的行进行排名?

MyBatis学习总结——使用MyBatis对表执行CRUD操作