Wie kann ich eine UTF-8-CSV in PHP ausgeben, die Excel richtig liest?

191

Ich habe diese sehr einfache Sache, die nur einige Sachen im CSV-Format ausgibt, aber es muss UTF-8 sein. Ich öffne diese Datei in TextEdit oder TextMate oder Dreamweaver und sie zeigt UTF-8-Zeichen richtig an, aber wenn ich sie in Excel öffne, macht sie stattdessen diese dumme Sache. Folgendes habe ich am Anfang meines Dokuments:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Dies alles scheint den gewünschten Effekt zu haben, außer dass Excel (Mac, 2008) es nicht richtig importieren möchte. In Excel gibt es keine Optionen für mich, um "als UTF-8 zu öffnen" oder so, also ... ich ärgere mich ein wenig.

Ich kann anscheinend nirgendwo klare Lösungen dafür finden, obwohl viele Leute das gleiche Problem haben. Am meisten sehe ich die Stückliste, aber ich kann nicht genau herausfinden, wie das geht. Wie Sie oben sehen echokönnen, schreibe ich nur diese Daten, ich schreibe keine Datei. Ich kann das tun, wenn ich muss, ich bin es einfach nicht, weil es an dieser Stelle nicht nötig zu sein scheint. Irgendeine Hilfe?

Update: Ich habe versucht, die Stückliste so wiederzugeben, wie echo pack("CCC", 0xef, 0xbb, 0xbf);ich sie gerade von einer Site abgerufen habe, die versucht hat, die Stückliste zu erkennen. Aber Excel hängt diese drei Zeichen beim Importieren nur an die allererste Zelle an und bringt die Sonderzeichen immer noch durcheinander.

Ben Saufley
quelle
2
Excel bietet keine Option zum Anpassen des Zeichensatzes der eingehenden Datei? Sind Sie sich da 100% sicher? Ich habe keine Kopie zur Hand, kann sie also nicht ausprobieren, aber ich stelle mir vor, dass irgendwo eine Dropdown-Box vorhanden sein muss .
Pekka
Dies ist Excel auf einem Mac - es scheint eingeschränkter zu sein als Excel auf dem PC. Im Dialogfeld "Öffnen" gibt es überhaupt keine Dropdown-Listen, ab denen die Dateitypen geöffnet werden können. Ich habe überall gesucht. Wenn es da ist, ist es dunkel. Ich würde sagen, 98% sicher.
Ben Saufley
Microsoft Office oder Openoffice?
Ajreal
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 Stückliste. Verdammt.
Ciantic
Die Stückliste hat auch keine Auswirkungen auf Microsoft Excel 2008 für Mac.
Ben Saufley

Antworten:

134

Um einen Microsoft-Supporttechniker zu zitieren ,

Excel für Mac unterstützt derzeit kein UTF-8

Update, 2017 : Dies gilt für alle Versionen von Microsoft Excel für Mac vor Office 2016 . Neuere Versionen (von Office 365) unterstützen jetzt UTF-8.

Um UTF-8-Inhalte auszugeben, die Excel sowohl unter Windows als auch unter OS X erfolgreich lesen kann, müssen Sie zwei Dinge tun:

  1. Stellen Sie sicher, dass Sie Ihren UTF-8-CSV-Text in UTF-16LE konvertieren

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. Stellen Sie sicher, dass Sie am Anfang der Datei die UTF-16LE-Bytereihenfolge hinzufügen

    chr(255) . chr(254)

Das nächste Problem, das nur unter Excel unter OS X (aber nicht unter Windows) auftritt, ist das Anzeigen einer CSV-Datei mit durch Kommas getrennten Werten. Excel rendert nur Zeilen mit einer Zeile und den gesamten Text zusammen mit den Kommas in der ersten Zeile.

Um dies zu vermeiden, verwenden Sie Registerkarten als getrennten Wert.

Ich habe diese Funktion aus den PHP-Kommentaren verwendet (mit Tabulatoren "\ t" anstelle von Kommas) und sie funktionierte perfekt unter OS X und Windows Excel.

