Frage

ich programmatisch am Export von Daten (unter Verwendung von PHP 5.2) in eine CSV-Testdatei.
Beispieldaten: Numéro 1 (man beachte den Akzent e). Die Daten sind utf-8 (kein vorangestellter BOM).

Wenn ich diese Datei in MS Excel geöffnet ist angezeigt als Numéro 1.

Ich bin der Lage, dies in einem Texteditor zu öffnen (UltraEdit), die es richtig angezeigt wird. UE meldet das Zeichen decimal 233.

Wie kann ich Export Text Daten in einer CSV-Datei so , dass MS Excel richtig machen es, vorzugsweise ohne die Verwendung der Import-Assistenten zu zwingen, oder nicht Standardassistenteneinstellungen?

War es hilfreich?

Lösung

Eine richtig formatiert UTF8-Datei eine Byte Order Mark als ersten drei Oktetts . Dies sind die Hex-Werte 0xEF, 0xBB, 0xBF. Dieses Bytes dient die Datei als UTF-8 markieren (da sie nicht relevant als „Byte-Reihenfolge“ -Informationen sind). 1 Wenn diese BOM nicht vorhanden ist, wird der Verbraucher / Leser überlassen den Codierungstyp des Textes zu schließen. Die Leser, die nicht UTF8 der Lage sind, werden die Bytes als eine andere Codierung wie Windows-1252 gelesen und die Zeichen angezeigt werden  am Anfang der Datei.

Es ist ein bekannter Fehler in dem Excel, auf UTF8 CSV-Dateien über Dateizuordnung zu öffnen, geht davon aus, dass sie in einer Single-Byte-Codierung sind, Mißachtung die Anwesenheit der UTF8 BOM. Dies kann nicht von jeder System-Standard-Codepage oder Spracheinstellung festgelegt werden. Die Stückliste wird nicht Anhaltspunkt in Excel - es wird einfach nicht funktionieren. (Eine Minderheit Bericht behauptet, dass die BOM manchmal den „Import Text“ Assistent löst.) Dieser Fehler erscheint in Excel 2003 und früheren Versionen existieren. Die meisten Berichte (inmitten der Antworten hier) sagen, dass diese in Excel 2007 und höher festgelegt ist.

Beachten Sie, dass können immer * korrekt geöffnet UTF8 CSV-Dateien in Excel die „Import Text“ Assistenten, mit dem Sie die Codierung der Datei, die Sie öffnen angeben können. Natürlich ist das viel weniger bequem.

Die Leser dieser Antwort sind am ehesten in einer Situation, wo sie besonders Excel nicht unterstützt <2007, aber roh UTF8 Text in Excel senden, die sie und Berieselungs Ihren Textes mit à und anderen ähnlichen Windows 1252 Zeichen werden falsch interpretiert . die UTF8 BOM Hinzufügen ist wahrscheinlich die beste und schnellste Lösung.

Wenn Sie mit Benutzern stecken auf ältere Zeichnet und Excel ist der einzige Verbraucher Ihrer CSVs, können Sie dieses Problem umgehen, indem UTF16 statt UTF8 exportieren. Excel 2000 und 2003 wird doppelklicken Sie offen diese korrekt. (Einige andere Texteditoren Probleme mit UTF16 haben kann, so dass Sie Ihre Optionen sorgfältig abwägen müssen können.)


* Außer, wenn Sie nicht können, (mindestens) Excel 2011 für Mac Import-Assistenten nicht eigentlich immer mit allen Kodierungen arbeiten, unabhängig davon, was Sie ihm sagen. :)

Andere Tipps

Voranstellen einer BOM (\ uFEFF) für mich (Excel 2007) gearbeitet, dass Excel die Datei als UTF-8 erkannt. Ansonsten ist es und mit den Import-Assistenten Arbeiten zu speichern, ist aber weniger ideal.

Im Folgenden finden Sie den PHP-Code, den ich in meinem Projekt verwenden, wenn Microsoft Excel Benutzer zu senden:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

AKTUALISIERT: Dateiname Verbesserung und Bugfix korrekte Längenberechnung. Dank Trig und @ ivanhoe011

Die Antwort für alle Kombinationen von Excel-Versionen (2003 + 2007) und Dateitypen

Die meisten anderen Antworten hier betreffen ihre Excel-Version und wird zwangsläufig Ihnen nicht helfen, weil ihre Antwort könnte einfach nicht wahr sein für Ihre Version von Excel.

Zum Beispiel Hinzufügen der BOM Zeichen führt Probleme mit automatischer Spaltenseparator Anerkennung, aber nicht mit allen Excel-Version.

Es gibt drei Variablen, die bestimmt, ob es in den meisten Excel-Versionen funktioniert:

  • Codierung
  • BOM Zeichen Anwesenheit
  • Zellseparator

Jemand stoisch an SAP versucht, jede Kombination und das Ergebnis berichtet. Endresultat? Verwenden Sie Utf16LE mit BOM und Tabulatorzeichen als Trennzeichen in den meisten Excel-Versionen zu haben, arbeiten.

Sie glauben mir nicht? Ich würde auch nicht, aber hier lesen und weinen: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

Wählen Sie UTF-8 enconding beim Import. Wenn Sie Office 2007 verwenden, das ist, wo Sie es entschieden: rechts, nachdem Sie die Datei öffnen.

Echo UTF-8 BOM vor CSV-Daten outputing. Dies behebt alle Zeichenprobleme in Windows aber nicht funktioniert für Mac.

echo "\xEF\xBB\xBF";

Es funktioniert für mich, weil ich eine Datei zu erzeugen, muß die auf Windows-PC verwendet werden, nur.

