
Ben Sauley
Ich habe dieses sehr einfache Ding, das nur einige Sachen im CSV-Format ausgibt, aber es muss UTF-8 sein. Ich öffne diese Datei in TextEdit, TextMate oder Dreamweaver und sie zeigt UTF-8-Zeichen richtig an, aber wenn ich sie in Excel öffne, macht sie stattdessen diese dumme Sache. Hier ist, was ich am Anfang meines Dokuments habe:
header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");
Dies scheint alles den gewünschten Effekt zu haben, außer dass Excel (Mac, 2008) es nicht richtig importieren möchte. In Excel gibt es keine Optionen zum “Öffnen als UTF-8” oder so, also … ich werde ein wenig genervt.
Ich kann anscheinend nirgendwo klare Lösungen dafür finden, obwohl viele Leute das gleiche Problem haben. Das, was ich am häufigsten sehe, ist, die Stückliste einzufügen, aber ich kann nicht genau herausfinden, wie das geht. Wie Sie oben sehen können, bin ich nur echo
Wenn ich diese Daten speichere, schreibe ich keine Datei. Ich kann das tun, wenn ich muss, ich bin es nur nicht, weil es zu diesem Zeitpunkt keinen Bedarf dafür zu geben scheint. Irgendeine Hilfe?
Update: Ich habe versucht, die Stückliste als wiederzugeben echo pack("CCC", 0xef, 0xbb, 0xbf);
die ich gerade von einer Website gezogen habe, die versucht hat, die Stückliste zu erkennen. Aber Excel hängt diese drei Zeichen beim Importieren einfach an die allererste Zelle an und bringt immer noch die Sonderzeichen durcheinander.

Daniel Magliola
Ich habe das gleiche (oder ähnliche) Problem.
In meinem Fall funktioniert es, wenn ich der Ausgabe eine Stückliste hinzufüge:
header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
Ich glaube, das ist ein ziemlich hässlicher Hack, aber er hat bei mir funktioniert, zumindest für Excel 2007 Windows. Ich bin mir nicht sicher, ob es auf dem Mac funktioniert.

Tim Gröneveld
Zitieren ein Microsoft-Supporttechniker,
Excel für Mac unterstützt derzeit UTF-8 nicht
Aktualisierung, 2017: Dies gilt für alle früheren Versionen von Microsoft Excel für Mac Büro 2016. Neuere Versionen (ab Office 365) unterstützen jetzt UTF-8.
Um UTF-8-Inhalte auszugeben, die Excel sowohl unter Windows als auch OS X erfolgreich lesen kann, müssen Sie zwei Dinge tun:
-
Stellen Sie sicher, dass Sie Ihren UTF-8-CSV-Text in UTF-16LE konvertieren
mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
-
Stellen Sie sicher, dass Sie die hinzufügen UTF-16LE-Byte-Reihenfolgemarke zum Anfang der Datei
chr(255) . chr(254)
Das nächste Problem, das nur mit Excel unter OS X auftritt (aber nicht Windows) beim Anzeigen einer CSV-Datei mit kommagetrennten Werten, Excel rendert Zeilen nur mit einer Zeile und dem gesamten Text zusammen mit den Kommas in der ersten Zeile.
Um dies zu vermeiden, verwenden Sie Tabulatoren als getrennten Wert.
ich benutzte diese Funktion aus den PHP-Kommentaren (mit Tabulatoren “\t” anstelle von Kommas) und es funktionierte perfekt unter OS X und Windows Excel.
Beachten Sie, dass ich zur Behebung eines Problems mit einer leeren Spalte am Ende einer Zeile die folgende Codezeile ändern musste:
$field_cnt = count($fields);
zu
$field_cnt = count($fields)-1;
Wie einige der anderen Kommentare auf dieser Seite sagen, haben andere Tabellenkalkulations-Apps wie OpenOffice Calc, Apples eigene Numbers und Google Docs Spreadsheet keine Probleme mit UTF-8-Dateien mit Kommas.
In der Tabelle in dieser Frage erfahren Sie, was für Unicode-CSV-Dateien in Excel funktioniert und was nicht
Als Randnotiz könnte ich das hinzufügen, wenn Sie verwenden Komponistsollten Sie sich das Hinzufügen ansehen League\Csv
zu Ihren Anforderungen. League\Csv
hat eine wirklich schöne API zum Erstellen von CSV-Dateien.
Benutzen League\Csv
mit dieser Methode zum Erstellen von CSV-Dateien, check out dieses Beispiel

Jazzer
So habe ich es gemacht (das soll den Browser auffordern, die CSV-Datei herunterzuladen):
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();
Das einzige, was es behoben hat, war das UTF8-Codierungsproblem in der CSV-Vorschau, wenn Sie auf dem Mac die Leertaste gedrückt haben. Aber nicht in Excel Mac 2008 … ich weiß nicht warum
In meinem Fall funktioniert das Folgende sehr gut, um eine CSV-Datei mit UTF-8-Zeichen zu erstellen, die in Excel korrekt angezeigt werden.
$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);
Die 0xEF 0xBB 0xBF
Der BOM-Header teilt Excel die korrekte Kodierung mit.