Beachten Sie, dass ich zum Beheben eines Problems mit einer leeren Spalte als Zeilenende die Codezeile ändern musste, in der Folgendes steht:

    $field_cnt = count($fields);

zu

    $field_cnt = count($fields)-1;

Wie einige der anderen Kommentare auf dieser Seite besagen, haben andere Tabellenkalkulations-Apps wie OpenOffice Calc, Apples eigene Zahlen und Google Docs Tabellenkalkulation 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 möchte ich hinzufügen, dass Sie, wenn Sie Composer verwenden , einen Blick auf das Hinzufügen League\Csvzu Ihren Anforderungen werfen sollten . League\Csvhat eine wirklich schöne API zum Erstellen von CSV-Dateien .

Zur Verwendung League\Csvmit dieser Methode CSV - Dateien zu erstellen, überprüfen Sie dieses Beispiel

Tim Groeneveld
quelle
1
Nenn mich dumm, aber ich kann das nicht zum Laufen bringen. Ich habe meine Daten mit der Funktion mb_convert_encoding konvertiert und die Stückliste vor dem Dateiinhalt ausgegeben, aber beim Öffnen der Datei in Excel wird nur eine einzelne Zeile mit chinesischen Zeichen angezeigt. Ich verwende im Moment immer noch Kommas anstelle von Tabulatoren, aber vermutlich sollte das nicht dazu führen, was ich sehe.
John Rix
@ JohnRix das ist seltsam. Dieser Code hat buchstäblich jedes Problem gelöst, das ich jemals beim Exportieren von CSV-Dateien hatte - mit Ausnahme von Importeuren, die nur Kommas akzeptieren. Können Sie mir bitte einen Pastebin des von Ihnen verwendeten Codes sowie ein Array, das Sie in eine CSV umwandeln, und eine Kopie der exportierten Datei senden?
Tim Groeneveld
2
Diese Lösung löste auch das UTF8-Problem für mich unter Mac und Windows. Ich habe auch festgestellt, dass das Hinzufügen einer Zeile mit sep=;oder sep=,zur CSV-Datei Excel mitteilt, wie die CSV getrennt ist und die Spalten wieder korrekt erstellt werden.
Luc Wollants
5
Ich stellte fest, dass die Dinge verstümmelt herauskamen, wenn ich die Zeichenfolge nur als Stückliste startete, dann in einer "sep=,\n"anderen Zeile die Daten hinzufügte und in einer anderen Zeile die Daten hinzufügte. Die Dinge waren in Ordnung, wenn ich alles in einer Zeile erledigte ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Auf dem Mac sieht jetzt alles gut aus. Ich habe kein Windows zum Testen.
tremby
2
Einzige Sache, die bei mir voll funktioniert hat. Die Inkonsistenz von Microsoft überrascht mich immer wieder. Beim Speichern einer normalen CSV-Datei wird "," als Trennzeichen verwendet. Wenn jedoch eine Stückliste vorhanden ist, wird sie aus irgendeinem Grund mit "\ t" gespeichert. Das C in .csv steht verdammt noch mal für "COMMA". Es ist wirklich nicht schwer zu tun.
Phil
288

Ich habe das gleiche (oder ein ähnliches) 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 bei Excel 2007 Windows. Ich bin mir nicht sicher, ob es auf dem Mac funktioniert.

Daniel Magliola
quelle
10
Hässlich, aber super hilfreich. Danke dir.
Abelito
7
Ich bin mir ziemlich sicher, dass dies unter OS X leider überhaupt nicht gut funktioniert. Ich denke, es könnte tatsächlich die Stückliste anzeigen, wenn Sie importieren (Warnung: verschwommene Erinnerungen.)
Davidtbernal
2
Das ist richtig. Zumindest habe ich versucht, mit einer Stückliste voranzukommen, wie im obigen Beispiel, aber es wurden tatsächlich nur einige funky Zeichen am Anfang angezeigt und die Sonderzeichen wurden weiterhin falsch angezeigt (getestet in Excel 2011). Dies schien für mich in allen Einstellungen am besten zu funktionieren: stackoverflow.com/a/1648671/1005334 (mit PHP).
Kasimir
4
Ich bekomme immer wieder Benachrichtigungen zu dieser Frage, weil anscheinend viele andere Leute darüber stolpern. Ich wünschte, ich könnte dies als richtig markieren, weil es viel positiv bewertet wurde. Leider habe ich diese Lösung endlich ausprobiert (das Projekt wurde vor langer Zeit abgebrochen) und es funktioniert bei mir in Excel 2008 für Mac nicht. Ich bin froh, dass es für dich funktioniert. Ich habe die Lösung positiv bewertet. Das Excel für Mac 2008-Problem wird dadurch jedoch nicht gelöst. Wenn jemand Glück auf dem Mac hat, lass es mich (und anscheinend jeden ) wissen.
Ben Saufley
Funktioniert hervorragend beim Ausgeben einer CSV-Datei in MS Excel Starter 2010. Vielen Dank!
Jamie Dexter
32

