Ich entwickle einen Teil einer Anwendung, der für den Export einiger Daten in CSV-Dateien verantwortlich ist. Die Anwendung verwendet immer UTF-8, da es auf allen Ebenen mehrsprachig ist. Das Öffnen solcher CSV-Dateien (z. B. diakritische Zeichen, kyrillische Buchstaben, griechische Buchstaben) in Excel führt jedoch nicht zu den erwarteten Ergebnissen, die etwas wie Г„/Г¤, Г–/Г¶
anzeigen. Und ich weiß nicht, wie man Excel zwingt, zu verstehen, dass die geöffnete CSV-Datei in UTF-8 codiert ist. Ich habe auch versucht, UTF-8 BOM EF BB BF
anzugeben, aber Excel ignoriert dies.
Gibt es eine Problemumgehung?
P.S. Welche Tools verhalten sich möglicherweise wie Excel?
AKTUALISIEREN
Ich muss sagen, dass ich die Community mit der Formulierung der Frage verwechselt habe. Als ich diese Frage stellte, habe ich nach einer Möglichkeit gefragt, eine UTF-8 CSV-Datei in Excel ohne Probleme für einen Benutzer auf flüssige und transparente Weise zu öffnen. Ich habe jedoch eine falsche Formulierung verwendet, um danach zu fragen, automatisch. Das ist sehr verwirrend und kollidiert mit der VBA-Makroautomatisierung. Es gibt zwei Antworten auf diese Fragen, die ich am meisten schätze: die allererste Antwort von Alex https://stackoverflow.com/a/6002338/166589 , und ich habe diese Antwort akzeptiert; und die zweite von Mark https://stackoverflow.com/a/6488070/166589 die etwas später aufgetaucht sind. Aus Sicht der Benutzerfreundlichkeit schien es in Excel anscheinend an einer guten, benutzerfreundlichen UTF-8-CSV-Unterstützung zu mangeln. Daher halte ich beide Antworten für richtig, und ich habe Alexs Antwort zuerst akzeptiert, weil sie das wirklich gesagt hat Excel konnte dies nicht transparent tun. Das habe ich hier mit automatisch verwechselt. Die Antwort von Markus ist eine kompliziertere Methode für fortgeschrittene Benutzer, um das erwartete Ergebnis zu erzielen. Beide Antworten sind großartig, aber Alex 'Antwort passt zu meiner nicht klar spezifizierten Frage etwas besser.
UPDATE 2
Fünf Monate später nach der letzten Bearbeitung habe ich bemerkt, dass Alex 'Antwort aus irgendeinem Grund verschwunden ist. Ich hoffe wirklich, dass es keine technische Frage war und ich hoffe, dass es keine Diskussion mehr gibt, welche Antwort jetzt besser ist. Also akzeptiere ich Marks Antwort als die beste.
Alex ist richtig, aber da Sie in csv exportieren müssen, können Sie den Benutzern beim Öffnen der csv-Dateien diesen Hinweis geben:
Auf diese Weise sollten die Sonderzeichen korrekt angezeigt werden.
Die Markierung für die UTF-8-Byte-Reihenfolge weist Excel 2007+ darauf hin, dass Sie UTF-8 verwenden. (Siehe this SO post ).
Für den Fall, dass jemand die gleichen Probleme hatte wie ich, gibt die UTF8-Codierungsklasse von .NET keinen Byte-Order-Marker in einem Aufruf von GetBytes()
aus. Sie müssen Streams verwenden (oder verwenden Sie eine Problemumgehung ), damit die Stückliste ausgegeben wird.
Der Fehler mit der ignorierten Stückliste scheint für Excel 2013 behoben zu sein. Ich hatte das gleiche Problem mit kyrillischen Buchstaben, aber das Hinzufügen des Stücklistenzeichens \uFEFF
hat geholfen.
Es ist unglaublich, dass es so viele Antworten gibt, aber keine beantwortet die Frage:
"Als ich diese Frage stellte, habe ich nach einem Weg gefragt, wie man eine UTF-8 CSV-Datei in Excel öffnen kann, ohne dass ein Benutzer Probleme hat."
Die Antwort, die als akzeptierte Antwort mit mehr als 200 Up-Votes markiert ist, ist für mich unbrauchbar, da ich meinen Benutzern keine Anleitung zum Konfigurieren von Excel geben möchte.__ Abgesehen davon: Dieses Handbuch gilt nur für eine Excel-Version Andere Excel-Versionen verfügen über unterschiedliche Menüs und Konfigurationsdialogfelder. Sie benötigen für jede Excel-Version ein Handbuch.
Die Frage ist also, wie man mit einem einfachen Doppelklick UTF8-Daten in Excel anzeigen kann?
Zumindest in Excel 2007 ist dies nicht möglich, wenn Sie CSV-Dateien verwenden, da die UTF8-Stückliste ignoriert wird und Sie nur Müll sehen. Dies ist bereits Teil der Frage von Lyubomyr Shaydariv:
"Ich habe auch versucht, UTF-8 BOM EF BB BF anzugeben, aber Excel ignoriert das."
Ich mache die gleiche Erfahrung: Das Schreiben von russischen oder griechischen Daten in eine UTF8-CSV-Datei mit Stückliste führt zu Papierkorb in Excel:
Inhalt der UTF8-CSV-Datei:
Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ
Ergebnis in Excel 2007:
Eine Lösung ist, CSV überhaupt nicht zu verwenden. Dieses Format wird von Microsoft so dumm implementiert, dass es von den Regionseinstellungen in control panel abhängt, wenn comma oder semikolon als Trennzeichen verwendet wird. Die gleiche CSV-Datei wird möglicherweise auf einem Computer ordnungsgemäß geöffnet, auf einem anderen Computer jedoch nicht. "CSV" bedeutet "Comma Getrennte Werte", aber bei einem deutschen Windows muss standardmäßig ein Semikolon als Trennzeichen verwendet werden, während das Komma nicht funktioniert. (Hier sollte SSV = Semikolon-getrennte Werte genannt werden.) CSV-Dateien können nicht zwischen verschiedenen Sprachversionen von Windows ausgetauscht werden. Dies ist ein zusätzliches Problem für das UTF-8-Problem.
Excel existiert seit Jahrzehnten. Es ist eine Schande, dass Microsoft in all den Jahren so grundlegende Dinge wie den CSV-Import nicht implementieren konnte.
Wenn Sie jedoch die gleichen Werte in eine HTML-Datei einfügen und diese Datei als UTF8-Datei mit Stückliste mit der Dateierweiterung XLS speichern, erhalten Sie das korrekte Ergebnis.
Inhalt der UTF8 XLS-Datei:
<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>
Ergebnis in Excel 2007:
Sie können sogar Farben in HTML verwenden, die in Excel korrekt angezeigt werden.
<style>
.Head { background-color:gray; color:white; }
.Red { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>
Ergebnis in Excel 2007:
In diesem Fall hat nur die Tabelle selbst einen schwarzen Rand und Linien. Wenn ALLE Zellen Gitternetzlinien anzeigen sollen, ist dies auch in HTML möglich:
<html xmlns:x="urn:schemas-Microsoft-com:office:Excel">
<head>
<meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>MySuperSheet</x:Name>
<x:WorksheetOptions>
<x:DisplayGridlines/>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
</head>
<body>
<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>
</body>
</html>
Dieser Code erlaubt es sogar, den Namen des Arbeitsblatts anzugeben (hier "MySuperSheet").
Ergebnis in Excel 2007:
Wir haben diese Problemumgehung angewendet:
Hatte die gleichen Probleme mit PHP-generierten CSV-Dateien. Excel hat die Stückliste ignoriert, als das Trennzeichen am Anfang des Inhalts über "sep=,\n"
definiert wurde (aber natürlich nach der Stückliste).
Das Hinzufügen einer Stückliste ("\xEF\xBB\xBF"
) am Anfang des Inhalts und das Setzen des Semikolons als Trennzeichen über fputcsv($fh, $data_array, ";");
führt den Trick aus.
Ich hatte das gleiche Problem in der Vergangenheit (wie man Dateien erzeugt, die Excel lesen kann und andere Tools auch lesen können). Ich habe TSV anstelle von CSV verwendet, aber das gleiche Problem trat bei den Kodierungen auf.
Ich habe keine Möglichkeit gefunden, Excel von UTF-8 automatisch zu erkennen, und ich war nicht willens/in der Lage, den Benutzern der Dateien komplizierte Anweisungen zum Öffnen zu geben. Also habe ich sie als UTF-16le (mit einer Stückliste) anstelle von UTF-8 codiert. Doppelte Größe, aber Excel kann die Kodierung erkennen. Und sie komprimieren gut, daher ist die Größe selten (aber leider nie) von Bedeutung.
Alte Frage, aber zum Glück ist die einfachste Lösung:
Wie ich auf http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-Excel-can.html gepostet habe: /:
Teilen Sie dem zuständigen Software-Entwickler mit, dass er die CSV generieren soll, um sie zu korrigieren. Als schnelle Problemumgehung können Sie gsed verwenden, um die UTF-8-Stückliste am Anfang der Zeichenfolge einzufügen:
gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv
Dieser Befehl fügt die UTF-4-Stückliste ein, falls diese nicht vorhanden ist. Daher ist es ein idempotenter Befehl. Nun sollten Sie die Datei doppelklicken und in Excel öffnen können.
Sie können die CSV-Datei mit BOM über Notepad ++ in UTF-8 konvertieren:
Encoding
→ Convert to UTF-8
.File
→ Save
.Arbeitete in Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64-Bit von Microsoft Office Professional Plus 2013 unter Windows 8.1 mit Gebietsschema für Nicht-Unicode-Programme, die auf "Deutsch (Deutschland)" eingestellt sind.
Dies ist eine alte Frage, die jedoch bei der Suche oben angezeigt wird. Ich habe nach vielen Bemühungen festgestellt, dass das Hinzufügen von BOM-Zeichen am Anfang der CSV-Datei hilfreich ist.
Ich habe es hier kurz erklärt: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-Excel-import---ha
Nur für Benutzer, die daran interessiert sind, die Datei in Excel zu öffnen, die diesen Thread wie ich erreichen.
Ich habe den unten stehenden Assistenten verwendet, und es hat für mich gut funktioniert, eine UTF-8-Datei zu importieren. Nicht transparent, aber nützlich, wenn Sie die Datei bereits haben.
Quelle: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
Einfaches VBA-Makro zum Öffnen von UTF-8-Text- und CSV-Dateien
Sub OpenTextFile()
filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
If filetoopen = Null Or filetoopen = Empty Then Exit Sub
Workbooks.OpenText Filename:=filetoopen, _
Origin:=65001, DataType:=xlDelimited, Comma:=True
End Sub
Origin: = 65001 ist UTF-8 . Komma: True für CSV-Dateien, die in Spalten verteilt sind
Speichern Sie es in Personal.xlsb, damit es immer verfügbar ist . Passen Sie die Excel-Symbolleiste an, fügen Sie eine Makroaufrufschaltfläche hinzu, und öffnen Sie die Dateien von dort aus.
Ja das ist möglich. Wie bereits von mehreren Benutzern festgestellt, scheint es ein Problem zu sein, wenn Excel die korrekte Bytereihenfolge liest, wenn die Datei in UTF-8 codiert ist. Bei UTF-16 scheint es kein Problem zu geben, daher ist UTF-8 endemisch. Die Lösung, die ich dafür verwende, ist das Hinzufügen der Stückliste ZWEIMAL. Dazu führe ich zweimal den folgenden sed-Befehl aus:
sed -I '1s/^/\xef\xbb\xbf/' *.csv
, wobei der Platzhalter durch einen beliebigen Dateinamen ersetzt werden kann. Dies führt jedoch zu einer Mutation von sep = am Anfang der CSV-Datei. Die CSV-Datei wird dann normalerweise in Excel geöffnet, jedoch mit einer zusätzlichen Zeile mit "sep =" in der ersten Zelle. Das "sep =" kann auch in der Quelle .csv selbst entfernt werden. Beim Öffnen der Datei mit VBA sollte jedoch das Trennzeichen angegeben werden:
Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)
Format 6 ist das CSV-Format. Setzen Sie Local auf true, wenn die Datei Datumsangaben enthält. Wenn Local nicht auf true gesetzt ist, werden die Datumsangaben amerikanisiert, was in einigen Fällen das CSV-Format beschädigt.
Dies ist meine Arbeitslösung:
vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001
Der Schlüssel ist Origin: = 65001
Eine wirklich erstaunliche Liste von Antworten, aber da noch eine ziemlich gute Antwort fehlt, werde ich sie hier erwähnen: Öffnen Sie die CSV-Datei mit google sheet und speichern Sie sie als Excel-Datei auf Ihrem lokalen Computer.
Im Gegensatz zu Microsoft hat Google es geschafft, UTF-8-csv-Dateien zu unterstützen, sodass die Datei dort nur geöffnet werden kann. Und der Export ins Excel-Format funktioniert auch einfach. Auch wenn dies nicht die bevorzugte Lösung für alle ist, ist es ziemlich ausfallsicher und die Anzahl der Klicks ist nicht so hoch, wie es klingt, vor allem, wenn Sie sowieso bereits bei Google eingeloggt sind.
Ja, es ist möglich. Wenn Sie den Stream schreiben, der die CSV erstellt, müssen Sie zunächst Folgendes tun:
myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
Dies ist nicht genau auf die Frage ausgerichtet, aber da ich darüber gestolpert bin und die oben genannten Lösungen für mich nicht funktionierten oder Anforderungen hatten, die ich nicht erfüllen konnte, können Sie die Stückliste hinzufügen, wenn Sie auf vim zugreifen:
vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
hallo, ich benutze Ruby on Rails für die Generierung von csv. In unserer Anwendung planen wir, sich für die Mehrsprachigkeit (I18n) zu entscheiden, und wir hatten ein Problem, während I18n-Inhalte in der CSV-Datei von Windows Excel angezeigt wurden.
War gut mit Linux (Ubuntu) und Mac.
Wir haben festgestellt, dass Windows Excel die Daten erneut importieren muss, um die tatsächlichen Daten anzuzeigen. Während des Imports erhalten Sie mehr Optionen zur Auswahl des Zeichensatzes.
Dies kann jedoch nicht für jeden Benutzer erlernt werden. Die von uns gesuchte Lösung ist das Öffnen per Doppelklick.
Dann haben wir die Art und Weise der Darstellung von Daten im offenen Modus und in Windows Excel mit Hilfe von aghuddleston Gist identifiziert. Bei Referenz hinzugefügt.
Beispiel I18n Inhalt
In Mac und Linux
Schwedisch: Förnamn Englisch: Vorname
In Windows
Schwedisch: Förnamn Englisch: Vorname
def user_information_report(report_file_path, user_id)
user = User.find(user_id)
I18n.locale = user.current_lang
open_mode = "w+:UTF-16LE:UTF-8"
bom = "\xEF\xBB\xBF"
body user, open_mode, bom
end
def headers
headers = [
"ID", "SDN ID",
I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_Zip'),
I18n.t('sys_phone_number')
]
end
def body tenant, open_mode, bom
File.open(report_file_path, open_mode) do |f|
csv_file = CSV.generate(col_sep: "\t") do |csv|
csv << headers
tenant.patients.find_each(batch_size: 10) do |patient|
csv << [
patient.id, patient.patientid,
patient.first_name, patient.last_name, "#{patient.dob}",
"#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
"#{patient.city}", "#{patient.state}", "#{patient.Zip}",
"#{patient.phone_number}"
]
end
end
f.write bom
f.write(csv_file)
end
end
Wichtige Dinge, die hier zu beachten sind, sind offener Modus und bom
open_mode = "w +: UTF-16LE: UTF-8"
bom = "\ xEF\xBB\xBF"
Vor dem Schreiben der CSV-Einfügungsstückliste
f.write bom
f.write (csv_file)
Windows und Mac
Die Datei kann direkt mit einem Doppelklick geöffnet werden.
Linux (Ubuntu)
Beim Öffnen einer Datei fragen Sie nach den Trennzeichen -> wählen Sie "TAB"
Ich habe alles versucht, was ich in diesem Thread finden konnte und ähnlich, nichts hat voll funktioniert. Das Importieren in Google Sheets und das einfache Herunterladen als CSV-Datei funktionierte jedoch wie ein Zauber. Probieren Sie es aus, wenn Sie zu meinem Frustpunkt kommen.
Dies ist eine alte Frage, aber ich hatte gerade ein ähnliches Problem und die Lösung könnte anderen helfen:
Hatte dasselbe Problem, wenn CSV-Textdaten in eine Datei geschrieben wurden, dann wurde beim Öffnen der CSV-Datei in Excel der gesamte Text in eine einzige Spalte verschoben. Nachdem ich die obigen Antworten gelesen hatte, versuchte ich Folgendes, was das Problem zu lösen scheint.
Wenden Sie eine UTF-8-Kodierung an, wenn Sie Ihren StreamWriter erstellen. Das ist es.
Beispiel:
using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
/* ... do stuff .... */
output.Close();
}
Ich hatte vor ein paar Tagen das gleiche Problem und konnte keine Lösung finden, da ich die Funktion import from csv
nicht verwenden kann, da alles als Zeichenfolge formatiert werden kann.
Meine Lösung war, zuerst die Datei mit Notpad ++ und change the encode to ASCII
zu öffnen. Dann einfach die Datei in Excel öffnen und es hat wie erwartet funktioniert.
Wenn Sie es vollautomatisch machen möchten, einen Klick ausführen oder automatisch von einer Webseite in Excel laden möchten, aber keine richtigen Excel-Dateien erstellen können, würde ich als Alternative das SYLK-Format empfehlen. OK, es ist nicht so einfach wie CSV, aber es ist textbasiert und sehr einfach zu implementieren und unterstützt UTF-8 ohne Probleme.
Ich habe eine Klasse PHP geschrieben, die die Daten empfängt und eine SYLK-Datei ausgibt, die durch Klicken auf die Datei direkt in Excel geöffnet wird (oder Excel automatisch startet, wenn Sie die Datei mit dem richtigen Mime-Typ auf eine Webseite schreiben.) Sie können sogar Formatierungen hinzufügen (wie Fettdruck, Zahlen auf bestimmte Weise formatieren usw.) und die Spaltengröße ändern oder Spalten mit automatischer Größe für den Text in den Spalten festlegen. Insgesamt ist der Code wahrscheinlich nicht mehr als etwa 100 Zeilen.
Es ist kein Problem, SYLK zurück zu entwickeln, indem Sie eine einfache Tabelle erstellen und als SYLK speichern und dann mit einem Texteditor lesen. Der erste Block besteht aus Kopfzeilen und Standardnummernformaten, die Sie erkennen werden (die Sie gerade in jeder erstellten Datei wiederherstellen), dann sind die Daten einfach eine X/Y-Koordinate und ein Wert.
Ich generiere csv-Dateien aus einer einfachen C # -Anwendung und hatte das gleiche Problem. Meine Lösung bestand darin, sicherzustellen, dass die Datei mit der UTF8-Kodierung geschrieben wird.
// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
SaveCSV(writer);
}
Ich hatte ursprünglich den folgenden Code, mit dem Akzente in Notepad ++ gut aussehen, aber in Excel verstümmelt wurden:
using (StreamWriter writer = new StreamWriter(path))
{
SaveCSV(writer);
}
Ihre Laufleistung kann variieren - ich verwende .NET 4 und Excel von Office 365.