Zpracování XLSX v PHP/Java

Zpracování XLSX v PHP/Java
« kdy: 11. 04. 2019, 18:08:48 »
Jakou knihovnu/postup pouzivate v PHP nebo v Jave pro zpracovani XLSX souboru? Jde mi o zpracovani souboru, ktery uzivatel nahraje. Aktualne v php provadim volani libreoffice pro prevod do CSV a s vyslednym souborem dal pracuji coz asi neni uplne nejlepsi reseni. Sdilel by nekdo svoje implenetovane reseni? Aspon pouzite knihovny


Diky
« Poslední změna: 11. 04. 2019, 23:32:17 od Petr Krčmář »


Re:Zpracovani XLSX v PHP/Java
« Odpověď #1 kdy: 11. 04. 2019, 20:15:03 »
V javě je standard Apache POI Jsou nějaké jeho nadstavby (JXLS - nepoužívám).

Re:Zpracovani XLSX v PHP/Java
« Odpověď #2 kdy: 11. 04. 2019, 21:56:53 »
Záleží, jak ten soubor chcete zpracovávat. Pokud jenom potřebujete vytáhnout data, XLSX je jenom XML soubor zabalený s další bižuterií do ZIPu a ten ZIP má příponu XLSX. Takže stačí rozzipovat, vytáhnout to XML, ve kterém jsou data, a to můžete XSLT transformací převést do struktury, jaká vám vyhovuje. Trochu to může zkomplikovat fakt, že texty mohou být uloženy mimo ten hlavní datový soubor v souboru sdílených textů, ale to se dnes dá v XSLT snadno vyřešit.

Re:Zpracovani XLSX v PHP/Java
« Odpověď #3 kdy: 11. 04. 2019, 23:44:28 »
Záleží, jak ten soubor chcete zpracovávat. Pokud jenom potřebujete vytáhnout data, XLSX je jenom XML soubor zabalený s další bižuterií do ZIPu a ten ZIP má příponu XLSX. Takže stačí rozzipovat, vytáhnout to XML, ve kterém jsou data, a to můžete XSLT transformací převést do struktury, jaká vám vyhovuje. Trochu to může zkomplikovat fakt, že texty mohou být uloženy mimo ten hlavní datový soubor v souboru sdílených textů, ale to se dnes dá v XSLT snadno vyřešit.

Teorie je to hezká, ale dělal jste to někdy? Tohle právě (a další věci) řeší ty knihovny...

Re:Zpracovani XLSX v PHP/Java
« Odpověď #4 kdy: 12. 04. 2019, 00:14:58 »
Teorie je to hezká, ale dělal jste to někdy? Tohle právě (a další věci) řeší ty knihovny...
Ano, dělal. Ty knihovny se z toho souboru snaží dělat objektový model, který je podobný objektovému modelu skutečného Excelu. Někdy je to zbytečný kanón na vrabce, protože se nepotřebujete zabývat všemi detaily dokumentu, pouze chcete data transformovat do jiného formátu nebo struktury.


Re:Zpracovani XLSX v PHP/Java
« Odpověď #5 kdy: 12. 04. 2019, 15:51:19 »
Teorie je to hezká, ale dělal jste to někdy? Tohle právě (a další věci) řeší ty knihovny...
Ano, dělal. Ty knihovny se z toho souboru snaží dělat objektový model, který je podobný objektovému modelu skutečného Excelu. Někdy je to zbytečný kanón na vrabce, protože se nepotřebujete zabývat všemi detaily dokumentu, pouze chcete data transformovat do jiného formátu nebo struktury.

Ano, možnost pracovat s tím jako s xml se samozřejmě může hodit, o tom žádná. Ale na druhou stranu si musíte nastudovat, jak to xml vypadá, pokud do buňky někdo vloží třeba formátování. V POI řeknete, že chcete získat text dané buňky a máte ho.

Re:Zpracovani XLSX v PHP/Java
« Odpověď #6 kdy: 12. 04. 2019, 16:16:23 »
Ale na druhou stranu si musíte nastudovat, jak to xml vypadá, pokud do buňky někdo vloží třeba formátování.
Naštěstí se XLSX nesnaží XML moc znásilňovat, takže je to tak, jak by to v XML být mělo – v jednom elementu je uložená hodnota buňky, a pokud je potřeba k té buňce přidat nějaké další informace – třeba formátování nebo vzoreček – je uložená v jiném elementu nebo atributu.