So habe ich es gemacht (um den Browser zum Herunterladen der CSV-Datei aufzufordern):

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 das Problem mit der UTF8-Codierung in der CSV-Vorschau behoben hat, wenn Sie auf dem Mac die Leertaste drücken. Aber nicht in Excel Mac 2008 ... weiß nicht warum

Jazzer
quelle
1
UTF-8 Stücklistenzeile des Codes retten meinen Tag mit dem Export nach xls
Mladen Janjetovic
6
Ich suchte nach einer Möglichkeit, als utf8 direkt in den Browser auszugeben, als ich auf diesen Beitrag stieß. Hier ist meine Lösung mit Credits für diesen Beitrag für die Stückliste und den binären Übertragungsheader. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
Fyrye
Tippfehler - entfernen Sie das Doppel )).
Sitilge
22

Ich habe mich gerade mit dem gleichen Problem befasst und zwei Lösungen gefunden.

  1. Verwenden Sie die von bpeterson76 vorgeschlagene PHPExcel- Klasse .

    • Mit dieser Klasse wird die am besten kompatible Datei generiert. Ich konnte eine Datei aus UTF-8-codierten Daten generieren, die in Excel 2008 Mac, Excel 2007 Windows und Google Text & Tabellen problemlos geöffnet werden konnten.
    • Das größte Problem bei der Verwendung von PHPExcel ist, dass es langsam ist und viel Speicher benötigt, was bei Dateien mit angemessener Größe kein Problem darstellt. Wenn Ihre Excel / CSV-Datei jedoch Hunderte oder Tausende von Zeilen enthält, wird diese Bibliothek unbrauchbar .
    • Hier ist eine PHP-Methode, die einige TSV-Daten aufnimmt und eine Excel-Datei an den Browser ausgibt. Beachten Sie, dass der Excel5 Writer verwendet wird. Dies bedeutet, dass die Datei mit älteren Excel-Versionen kompatibel sein sollte, ich jedoch keinen Zugriff mehr auf diese habe. also 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;   
      }
  2. Aufgrund der Effizienzprobleme mit PHPExcel musste ich auch herausfinden, wie eine UTF-8- und Excel-kompatible CSV- oder TSV-Datei generiert werden kann.

    • Das Beste, was ich finden konnte, war eine Datei, die mit Excel 2008 Mac und Excel 2007 PC kompatibel war, aber nicht Google Text & Tabellen, 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 (Tabulatoren 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;
Jasdeep Gosal
quelle
Ich bin mit dem gleichen Problem unter Windows-7 Excel 2007 konfrontiert und habe alle Vorschläge ausprobiert, aber fehlgeschlagen :(
PHP Ferrari
Die UTF-16LE-Lösung hat funktioniert. Beachten Sie, dass Sie das tsv korrekt formatieren müssen und es muss tsc sein, also tabulatorgetrennt, nicht kommagetrennt. Siehe auch Marc's Beitrag hier: stackoverflow.com/a/1648671/1697370
Ellert van Koperen
16

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();
Reza Mamun
quelle
12

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');
Leopold Gault
quelle
3
Verwenden Sie besser UTF-16LE wie oben vorgeschlagen, das alle vorhandenen Zeichen abdeckt.
Ellert van Koperen
Ich habe festgestellt, dass diese mb_convert_encoding einwandfrei funktioniert und diakritische Zeichen in meiner exportierten XLS-Datei korrekt anzeigt. Ich habe MySQL-Standardkonfigurationen und Apache + PHP eingestellt, um mit utf-8
Junior Mayhé
10

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);

Der 0xEF 0xBB 0xBFStücklistenkopf teilt Excel die korrekte Codierung mit.

Codemole
quelle
1
groß für dich Bruder <3
Adrien G
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- genau das habe ich gebraucht. Es wirkt wie ein Zauber.
Alex
8

Um dies weiterzuverfolgen:

Es scheint, dass das Problem einfach bei Excel auf dem Mac liegt. So generiere ich die Dateien nicht, weil ich sogar CSVs aus Excel generiere sie macht. Ich speichere als CSV und importiere erneut, und alle Charaktere sind durcheinander.

Also ... es scheint keine richtige Antwort darauf zu geben. Vielen Dank für alle Vorschläge.

Ich würde sagen, dass nach allem, was ich gelesen habe, @ Daniel Magliolas Vorschlag zur Stückliste wahrscheinlich die beste Antwort für einen anderen Computer wäre. Aber es löst mein Problem immer noch nicht.

Ben Saufley
quelle
Da die UTF8-Unterstützung zwischen Mac und Windows inkonsistent ist, ist es am besten, eine andere Codierung zu verwenden. Ich habe festgestellt, dass cp1252 im Allgemeinen gut mit Microsoft-Inhalten funktioniert. en.wikipedia.org/wiki/Windows-1252
s29
1
Ben, es gibt eine richtige Antwort auf diese Frage :) Siehe meine!
Tim Groeneveld
7

