22.1.2011

Last Updated on

Občas potřebujete vyexportovat nějakou tu tabulku pro Excel a další tabulkové editory. CSV uložené v kódování UTF-8 se zdá být dostatečně univerzálním formátem, aby si s ním poradilo programové vybavení každého počítače.

Ovšem zdání klame. Pokud vytvoříte „obyčejné“ UTF-8 CSV, zmlsaný Excel z něj dostane vyrážku v podobě rozsypaného čaje u znaků ležících mimo ASCII.

Naštěstí existuje kouzelný lektvar s kódovým označením BOM (Byte order mark), který nemoc našeho CSV vyléčí. Jsou to tři magické bajty, které je třeba umístit na úplný začátek CSV. Excel podle těchto bytů pozná, že soubor je v UTF-8. Bohužel problém může nastat u editorů, které BOM nepodporují.

Kód pro report stavu majetku vaší firmy:

//headers
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=export.csv;');
header('Content-Transfer-Encoding: binary');

//open file pointer to standard output
$fp = fopen('php://output', 'w');

//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
if ($fp)
{
fputcsv($fp, array("Cars", "Planes", "Ships"), ";");
fputcsv($fp, array("12", "2", "6"), ";");
fputcsv($fp, array("23", "3", "5"), ";");
fputcsv($fp, array("31", "5", "8"), ";");
}

fclose($fp);

Edit 2017-11-30: Ukázalo se, že tento trik funguje pouze s novějšími verzemi Excel 2007. Pokud vám tedy nefunguje, zkuste aktualizovat.

Vladislav Skoumal
SKOUMAL CEO