Извлечение XML-курсов валют Европейского центрального банка в ячейки LibreOffice Calc
Цель состоит в том, чтобы получить текущие курсы валют в электронную таблицу Libre/OpenOffice Calc. Раньше я делал это с помощью сервиса JSON с ручной настройкой подстрок, что не так уж удобно для пользователя. Поэтому я хотел узнать, как это можно сделать, используя встроенные функции Libre/OpenOffice.
Служба: https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml , которая возвращает XML, например:
<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time='2021-03-23'>
<Cube currency='USD' rate='1.1883'/>
<Cube currency='JPY' rate='128.99'/>
<Cube currency='BGN' rate='1.9558'/>
<Cube currency='CZK' rate='26.198'/>
<Cube currency='DKK' rate='7.4360'/>
<Cube currency='GBP' rate='0.86198'/>
<Cube currency='HUF' rate='366.51'/>
<Cube currency='PLN' rate='4.6191'/>
<Cube currency='RON' rate='4.8893'/>
<Cube currency='SEK' rate='10.1813'/>
<Cube currency='CHF' rate='1.1066'/>
<Cube currency='ISK' rate='148.30'/>
<Cube currency='NOK' rate='10.1783'/>
<Cube currency='HRK' rate='7.5755'/>
<Cube currency='RUB' rate='90.2781'/>
<Cube currency='TRY' rate='9.3638'/>
<Cube currency='AUD' rate='1.5491'/>
<Cube currency='BRL' rate='6.5562'/>
<Cube currency='CAD' rate='1.4938'/>
<Cube currency='CNY' rate='7.7367'/>
<Cube currency='HKD' rate='9.2290'/>
<Cube currency='IDR' rate='17105.58'/>
<Cube currency='ILS' rate='3.9099'/>
<Cube currency='INR' rate='86.1025'/>
<Cube currency='KRW' rate='1342.48'/>
<Cube currency='MXN' rate='24.5926'/>
<Cube currency='MYR' rate='4.8988'/>
<Cube currency='NZD' rate='1.6918'/>
<Cube currency='PHP' rate='57.779'/>
<Cube currency='SGD' rate='1.5955'/>
<Cube currency='THB' rate='36.819'/>
<Cube currency='ZAR' rate='17.5818'/>
</Cube>
</Cube>
</gesmes:Envelope>
1 ответ
Причина этого, в частности, заключается в том, что я предполагаю, что этот вариант использования очень распространен, а данные Европейского центрального банка являются официальным источником ставок (поэтому они популярны в использовании), поэтому это должно быть полезно для многих.
Есть две встроенные функции, которые вы можете объединить для получения данных, не прибегая к ручному редактированию длины подстроки (мое предыдущее решение: /questions/790629/mogu-li-ya-poluchit-i-poluchit-dostup-k-prostomu-obektu-json-cherez-http-v-libre/1113257#1113257).
-
WEBSERVICE
очевидно, чтобы получить данные -
FILTERXML
для анализа данных из ввода XML (в данном случае XML Европейского центрального банка)
Итак, чтобы проанализировать данные из исходного XML, вы должны использовать:
- Ячейка A1 со строковым значением
- Ячейка A3 с URL-адресом XML: https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml .
- Ячейка B1 с формулой:
=FILTERXML(WEBSERVICE($A$3);"//*[local-name()='Cube' and @currency='" & A1 & "']/@rate")
Теперь B1 будет содержать фактическое значение независимо от текущей длины, поэтому вам не нужно вручную редактироватьMID
«подстрока», когда курс валюты меняется, например,1.2325
к1.23
Объяснение xpath ("//*[local-name()='Cube' and @currency='" & A1 & "']/@rate"
часть выше):
- Он находит «любой» элемент XML с именем
<Cube>
где элемент также имеет атрибут, называемыйcurrency
которое соответствует значению, определенному в ячейке A1 (USD
в этом примере) - Затем он «выбирает» значение атрибута
rate
в этом результате, который в данном случае представляет собой соотношение валют по сравнению с евро (<Cube currency='USD' rate='1.1883'/>
в данный момент)
Итак, теперь ячейка B1 будет иметь строковое значение.1.1883
. В зависимости от вашего языкового стандарта вы также можете преобразовать его в запятую вместо точки для десятичных знаков, например в ячейке C1:=VALUE(SUBSTITUTE(B1;".";","))
. И, возможно, чтобы в ячейке D1 был указан курс валюты наоборот:=1/C1