ADBLOCK DEAKTIVIEREN

ADBlock blockiert einige Inhalte auf der Website

ADBlock errore

Wie kann ich Ausgang einen UTF-8 CSV in PHP, dass Excel richtig gelesen?

StackOverflow https://stackoverflow.com/questions/4348802

Frage

Ich habe diese sehr einfache Sache bekam, die nur ein paar Sachen im CSV-Format ausgibt, aber es muss UTF-8 sein. Ich öffnen Sie diese Datei in TextEdit oder Textmate oder Dreamweaver und es zeigt UTF-8-Zeichen richtig, aber wenn ich es in Excel öffnen es tut diese dumme Iá Art der Sache statt. Hier ist, was ich an der Spitze von meinem Dokument habe:

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

Dies scheint alles den gewünschten Effekt außer Excel (Mac, 2008) haben will es nicht richtig importieren. Es gibt keine Optionen in Excel für mich „offen als UTF-8“ oder so, so ... Ich bin immer ein wenig verärgert.

Ich kann keine klare Lösungen für dieses überall zu finden scheinen, trotz einer Menge Leute das gleiche Problem. Das, was ich am meisten zu sehen ist die Stückliste enthält, aber ich kann nicht genau herausfinden, wie das zu tun. Wie Sie sehen können oben ich diese Daten nur bin echoing, schreibe ich keine Datei. Das kann ich tun, wenn ich brauche, ich bin einfach nicht, weil es an dieser Stelle nicht für sie wie ein Bedürfnis scheint. Jede Hilfe?

Update: Ich habe versucht, die Stückliste als echo pack("CCC", 0xef, 0xbb, 0xbf); Echo, die ich gerade von einer Stelle gezogen, dass die Stückliste zu erfassen versuchte. Aber Excel nur anhängt diese drei Zeichen an die erste Zelle, wenn sie die Einfuhr und noch vermasselt die Sonderzeichen.

Lösung

Um Zitat ein Support-Techniker Microsoft,

  

Excel für Mac derzeit nicht UTF-8

Unterstützung

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

Um die Ausgabe UTF-8 Inhalts, dass Excel sowohl unter Windows und OS X der Lage, erfolgreich zu lesen, müssen Sie zwei Dinge tun:

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

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. Stellen Sie sicher, dass Sie die UTF-16LE Bytereihenfolgemarkierung

    hinzufügen
    chr(255) . chr(254)
    

Das nächste Problem, das nur mit Excel auf OS X erscheint (aber nicht Windows) sein wird, wenn Sie eine CSV-Datei angezeigt wird mit Komma getrennte Werte, werden Excel-Zeilen machen nur mit einer Zeile und alle die Text zusammen mit den Kommas in der ersten Reihe.

Der Weg, dies zu vermeiden, ist Tabs als separater Wert zu verwenden.