UTF-8 nicht für mich in Office 2007 arbeitet ohne Service Pack, mit oder ohne BOM (U + FFEF oder 0xEF, 0xBB, 0xBF, weder Werke) sp3 Installation macht UTF-8 arbeiten, wenn 0xEF, 0xBB, 0xBF BOM vorangestellt.

UTF-16 funktioniert, wenn in Python kodiert "utf-16-le" mit einem 0xff 0xEF mit BOM vorangestellt, und mit Tab als Trenner. Ich musste manuell die Stückliste schreiben, und verwenden Sie dann „utf-16-le“ eher dann „utf-16“, ansonsten jeweils encode () geschrieben voran die BOM zu jeder Reihe heraus, welche erscheinen als Abfall an der ersten Spalte der zweiten Zeile und nach.

nicht sagen kann, ob UTF-16 ohne sp funktionieren würde installiert, da Ich kann nicht gehen jetzt zurück. seufzen

Das auf Fenster ist, weiß nicht über Office für Mac.

für beide Arbeits Fällen funktioniert der Import, wenn ein Download direkt aus dem Start Browser und der Assistent Textimport nicht intervence, es funktioniert wie Sie es erwarten würden.

Wie Fregal sagte \ uFEFF ist der Weg zu gehen.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

Ich habe auch bemerkt, dass die Frage wurde vor einiger Zeit „antwortet“ aber ich verstehe nicht, die Geschichten, die sagen, dass Sie nicht eine UTF-8-kodierten CSV-Datei erfolgreich in Excel ohne Verwendung der Text-Assistenten öffnen.

Meine reproduzierbare Erfahrung: Typ Old MacDonald had a farm,ÈÌÉÍØ in den Editor, drücken Sie die Eingabetaste, dann auf Speichern unter (unter Verwendung der UTF-8-Option).

Python zu zeigen, was dort eigentlich ist:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

Gut. Editor, um eine Stückliste an der Front gesetzt hat.

Nun gehen Sie in Windows Explorer, doppelklicken Sie auf den Dateinamen oder die rechte Maustaste und verwenden Sie „Öffnen mit ...“, und das erscheint Excel (2003) mit Anzeige, wie erwartet.

Sie können eine HTML-Datei mit der Endung ‚xls‘ speichern und Akzente arbeiten (vor 2007 zumindest).

Beispiel: Speichern Sie diese (mit Speichern unter UTF-8 in Notepad) als test.xls:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

Dies ist nur eine Frage von Zeichenkodierungen. Es sieht aus wie Sie Ihre Daten als UTF-8-Export: é in UTF-8 ist die Zwei-Byte-Sequenz 0xC3 0xA9, die, wenn sie in Windows-1252 ist à © interpretiert. Wenn Sie Ihre Daten in Excel importieren, stellen Sie sicher, es zu sagen, dass die Zeichenkodierung Sie verwenden UTF-8 ist.

Das CSV-Format wird als ASCII implementiert, nicht Unicode, in Excel, so die diakritischen Zeichen Mangeln. Wir erleben das gleiche Problem, das ist, wie ich aufgespürt, dass der offizielle CSV-Standard als ASCII-basierte in Excel definiert wurde.

Schreiben einer Stückliste in der Ausgabe CSV-Datei hat tatsächlich Arbeit für mich in Django:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

Für weitere Informationen http: //crashcoursing.blogspot .com / 2011/05 / Export-csv-mit-special-characters.html Danke Jungs!

Eine andere Lösung, die ich fand, war nur das Ergebnis als Windows-Codepage 1252 (Windows-1252 oder CP1252) zu kodieren. Dies würde geschehen, beispielsweise durch Content-Type in geeigneter Weise zu so etwas wie text/csv; charset=Windows-1252 Einstellung und die Einstellung der Zeichencodierung der Antwort ähnlich streamen.

Beachten Sie, dass das UTF-8 BOM einschließlich ist nicht unbedingt eine gute Idee - Mac-Versionen von Excel ignorieren und die BOM als ASCII tatsächlich anzuzeigen ... drei böse Zeichen zu Beginn des ersten Felds in Ihrer Tabelle ...

überprüfen Sie die Codierung in dem Sie die Datei generieren, um die Datei zu machen Excel korrekt angezeigt werden, müssen Sie den Systemstandardzeichensatz verwenden.

Wich Sprache verwenden Sie? wenn es .Net Sie nur Encoding.Default verwenden müssen, während die Datei zu erzeugen.

Excel 2007 richtig liest UTF-8 mit BOM (EF BB BF) codiert csv.

Excel 2003 (und vielleicht auch früher) liest UTF-16LE mit BOM (FF FE), aber mit Tabulatoren statt Komma oder Semikolon.

kann ich nur bekommen CSV richtig als Tab-separiert Little-Endian UTF-16 in Excel 2007 zu analysieren, mit der richtigen Bytereihenfolgemarkierung beginnen.

Wenn Sie Legacy-Code in vb.net haben wie ich, der folgende Code für mich gearbeitet:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

Ich habe einen Weg zur Lösung des Problems gefunden. Dies ist ein gemeiner Hack, aber es funktioniert: das Dokument öffnen mit Open Office , dann ist es in jedem Excel-Format speichern; die resultierende .xls oder .xlsx werden die akzentuierte Zeichen angezeigt werden.

Mit Ruby-1.8.7 kodieren ich jedes Feld-16 UTF und verwerfen BOM (vielleicht).

Der folgende Code wird aus active_scaffold_export extrahiert:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

Die wichtige Zeile ist:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

Öffnen Sie die Datei csv mit Notepad ++ Klicken auf Encode, wählen konvertieren UTF-8 (konvertieren nicht in UTF-8 (ohne BOM)) sparen geöffnet von Doppel Clic mit Excel Hoffnung, dass Hilfe Christophe GRISON

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top