CSV fájl készítése Microsoft Excel számára

A Microsoft és a Cisco élen jár abban, hogy saját módon értelmezzék a szabványokat, amiket amúgy az egész világ betart. Például ha CSV formátumot szeretnénk használni – amire RFC szabvány is van – akkor a Microsoft kicsit átalakítja a saját szájíze szerint. Például magyar lokalizációs területen SSV lesz belőle (Semicolon Separated Values azaz pontosvessző, Comma azaz vessző helyett). Az idézőjeleket is sajátságosan kezeli, a karakterkódolásról már ne is beszéljünk (persze, hogy Windows-1252 és nem UTF-8, amiben nagy eséllyel az adatbázisban van.

A megoldást ez a weboldal adta meg: https://www.skoumal.net/en/making-utf-8-csv-excel/ köszönet érte. A szokványos PHP-s leírásoktól ez abban tér el, hogy az UTF-8 fájl elejére odateszi a BOM-ot is (Byte Order Mark), aminek köszönhetően az Excel nem fogja valami alien titkosírásnak vélni az amúgy megfelelően formázott szöveget.

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; charset=utf-8');
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);