Dies funktioniert in Excel sowohl für Windows als auch für Mac OS einwandfrei.

Behebung von Problemen in Excel, bei denen keine Zeichen mit diakritischen Zeichen, kyrillischen Buchstaben, griechischen Buchstaben und Währungssymbolen angezeigt werden.

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}
Murali Krishna
quelle
Diese Lösung ermöglichte es mir, den Export auch für Google Sheets zum Laufen zu bringen (einige andere scheiterten)
Cafn
6

Die CSV-Datei muss ein Byte Order Mark enthalten.

Oder wie vorgeschlagen und Problemumgehung, geben Sie es einfach mit dem HTTP-Body wieder

Cybot
quelle
4

Da die UTF8-Codierung mit Excel nicht gut funktioniert. Sie können die Daten mit in einen anderen Codierungstyp konvertieren iconv().

z.B

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),
Abrar A. Shareef
quelle
Dies war die einzige Lösung, die für mich mit Excel Mac 2011
Christer Fernstrom
4

Hinzufügen:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Oder:

fprintf($file, "\xEF\xBB\xBF");

Vor dem Schreiben von Inhalten in eine CSV-Datei.

Beispiel:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);
Rejaul
quelle
3

Das Konvertieren von bereits utf-8-codiertem Text mithilfe von mb_convert_encodingist nicht erforderlich. Fügen Sie einfach drei Zeichen vor dem ursprünglichen Inhalt hinzu:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Für mich löste dies das Problem der Sonderzeichen in CSV-Dateien.

Rvanlaak
quelle
Unglaublich; Ich habe mindestens 10 andere Lösungen ausprobiert und die einzige Lösung für mich scheint diese zu sein, wenn sie mit UTF-8 BOM via kombiniert wird fputs.
Kaarto
2

Als ich nachforschte und feststellte, dass UTF-8 unter MAC und Windows nicht gut funktioniert, habe ich es mit Windows-1252 versucht. Es unterstützt beide gut, aber Sie müssen den Codierungstyp unter Ubuntu auswählen. Hier ist mein Code$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM
Ho Ha
quelle
2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($filename, $headings, $data) {

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel
    exit;
}
Sagar72427
quelle
2
Im Allgemeinen sind Antworten viel hilfreicher, wenn sie eine Erklärung enthalten, was der Code tun soll und warum dies das Problem löst, ohne andere einzuführen.
Tim Diekmann
1