Re:Zpracovani XLSX v PHP/Java
« Odpověď #7 kdy: 12. 04. 2019, 18:01:01 »
Ale na druhou stranu si musíte nastudovat, jak to xml vypadá, pokud do buňky někdo vloží třeba formátování.
Naštěstí se XLSX nesnaží XML moc znásilňovat, takže je to tak, jak by to v XML být mělo – v jednom elementu je uložená hodnota buňky, a pokud je potřeba k té buňce přidat nějaké další informace – třeba formátování nebo vzoreček – je uložená v jiném elementu nebo atributu.

No ten xml se mi zdá docela čistý, nicméně mi jde o toto:

Kód: [Vybrat]
<table:table-row table:style-name="ro1">
<table:table-cell table:style-name="ce1" office:value-type="string" calcext:value-type="string">
<text:p>d<text:span text:style-name="T1">e</text:span>
<text:span text:style-name="T2">fg</text:span>
</text:p>
</table:table-cell>
</table:table-row>

Jak z toho v obecném případě dostanete text "defg" (pomocí xpath)?

Re:Zpracovani XLSX v PHP/Java
« Odpověď #8 kdy: 12. 04. 2019, 18:33:44 »
No ten xml se mi zdá docela čistý, nicméně mi jde o toto:

Kód: [Vybrat]
<table:table-row table:style-name="ro1">
<table:table-cell table:style-name="ce1" office:value-type="string" calcext:value-type="string">
<text:p>d<text:span text:style-name="T1">e</text:span>
<text:span text:style-name="T2">fg</text:span>
</text:p>
</table:table-cell>
</table:table-row>

Jak z toho v obecném případě dostanete text "defg" (pomocí xpath)?
Jen tak na první pohled bych řekl, že tohle není .xlsx (Office Open XML – Microsoft Excel) – nebude to spíš .ods (OpenDocument – OpenOffice.org/LibreOffice)?

Jinak pomocí XPath z tohohle vytáhnu čistý text např. pomocí xs:string(/table:table-row/table:table-cell), přičemž to přetypování se udělá automaticky, pokud má být výstupem atomická hodnota. Takže pokud bych ten text chtěl dostat na výstup v XSLT šabloně, bylo by tam jen <xsl:value-of select="/table:table-row/table:table-cell" />. V tom je právě výhoda XML, že je obvykle možné vůbec se nezabývat věcmi, které mne nezajímají.

Re:Zpracování XLSX v PHP/Java
« Odpověď #9 kdy: 12. 04. 2019, 19:16:43 »
Je to samozřejmě ods, ale jde mi o proncip. Nevím, co dělám špatně, ale mě to v xslt vygeneruje nanejvýše textový obsah těch jednotlivých podelementů zvlášť, tedy s různými bílými znaky okolo, chtěl bych to ovšem mít jako jeden řetězec (tak jak je to v tom dokumentu, tj "defg").

Re:Zpracování XLSX v PHP/Java
« Odpověď #10 kdy: 12. 04. 2019, 19:39:35 »
Myslel jsem, že jste to formátování upravil jenom pro větší přehlednost. Pokud jsou v tom XML skutečně ty bílé znaky, jsou i v té tabulce. Pokud text má být bez mezer, musí být bez mezer i v XML. Jinak s konci řádků bych to XML raději nepoužíval, protože to je zrovna případ, kdy to Excel a Libre Office zobrazí každý jinak…
« Poslední změna: 12. 04. 2019, 19:44:40 od Filip Jirsák »

Re:Zpracování XLSX v PHP/Java
« Odpověď #11 kdy: 12. 04. 2019, 20:04:55 »
Zkuste knihovnu pro PHP https://github.com/box/spout

Její použití je naprosto jednoduchý a hladce s ní zpracujete i soubory o stovkách tisíc řádků a desítkách sloupců bez enormních nároků na operační paměť.
Umí editovat XLSX, ODS, CSV.

Re:Zpracování XLSX v PHP/Java
« Odpověď #12 kdy: 12. 04. 2019, 23:01:25 »
Myslel jsem, že jste to formátování upravil jenom pro větší přehlednost. Pokud jsou v tom XML skutečně ty bílé znaky, jsou i v té tabulce. Pokud text má být bez mezer, musí být bez mezer i v XML. Jinak s konci řádků bych to XML raději nepoužíval, protože to je zrovna případ, kdy to Excel a Libre Office zobrazí každý jinak…
Máte pravdu, bílé znaky se tam dostaly omylem při operaci s tím xmlkem. Když použiju originální podobu tak je vše v pořádku a dostávám "defg"  :)