Přeskočit na hlavní obsah

Konvertor Flexi2XML

Konverzní nástroj Flexi2XML pro převod XML formátů

Autor: Petr Pech

Flexi2XML lze použít jako konverzní nástroj pro převod dat z ABRA Flexi i do ní. Umí otevřít soubor, převést jej do XML, aplikovat na něj konverzní skript a zapsat výsledek — a to oběma směry. Jak nástroj získat, popisuje článek Stažení Flexi2XML.


Složitější konverze z XLS do Flexi

ABRA Flexi má v sobě základní možnosti importu z XLS (Excelu). Pro složitější případy — kdy názvy sloupců neodpovídají vlastnostem evidence, je potřeba hodnoty přepočítat nebo poskládat z více souborů — je nutné použít nástroj Flexi2XML.


Konverze z Excelu

Nástroj načítá soubory XLS i XLSX. Mějme takovýto sešit:

Ceník

Odběratel

Cena

8593026341407

FLEXI

1000.0

8593026341407

ARIT

900.0

8593026341407

VFH

1050.0

8593026341407

ABRA

1100.0


Konverze z XLS do XML

Abychom mohli provést další zpracování, převedeme sešit na XML:

flexibee2xml --from-xls soubor.xls --evidence odberatel --to-xml soubor.xml

Výsledkem je XML, kde se z názvů sloupců stanou názvy elementů:

<?xml version="1.0" encoding="utf-8"?>
<winstrom version="1.0">
<odberatel>
<Ceník>8593026341407</Ceník>
<Odběratel>FLEXI</Odběratel>
<Cena>1000.0</Cena>
</odberatel>
<odberatel>
<Ceník>8593026341407</Ceník>
<Odběratel>ARIT</Odběratel>
<Cena>900.0</Cena>
</odberatel>
</winstrom>

ℹ️ Parametr --evidence určuje jen název elementu řádku. Když jej vynecháte, každý řádek se zabalí do obecného <row>.

⚠️ Na Linuxu a macOS uzavřete středník do uvozovek — --delimeter ";". Bez nich jej shell považuje za oddělovač příkazů a část příkazu zahodí. (Přepínač se skutečně jmenuje --delimeter, s tímto překlepem.)

Kdyby názvy sloupců přímo odpovídaly názvům vlastností ve Flexi XML, byli bychom hotovi — přesně tak funguje práce s CSV a XLS v REST API. Obvykle je ale potřeba XML ještě upravit, a k tomu slouží XSL transformace.


Konverze z XML do XML (XSLT)

XSL transformace jsou standardizovaným nástrojem, v jednotlivých implementacích ale bývají odlišnosti. Flexi2XML je proto postavený na stejném jádře jako ABRA Flexi — tím je zaručená maximální kompatibilita.

Připravme konverzní skript odberatel-in.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java" version="1.0" exclude-result-prefixes="java">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/winstrom">
<winstrom version="1.0">
<xsl:apply-templates select="odberatel"/>
</winstrom>
</xsl:template>
<xsl:template match="odberatel">
<odberatel>
<firma>code:<xsl:value-of select="java:flexibee.Tool.toUpper(Odběratel)"/></firma>
<cenik>code:<xsl:value-of select="java:flexibee.Tool.toUpper(Ceník)"/></cenik>
<prodejCena>
<xsl:value-of select="Cena"/>
</prodejCena>
</odberatel>
</xsl:template>
</xsl:stylesheet>

Existuje mnoho úvodů do XSLT — například Kompletní průvodce XSLT nebo úvod Jirky Koska. V XSLT je možné iterovat (<xsl:for-each/>), podmiňovat (<xsl:if/>) i indexovat obsah (<xsl:key/>); nejedná se ale o klasické iterativní programování.

Transformaci pak spustíme:

flexibee2xml --from-xml soubor.xml --run-xslt odberatel-in.xslt --to-xml vysledek.xml

Nebo jedním příkazem s přeskočením mezikroku:

flexibee2xml --from-xls soubor.xls --evidence odberatel --run-xslt odberatel-in.xslt --to-xml vysledek.xml

Výsledek lze pak do ABRA Flexi naimportovat buď přímo, nebo pomocí dávkového zpracování.


Přehled přepínačů

Úplný seznam vypíše nástroj sám s parametrem --help. Vstupní a výstupní formát se kombinují libovolně — nástroj tedy zvládne i převod mezi dvěma tabulkovými formáty bez zásahu do dat.

Přepínač

Význam

--from-xml, --from-json, --from-csv, --from-xls, --from-xlsx, --from-dbf

Vstupní soubor a jeho formát.

--to-xml, --to-csv, --to-xls, --to-xlsx, --to-dbf

Výstupní soubor a jeho formát.

--evidence

Název elementu řádku ve výsledném XML; bez něj se použije row.

--run-xslt

Aplikuje na data XSL transformaci.

--params

Volitelné parametry pro XSLT nebo pro dávkové nahrávání.

--delimeter, --encoding, --no-header

Oddělovač, kódování a potlačení hlavičkového řádku u CSV.

--memo

Název souboru MEMO u formátu DBF.

--deduplicate

Odstraní duplicitní záznamy.

--split

Rozdělí velké XML na menší soubory.

--load, --file, --id

Dávkové nahrávání podle konfiguračního souboru — viz Dávkové zpracování.

--help

Vypíše verzi nástroje a přehled přepínačů.

💡 Na rozdíl od REST API, které neznámé parametry mlčky ignoruje, nástroj překlep v názvu přepínače ohlásí jako Unrecognized option a skončí. Chyba se tak pozná hned.


Několik poznámek závěrem

  • Výslednou XSLT transformaci lze uložit jako uživatelskou transformaci přímo do firmy, a používat ji pak i z REST API parametrem format. Chcete-li ji mít zabudovanou přímo ve Flexi, obraťte se na naši podporu.

  • Zpracovávat lze i více souborů najednou — to se hodí, když máte jedno CSV nebo XLS s hlavičkami faktur a druhé s položkami.

  • Flexi2XML lze použít i pro rozsekání velkého XML na mnoho malých a jejich následné postupné nahrávání.


Související

Dostali jste odpověď na svou otázku?