Starije verzije Excela ne kapiraju UTF8 BOM na pocetku, pa mozes da probas i ovako da saljes fajl:
PHP kôd:
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename='.$filename.'.xls');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
$csv = chr(255) . chr(254) . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
header('Content-Length: '. strlen($csv));
echo $csv;
exit;
I koristi tabove "\t" kao delimiter, umesto zareza...
$filename je ime koje se nudi korisniku kod snimanja, $csv je string sa CSV podacima ($header i $data u tvom slucaju).
Mana je sto moras da imas PHP koji podrzava mb_convert_encoding() f-ju, ali zato radi sa svim zivim Excelima koje sam probao...