我找到了一个想要从 LibreOffice Calc 访问的 Web API 资源。
它返回一个简单的 JSON/JavaScript 对象,该对象基本上只是少数几个名称值对,我想要将其中一个取出并放入单元格中。
我懂编程,但几乎没用过电子表格。通过谷歌搜索,我仍然不知道应该使用哪种编程语言,以及我是否需要任何外部插件或只是 LibreOffice 内置的功能。
(如果决定这个问题确实属于 StackOverflow,我很乐意将其迁移到该问题。)
答案1
我发现最简单的方法是使用 LibreOffice 的 GetRest 插件。
您可以使用单独的单元格,一个用于提取数据,一个用于格式化数据,等等。但是,通过组合函数(或创建宏),您可以在单个单元格中实现相当多的格式化。
示例:获取当前比特币现货价格
为此,我将使用 Coinbase API,他们的许多调用不需要身份验证。
- 下载并安装插件。您将获得两个新功能:
GET()
接受 API 端点作为参数PARSEJSON()
它接受两个参数:- JSON 源。这可以是任何本地或在线文件,只要它是正确的 JSON。我们将使用输出
GET()
。 - 指向您想要的特定值的 JSON 文件的结构/层次结构。
- JSON 源。这可以是任何本地或在线文件,只要它是正确的 JSON。我们将使用输出
HTTP 请求
GET https://api.coinbase.com/v2/prices/:currency_pair/spot
对于 currency_pair,我想要以美元表示的 BTC 值,因此它将被替换为BTC-USD
JSON 响应
{
"data": {
"amount": "1015.00",
"currency": "USD"
}
}
使用两个单元格
在 A1 中:
=GET("https://api.coinbase.com/v2/prices/BTC-USD/spot")
在 A2 中,解析 JSON 响应。解析在对象名称级别进行,以句点分隔。这将作为参数以两种方式之一传递给函数,如果 JSON 包含数组,我们将数组的名称和对象索引指定为arrayName.get(i).objectName
。我们的示例只是一个有两"key":"value"
对的对象,因此格式为objectName.keyName
:
=PARSEJSON(A1, "data.amount")
内容如下:
23966.93
使用一个单元格
方法本质上是相同的,但是我们不是将单元格作为第一个参数传递,而是传递整个GET()
函数:
=PARSEJSON(GET("https://api.coinbase.com/v2/prices/BTC-USD/spot"), "data.amount")
格式化
JSON 响应传递一个字符串值,该值包装在一个函数中,因此您无法使用任何选项在那个细胞内将其格式化为货币或数字。
但是我仍然希望我的电子表格前面有“$”,所以我们可以连接字符串来添加这个前缀,我们的结果函数如下所示:
=CONCAT("$",PARSEJSON(GET("https://api.coinbase.com/v2/prices/BTC-USD/spot"), "data.amount"))
这适合一个单元格,可以通过按 F9 进行更新(请注意,每次刷新开放 API 端点都会占用部分服务器带宽,因此请尝试限制刷新次数。如果您可以重复使用单元格而不必创建另一个调用,那就更加体贴了。)
答案2
四年过去了,他们仍然没有实施该建议FILTERJSON()
。
这显然不是一个真正的解决方案,但对于非常简单的情况来说,它是目前可行的:
- 使用以下方式向您的 API 发送请求:
=WEBSERVICE("http://example.com/v1/stuff")
例如单元格 A1 - 例如,在单元格 A2 中添加
=MID(A1;SEARCH("rootProperty";A1)+2;10)
(记得更改分隔符(在我的情况下是分号)以匹配 LibreOffice 中的语言环境)
解释:
MID()
将从完整回复中截取部分文本SEARCH()
将查找给定文本的起始索引,例如“rootProperty”+2
是开始读取值的偏移量(基本上是子字符串)10
是从找到的文本开头读取的字符数SEARCH()
(+2
偏移量之后)
例如,如果您在单元格 A1 中收到以下响应:
{
"id": 12345678,
"something": "Example",
"myThing": "Hello",
"another": "Not needed"
}
单元格 A2 有以下公式:=MID(A1;SEARCH("myThing";A1);13)
该单元格的值是:myThing": "He
是13
从 中第一个字符开始的myThing
、您在 中搜索的字符SEARCH()
。
因此,您显然不希望拥有其中的一部分。若要仅获取的myThing": "
值,则可以使用以下公式:。Hello
myThing
=MID(A1;SEARCH("myThing";A1)+11;5)
这会:
- 查找
myThing
开始的位置(警告:如果字符串有两个实例,则将获得第一个) - 返回偏移量处的 5 个字符。因此:
myThi
- 然后从索引开始偏移
11
(+11
公式中的) - 因此它跳过前 11 个字符(
myThing": "
)并从那里返回 5 个字符,即Hello
当然,这仍然是相当手动的,但至少对于简单的事情来说这是一种可行的方法。祝你好运!
答案3
最好在 StackOverflow 上提问,但是是的,您可以使用 Python 检索和访问/转换 JSON 对象,这与 LibreOffice Calc 配合得很好。您可以双向解决问题,要么使用 Python 来控制 LibreOffice,要么让 LibreOffice 运行 Python 脚本,这取决于您的需要。
至于将 JSON 转换为 LibreOffice 可以使用的内容 (csv),这里有一个很好的初学者解释应用信息学。
答案4
增强@sentientflesh 的答案:
GetRest 插件可以在这里下载: https://gist.github.com/ThomasG77/4ed97370af8355feabf50cb2909198a0#file-libreofficegetrestplugin-oxt
它仍然可以与 LibreOffice Calc v.7.1 一起使用 get 和 parsejson 函数,如下所述: https://extensions.libreoffice.org/en/extensions/show/libreoffice-getrest-plugin-1