Ich benutzte diese Funktion über die PHP Kommentare (mit Tabs " \ t“statt Komma) und es funktionierte perfekt auf OS X und Windows Excel.

Beachten Sie, dass ein Problem mit einer leeren Spalte als das Ende einer Zeile zu beheben, dass ich die Codezeile musste sich ändern, das sagt:

    $field_cnt = count($fields);

    $field_cnt = count($fields)-1;

Wie einige der anderen Kommentare auf dieser Seite sagen wir, andere Tabellen Anwendungen wie Openoffice Calc, Apples eigenen Zahlen und Google Docs Spreadsheet haben keine Probleme mit UTF-8-Dateien mit Kommas.

Siehe in dieser Frage für das, was funktioniert und nicht funktioniert für Unicode CSV-Dateien in Excel


Als Randbemerkung, ich möchte hinzufügen, dass, wenn Sie mit Composer , Sie einen Blick auf das Hinzufügen sollte League\Csv zu Ihrem erfordert. League\Csv hat eine wirklich schöne API für den Aufbau von CSV-Dateien .

Um League\Csv mit dieser Methode zum Erstellen von CSV-Dateien zu verwenden, Check-out In diesem Beispiel

ANDERE TIPPS

Ich habe das gleiche (oder ähnliches) Problem.

In meinem Fall, wenn ich eine Stückliste mit dem Ausgang hinzufügen, funktioniert es:

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, dies ein ziemlich hässlicher Hack, aber es funktionierte für mich, zumindest für Excel 2007 von Windows. Nicht sicher, dass es auf dem Mac arbeiten.

Hier ist, wie ich es getan hätte (das ist auf dem schnellen Browser, um die CSV-Datei zum Download):

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 fest UTF8 Problem im CSV-Vorschau, wenn Sie Leertaste auf Mac .. aber nicht in Excel Mac 2008 ... weiß nicht, warum

ich behandeln nur mit dem gleichen Problem, und kam mit zwei Lösungen auf.

  1. Mit der PHPExcel Klasse wie bpeterson76 vorgeschlagen.

    • diese Klasse Mit der am weitesten kompatible Datei erzeugt, konnte ich eine Datei von UTF-8 kodierten Daten generieren, die in Excel 2008 geöffnet Fein Mac, Excel 2007 Windows und Google Docs.
    • Das größte Problem mit PHPExcel ist, dass es langsam ist und verwendet eine Menge Speicher, die für eine vernünftige Größe Dateien sind kein Problem, aber , wenn Ihre Excel / CSV-Datei Hunderte oder Tausende von Zeilen hat, diese Bibliothek unbrauchbar .
    • Hier ist eine PHP-Methode, die einige TSV-Daten und Ausgabe eine Excel-Datei an den Browser nehmen, beachten Sie, dass es die Excel5 Writer verwendet, das bedeutet, dass die Datei mit älteren Versionen von Excel kompatibel sein sollte, aber ich nicht mehr hat Zugang zu einem, so dass ich sie nicht testen kann.

      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, ich auch, um herauszufinden, hatte, wie eine UTF-8 & Excel kompatible CSV oder TSV-Datei zu erzeugen.

    • Das Beste, was ich tun konnte, war eine Datei, die mit Excel 2008 Mac-kompatibel war und Excel 2007 PC, aber nicht Google Text & Tabellen, die für meine Anwendung gut genug ist.
    • fand ich die Lösung href="https://stackoverflow.com/questions/155097/microsoft-excel-mangles-diacritics-in-csv-files">, insbesondere diese Antwort , aber Sie sollten auch die accepted beantworten wie sie das Problem erklärt.
    • Hier ist der PHP-Code, den ich verwenden, beachten Sie, dass ich tsv Daten (Tabs als Trennzeichen statt Komma) bin mit:

      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;
      

Ich habe das gleiche Problem mit und es wurde gelöst, wie unten:

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

Excel nicht unterstützt UTF-8. Sie haben Ihren UTF-8-Text in UCS-2LE zu kodieren.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

Um Follow-up auf diese:

Es scheint, dass das Problem auf dem Mac einfach mit Excel ist. Es ist nicht, wie ich die Dateien bin zu erzeugen, denn selbst zu erzeugen CSVs von Excel sie bricht. Ich speichern als CSV und Re-Import, und alle Zeichen vermasselt.

Also ... es scheint keine richtige Antwort auf diese zu sein. Vielen Dank für alle Vorschläge.

Ich würde sagen, dass aus allem, was ich gelesen habe, @ Daniel Magliola Vorschlag über die BOM wahrscheinlich die beste Antwort für einen anderen Computer wäre. Aber es immer noch nicht mein Problem lösen.

In meinem Fall folgenden Arbeiten sehr schön in CSV-Datei mit UTF-8-Zeichen korrekt angezeigt in Excel zu machen.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

Die 0xEF 0xBB 0xBF BOM-Header lässt Excel die richtige Codierung kennen.

Dies funktioniert in Excel für Windows und auch Mac OS.

Fix Probleme in Excel, die nicht Zeichen enthalten, diakritische Zeichen, kyrillische Buchstaben, griechische Buchstaben und Währungssymbole 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;
}

Die CSV-Datei Muß eine Byte Order Mark enthalten.

Oder wie vorgeschlagen und Umgehung nur echo es mit dem HTTP-Körper

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

z.

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

hinzu:

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

Oder:

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

Vor dem Inhalt in einem CSV-Datei zu schreiben.

Beispiel:

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

Konvertieren bereits utf-8 kodierten Text von mb_convert_encoding Verwendung ist nicht erforderlich. Fügen Sie einfach drei Zeichen vor dem ursprünglichen Inhalt:

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

Für mich ist das das Problem der Sonderzeichen in CSV-Dateien behoben.

Wie ich untersuchte, und ich fand, dass UTF-8 ist nicht gut auf MAC und Windows arbeiten, damit ich mit dem Windows-1252 versucht, es unterstützt auch auf beide, aber Sie müssen Art der Codierung auf Ubuntu wä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

**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;
}