Wie wäre es nur mit der Ausgabe für Excel selbst? Dies ist eine hervorragende Klasse , mit der Sie XLS-Dateien serverseitig generieren können. Ich benutze es häufig für Kunden, die CSVs nicht "herausfinden" können und bisher noch nie eine Beschwerde erhalten haben. Es ermöglicht auch einige zusätzliche Formatierungen (Schattierungen, Zeilenhöhen, Berechnungen usw.), die csv niemals ausführen wird.

bpeterson76
quelle
Beachten Sie, dass phpexcel Probleme mit großen Datenmengen hat.
Ellert van Koperen
1

Sie können Ihren CSV-String mit iconv konvertieren . beispielsweise:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );
foued611
quelle
Tolle Beispieltexte;)
Ngeek
1

Sie müssen die Codierung "Windows-1252" verwenden.

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Vielleicht müssen Sie Ihre Zeichenfolgen konvertieren:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}
roNn23
quelle
1

Sie können die 3 Bytes vor dem Export an die Datei anhängen, es funktioniert für mich. Zuvor funktionierte das System nur unter Windows und HP-UX, schlug jedoch unter Linux fehl.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

Haben Sie eine UTF-8-Stückliste (3 Bytes, hexadezimal EF BB BF) am Anfang der Datei. Andernfalls interpretiert Excel die Daten gemäß der Standardcodierung Ihres Gebietsschemas (z. B. cp1252) anstelle von utf-8

Generieren einer CSV-Datei für Excel, wie eine neue Zeile in einem Wert eingefügt wird

Cherry Yap
quelle
1

Ich bin auf einem Mac, in meinem Fall musste ich nur das Trennzeichen mit angeben "sep=;\n"und die Datei in UTF-16LE wie folgt codieren:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
Sebastien Horin
quelle
1

Bei mir hat keine der oben genannten Lösungen funktioniert. Folgendes habe ich getan, um das Problem zu beheben: Ändern Sie den Wert mithilfe dieser Funktion im PHP-Code:

$value = utf8_encode($value);

Diese Ausgabewerte werden in einem Excel-Blatt korrekt angezeigt.

Barani r
quelle
0

Ich hatte das gleiche Problem, als ich eine Excel VBA-Routine hatte, die Daten importierte. Da es sich bei CSV um ein Nur-Text-Format handelt, habe ich dies umgangen, indem ich die Daten programmgesteuert in einem einfachen Datei-Editor wie Wordpad geöffnet und als Unicode-Text erneut gespeichert oder von dort in die Zwischenablage kopiert und in Excel eingefügt habe. Wenn Excel die CSV nicht automatisch in Zellen analysiert, kann dies mithilfe der integrierten Funktion "Text in Spalten" problemlos behoben werden.

Alain
quelle
Ich habe das versucht! Aber es ist bereits als Unicode-Text codiert. Das Speichern als Unicode-Text ändert nichts. Wie würde ich es als einfachen Text speichern, ohne alle Sonderzeichen falsch zu interpretieren?
Ben Saufley
Ich denke, mit "Speichern als Unicode-Text" könnte Alain "UTF-16LE" bedeuten. Windows verwendet häufig (leider) "Unicode", um fälschlicherweise auf UTF-16LE oder UTF-16LE mit einer führenden Stückliste zu verweisen. Im Dialogfeld Datei -> Speichern des Notepads wird auf diese Weise "Unicode" verwendet.
Thanatos
0

Tritt das Problem immer noch auf, wenn Sie es als TXT-Datei speichern und diese in Excel mit Komma als Trennzeichen öffnen?

Das Problem ist möglicherweise überhaupt nicht die Codierung, sondern möglicherweise nur, dass die Datei nach Excel-Standards keine perfekte CSV ist.

