webdesign / development + awesome
Jednoduchý export z PHP do Excelu
Je veľká šanca, že pokiaľ robíte webovú aplikáciu s akýmikoľvek tabuľkovými dátami, ktorá je určená pre ne-IT ľudí, budú od vás chcieť export údajov do Excelu. Ak nemajú veľmi obskúrne požiadavky (grafy, farebne odlíšené políčka, ...), môžete im pomerne jednoducho spraviť radosť - here's how:
V prvom rade nebudeme používať .xls
, lebo to je škaredý binárny formát :), ale primitívny formát .csv
(comma-separated values), ktorý vie Excel čítať a basically vyzerá takto:
Stlpec1,ďalší stĺpec,ešte stĺpec...
10,12,42
32,23,64
128,0,256
Na stránke asi používate UTF-8, takže samozrejme bude v Exceli problém s diakritikou a špeciálnymi znakmi. Problémy s enkódovaním sa dajú riešiť tak, že zakódujete súbor do Unicode a ako oddeľovače použijete taby (namiesto čiarok). Unicode sa dá vyjadriť veľa spôsobmi (UTF-8 je jedným z nich), ale Excel a Windowsovské veci vo všeobecnosti rozumejú iba UCS2/UTF-16 with BOM, čo znamená, že všetky znaky sú 16-bitové a súbor má na začiatku špeciálny znak (Byte Order Mark) udávajúci usporiadanie bitov (Big Endian alebo Little Endian - Windows používa ten druhý).
Vygenerované .csv
nakoniec treba browseru odoslať ako súbor (inak by sa namiesto download okna zobrazil obsah súboru v prehliadači), na čo stačí zmeniť HTTP hlavičky.
$export = "Stlpec\tĎalší stĺpec\tEšte stĺpec\n"; while ($o = mysql_fetch_object($res)) $export .= "$o->stlpec\t$o->dalsi\t$o->este\n"; header('Content-type: text/csv'); header('Content-Disposition: attachment; filename="drist.csv"'); echo chr(0xFF).chr(0xFE) // BOM pre Little Endian .mb_convert_encoding($export, "UCS-2LE", "UTF-8"); // konvertujeme z UTF-8 do UCS2/Little Endian
Pro tip: ak by sa v samotných hodnotách mali objaviť taby (čo to máte pre boha za údaje? :), treba celú hodnotu dať do úvodzoviek:
"I can has tabs" bla dríst
5 komentárov
komentuj ku každému komentáru sa v databáze ukladá iba meno, text a dátum, iba za účelom zobrazenia pod článkomneukladá sa email, IP adresa ani informácie o prehliadači a údaje sa nepoužívajú na reklamu, newsletter, na žiadnu ekonomickú aktivitu, nikam sa neposielajú, sú v databáze len aby sa mohli zobraziť pod článkom
hogy [ Štvrtok 9.12.2010, 21:52 ]
Ked som robil export do CSV, tak problem s kodovanim mi vyriesil tento magicky retazec:
mysql_query("SET character_set_results=cp1250, character_set_connection=cp1250, character_set_client=cp1250");
databazu a web mam kodovane UTF-8 a exportovany subor mal takto jednoducho kodovanie cp1250.
81403 [ Piatok 10.12.2010, 13:54 ]
Aj tak sa da, ale to by sa obmedzujes len na znaky cp1250, plus v inych regionoch pouziva Windows iny code page (1251, 1252, ...) takze by sa to mohlo doondit.
kubo [ Nedeľa 20.2.2011, 08:45 ]
A do Wordu by si nemal ? :) ale kazdopadne je to good
81403 [ Streda 23.2.2011, 20:17 ]
Do Wordu to asi nebude takéto jednoduché a neviem nakoľko by to malo vlastne využitie. Ale hral som sa s fPDF/ufPDF, ktoré celkom pekne vytvára PDFká.. vlastne výsledok je tu - cover generator :)
thomas [ Pondelok 18.4.2011, 09:40 ]
"...magicky retazec:
mysql_query("SET character_set_results=cp1250, character_set_connection=cp1250, character_set_client=cp1250");"
Přesně tohle kouzlo jsem hledal! Díky!