Jednoduchý export z PHP do Excelu

napísal , 9 Dec 2010 [ PHP ]

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
napísal , 9 Dec 2010

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ánkom
neukladá 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
  1. 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.

  2. 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.

  3. kubo [ Nedeľa 20.2.2011, 08:45 ]

    A do Wordu by si nemal ? :) ale kazdopadne je to good

  4. 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 :)

  5. 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!

ku každému komentáru sa v databáze ukladá iba meno, text a dátum, iba za účelom zobrazenia pod článkom
neukladá 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