Alain
quelle
Soweit ich weiß, ist die CSV-Formatierung in Ordnung. Ich kann eine "perfekte" CSV in TextEdit erstellen, kein Problem, oder sogar eine txt in eine CSV umbenennen, sodass nichts Geheimnisvolles fehlt - CSVs sind nur Textdateien. Außerdem ist die Formatierung in Excel perfekt, es sind nur die Sonderzeichen, die brechen. Aber nur für den Fall, ich habe Ihren Vorschlag ausprobiert und er führt leider zu denselben Problemen.
Ben Saufley
Aus der Abteilung "WTF haben sie gedacht": Beachten Sie, dass laut Microsoft das richtige Feldtrennzeichen vom Gebietsschema abhängig ist. Eine durch Kommas getrennte Datei erfordert möglicherweise, dass Felder in einigen Gebietsschemas tatsächlich durch Semikolons getrennt sind - und Sie können nichts tun, außer OpenOffice
vorzuschlagen
Das ist ziemlich verrückt - leider habe ich keine Probleme, Felder richtig abzugrenzen. Ich habe nur Probleme mit diesen Sonderzeichen.
Ben Saufley
0

Dieser Beitrag ist ziemlich alt, aber nach stundenlangem Versuch möchte ich meine Lösung teilen. Vielleicht hilft er jemandem, der mit Excel, Mac und CSV zu tun hat, und stolpert über diese Bedrohung. Ich generiere eine CSV dynamisch als Ausgabe aus einer Datenbank für Excel-Benutzer. (UTF-8 mit Stückliste)

Ich habe viele Iconvs ausprobiert, konnte aber keine deutschen Umlaute in Mac Excel 2004 zum Laufen bringen. Eine Lösung: PHPExcel. Es ist toll, aber für mein Projekt etwas zu viel. Was für mich funktioniert, ist die Erstellung der CSV-Datei und die Konvertierung dieser CSV-Datei in XLS mit diesem PHPsnippet: CSV2XLS . Das Ergebnis xls funktioniert mit deutschen Excel-Umlauten (ä, ö, Ü, ...).

t Buchen
quelle
0

Ich habe gerade diese Header ausprobiert und Excel 2013 auf einem Windows 7-PC installiert, um die CSV-Datei mit Sonderzeichen korrekt zu importieren. Das Byte Order Mark (BOM) war der letzte Schlüssel, mit dem es funktioniert hat.

    Header ('Content-Encoding: UTF-8');
    Header ('Inhaltstyp: Text / CSV; Zeichensatz = UTF-8');
    Header ("Inhaltsdisposition: Anhang; Dateiname = Dateiname.csv");
    Header ("Pragma: public");
    Header ("Expires: 0");
    Echo "\ xEF \ xBB \ xBF"; // UTF-8-Stückliste

Brian
quelle
Ja, das ist richtig, es funktioniert korrekt in Excel für Windows, aber wie in meiner Antwort erläutert, funktioniert es nicht in Excel für OS X.
Tim Groeneveld
0

Andernfalls können Sie:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);
user3519396
quelle
0

EINFACHE Lösung für Mac Excel 2008: Ich hatte viele Probleme damit, aber hier war meine einfache Lösung: Öffnen Sie die CSV-Datei in Textwrangler, um Ihre UTF-8-Zeichen korrekt zu öffnen. Ändern Sie nun in der unteren Statusleiste das Dateiformat von "Unicode (UTF-8)" in "Western (ISO Latin 1)" und speichern Sie die Datei. Gehen Sie nun zu Ihrem Mac Excel 2008 und wählen Sie "Datei"> "Importieren"> "CSV auswählen"> "Datei suchen"> "Dateiherkunft". Wählen Sie "Windows (ANSI)" und voila, die UTF-8-Zeichen werden korrekt angezeigt. Zumindest für mich ...

Poul
quelle
0

Ich benutze das und es funktioniert

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
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');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;
BoRnbeBaD
quelle
0

# eine UTF-8-CSV in PHP ausgeben, die Excel richtig liest.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
Murali Krishna
quelle
Eine Antwort pro Person reicht aus.
Denken
-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));
b3wii
quelle
Diese Frage fragt nicht nach der Konvertierung, sondern nach der Ausgabe. Der relevante Teil dieses Beitrags, der in UTF-16 ausgegeben wird, ist bereits in der ausgewählten Antwort enthalten .
Ben Saufley
@ BenSaufley Nun, aber es löst das Problem der Frage mit 2 einfachen Codezeilen
b3wii
Die Frage ist bereits gelöst und auch ausführlicher erklärt.
Ben Saufley