Jasdeep Gosal
Ich habe mich gerade mit dem gleichen Problem befasst und bin auf zwei Lösungen gekommen.
-
Verwenden Sie die PHPExcel Klasse wie von bpeterson76 vorgeschlagen.
- Die Verwendung dieser Klasse generiert die am weitesten kompatible Datei. Ich konnte eine Datei aus UTF-8-codierten Daten generieren, die sich problemlos in Excel 2008 Mac, Excel 2007 Windows und Google Docs öffnen ließ.
- Das größte Problem bei der Verwendung von PHPExcel ist, dass es langsam ist und viel Speicher verbraucht, was bei Dateien mit angemessener Größe kein Problem darstellt, aber Wenn Ihre Excel-/CSV-Datei Hunderte oder Tausende von Zeilen enthält, wird diese Bibliothek unbrauchbar.
-
Hier ist eine PHP-Methode, die einige TSV-Daten nimmt und eine Excel-Datei an den Browser ausgibt. Beachten Sie, dass sie den Excel5-Writer verwendet, was bedeutet, dass die Datei mit älteren Versionen von Excel kompatibel sein sollte, aber ich habe keinen Zugriff mehr darauf. daher kann ich sie nicht testen.
function excel_export($tsv_data, $filename) {
$export_data = preg_split("/\n/", $tsv_data);
foreach($export_data as &$row) {
$row = preg_split("/\t/", $row);
}
include("includes/PHPExcel.php");
include('includes/PHPExcel/Writer/Excel5.php');
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();
$row = '1';
$col = "A";
foreach($export_data as $row_cells) {
if(!is_array($row_cells)) { continue; }
foreach($row_cells as $cell) {
$sheet->setCellValue($col.$row, $cell);
$col++;
}
$row += 1;
$col = "A";
}
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');
exit;
}
-
Aufgrund der Effizienzprobleme mit PHPExcel musste ich auch herausfinden, wie man eine UTF-8- und Excel-kompatible CSV- oder TSV-Datei generiert.
- Das Beste, was mir einfallen konnte, war eine Datei, die mit Excel 2008 Mac und Excel 2007 PC kompatibel war, aber nicht mit Google Docs, was für meine Anwendung gut genug ist.
- Ich habe hier die Lösung gefunden, speziell diese Antwort, aber Sie sollten auch die akzeptierte Antwort lesen, da sie das Problem erklärt.
-
Hier ist der PHP-Code, den ich verwendet habe, beachten Sie, dass ich tsv-Daten verwende (Tabs als Trennzeichen anstelle von Kommas):
header ( 'HTTP/1.1 200 OK' );
header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Content-Type: application/vnd.ms-excel') ;
header ( 'Content-Disposition: attachment;filename=export.csv' );
print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
exit;

Reza Mamun
Ich hatte das gleiche Problem und es wurde wie folgt gelöst:
header('Content-Encoding: UTF-8');
header('Content-Type: text/csv; charset=utf-8' );
header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
$df = fopen( 'php://output', 'w' );
//This line is important:
fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!
foreach ( $rows as $row ) {
fputcsv( $df, $row );
}
fclose($df);
exit();

j0k
Excel unterstützt UTF-8 nicht. Sie müssen Ihren UTF-8-Text in UCS-2LE codieren.
mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');
9876000cookie-checkWie kann ich eine UTF-8-CSV-Datei in PHP ausgeben, die Excel richtig liest?yes
Excel bietet keine Option zum Anpassen des Zeichensatzes der eingehenden Datei? Bist du dir da 100% sicher? Ich habe keine Kopie zur Hand, also kann ich es nicht ausprobieren, aber ich stelle es mir vor Muss irgendwo ein Dropdown-Feld sein.
– Pekka
3. Dezember 2010 um 18:50 Uhr
Dies ist Excel auf einem Mac – es scheint eingeschränkter zu sein als Excel auf dem PC. Es gibt überhaupt keine Dropdowns im Öffnen-Dialog, darüber hinaus welche Dateitypen geöffnet werden können. Ich habe überall gesucht. Wenn es da ist, ist es dunkel. Ich würde sagen 98% sicher.
– Ben Sauley
3. Dezember 2010 um 18:54 Uhr
Microsoft Office oder OpenOffice?
– ajreal
3. Dezember 2010 um 18:59 Uhr
Microsoft ist in dieser Hinsicht besser, es gibt keine Möglichkeit (die ich gefunden habe), OpenOffice dazu zu bringen, den Zeichensatz zu erkennen, nicht einmal die BOM. Verdammt.
– Ziant
15. August 2012 um 7:45 Uhr
BOM hat auch keine Auswirkungen auf Microsoft Excel 2008 für Mac.
– Ben Sauley
15. August 2012 um 17:08 Uhr