Wie wäre die Ausgabe nur für Excel selbst? Dies ist eine ausgezeichnete Klasse , die Sie XLS-Dateien serverseitige generieren können. Ich benutze es häufig für Kunden, die nicht „figure out“ csv ist und bisher haben noch nie eine Beschwerde. Es ermöglicht auch einige zusätzliche Formatierung (Beschattung, RowHeights, Berechnungen, etc.), dass csv nicht immer tun.

Sie können Ihre CSV-String mit iconv konvertieren.  zum Beispiel:

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

Sie haben die Codierung "Windows-1252" zu verwenden.

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

Vielleicht haben Sie Ihre Strings konvertieren:

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

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

Sie können die 3 Bytes in die Datei anhängen vor dem Export, es funktioniert für mich. Zuvor, dass das System nur funktioniert in Windows und HP-UX aber nicht in Linux.

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 einen UTF-8 BOM (3 Bytes, hex EF BB BF) am Anfang der Datei. Ansonsten Excel die Daten entsprechend Ihr Gebietsschemas der Standard-Kodierung (z cp1252) anstelle von utf-8

interpretieren

Erstellung CSV-Datei für Excel, wie eine neue Zeile in einem Wert haben

ich auf Mac bin, in meinem Fall hatte ich nur den Separator mit "sep=;\n" angeben und die Datei in UTF-16LE wie folgt kodieren:

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

Für mich keinen der Lösung oben gearbeitet. Im Folgenden finden Sie, was ich das Problem zu lösen hat: Ändern Sie den Wert dieser Funktion in der PHP-Code verwendet:

$value = utf8_encode($value);

Werte Dieser Ausgang richtig in einem Excel-Sheet.

Ich hatte das gleiche Problem, wenn ich, dass importierte Daten eine Excel-VBA-Routine hatte. Da CSV ein Textformat ist, arbeite ich dies um durch programmatisch die Daten in einem einfachen Datei-Editor wie WordPad öffnen und es als Unicode-Text erneut speichern oder in die Zwischenablage von dort kopieren und in Excel einfügen. Wenn Excel nicht automatisch die CSV in den Zellen analysieren, dies leicht behoben ist die eingebaut „Text in Spalten“ Funktion.

Ist das Problem immer noch auftreten, wenn Sie es als TXT-Datei speichern und öffnen, die in Excel mit Komma als Trennzeichen?

Das Problem ist möglicherweise nicht die Codierung überhaupt, könnte es nur sein, dass die Datei nicht eine perfekte CSV ist nach Excel-Standards.

Dieser Beitrag ist ziemlich alt, aber nach Stunden zu versuchen, möchte ich meine Lösung teilen ... vielleicht hilft es jemanden Umgang mit Excel und Mac und CSV und stolpert über diese Bedrohung. Ich erzeuge eine csv dynamisch als Ausgabe aus einer Datenbank mit Excel-Benutzer im Auge behalten. (UTF-8 mit BOM)

habe ich versucht, eine Menge iconv's aber kann nicht Deutsch Umlaute Arbeit in Mac Excel 2004. Eine Lösung erhalten: PHPExcel. Es ist großartig, aber für mein Projekt ein bisschen zu viel. Was funktioniert bei mir die CSV-Datei wird das Erstellen und konvertieren xls diese CSV-Datei mit diesem PHPsnippet: csv2xls . das Ergebnis xls arbeitet mit Excel Deutsch Umlaute (ä, ö, ü, ...).

Ich habe gerade versucht, diese Header und bekam Excel 2013 auf einem Windows 7 PC korrekt die CSV-Datei mit Sonderzeichen zu importieren. Die Byte Order Mark (BOM) war der letzte Schlüssel, machte es funktionieren.

    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header("Content-disposition: attachment; filename=filename.csv");
    header("Pragma: public");
    header("Expires: 0");
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

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

EASY-Lösung für Mac Excel 2008: Ich kämpfte mit diesem soo oft, aber hier war meine einfache Lösung: Öffnen Sie die CSV-Datei in TextWrangler die Ihre UTF-8 Zeichen richtig öffnen sollte. Jetzt in der unteren Statusleiste ändert das Dateiformat von „Unicode (UTF-8)“ auf „Western (ISO Latin 1)“ und speichern Sie die Datei. Gehen Sie jetzt zu Ihrem Mac Excel 2008 und wählen Sie Datei> Importieren> Wählen Sie csv> Finden Sie Ihre Datei> in Datei Herkunft wählen „Windows (ANSI)“ und voila der UTF-8-Zeichen zeigen richtig. Wenigstens tut es für mich ...

Ich benutze dies 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;

#output UTF-8-CSV in PHP, dass Excel richtig lesen.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow