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

158

Ich muss eine Datei für Excel generieren. Einige der Werte in dieser Datei enthalten mehrere Zeilen.

Da dort auch nicht englischer Text enthalten ist, muss die Datei Unicode sein.

Die Datei, die ich jetzt generiere, sieht folgendermaßen aus: (in UTF8, mit nicht englischem Text gemischt und mit vielen Zeilen)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

Beachten Sie, dass der mehrzeilige Wert in doppelte Anführungszeichen eingeschlossen ist und eine normale alltägliche neue Zeile enthält.

Nach dem, was ich im Web gefunden habe, sollte dies funktionieren, aber es gewinnt nicht, zumindest nicht Excel 2007- und UTF8-Dateien. Excel behandelt die 3. Zeile als zweite Datenzeile und nicht als zweite Zeile der ersten Datenzeile .

Dies muss auf den Computern meiner Kunden ausgeführt werden, und ich habe keine Kontrolle über deren Excel-Version. Daher benötige ich eine Lösung, die mit Excel 2000 und höher funktioniert.

Vielen Dank

BEARBEITEN: Ich habe mein Problem "gelöst", indem ich zwei CSV-Optionen hatte, eine für Excel (Unicode, Tabulator getrennt, keine Zeilenumbrüche in Feldern) und eine für den Rest der Welt (UTF8, Standard-CSV).

Nicht das, wonach ich gesucht habe, aber zumindest funktioniert es (bisher)

Nir
quelle
1
Zu Ihrer Information: Dies alles funktioniert perfekt in LibreOffice und das Importieren einer CSV ist in erster Linie viel einfacher.
user2061057
9
Die akzeptierte Antwort über die zusätzlichen Leerzeichen ist jetzt unglaublich verwirrend, da Sie Ihre Fragen bearbeitet und die Leerzeichen entfernt haben ...
Matti Virkkunen

Antworten:

70

Sie sollten NUR Leerzeichen am Anfang von Feldern haben, in denen die Leerzeichen Teil der Daten sind. Excel entfernt keine führenden Leerzeichen. Sie erhalten unerwünschte Leerzeichen in Ihren Überschriften und Datenfeldern. Schlimmer noch, das ", was diesen Zeilenumbruch in der dritten Spalte "schützen" sollte, wird ignoriert, da es sich nicht am Anfang des Feldes befindet.

Wenn die Datei Nicht-ASCII-Zeichen (in UTF-8 codiert) enthält, sollte hex EF BB BFam Anfang der Datei eine UTF-8-Stückliste (3 Byte ) vorhanden sein. Andernfalls interpretiert Excel die Daten gemäß der Standardcodierung Ihres Gebietsschemas (z. B. cp1252) anstelle von utf-8, und Ihre Nicht-ASCII-Zeichen werden in den Papierkorb verschoben.

Die folgenden Kommentare gelten für Excel 2003, 2007 und 2013; nicht in Excel 2000 getestet

Wenn Sie die Datei durch Doppelklicken auf ihren Namen im Windows Explorer öffnen, funktioniert alles in Ordnung.

Wenn Sie es in Excel öffnen, variieren die Ergebnisse:

  1. Sie haben nur ASCII-Zeichen in der Datei (und keine Stückliste): funktioniert.
  2. Sie haben Nicht-ASCII-Zeichen (in UTF-8 codiert) in der Datei, mit einer UTF-8-Stückliste am Anfang: Sie erkennt, dass Ihre Daten in UTF-8 codiert sind, ignoriert jedoch die CSV-Erweiterung und fügt Sie in den Text ein Importieren Sie keinen Assistenten , leider mit dem Ergebnis, dass Sie das Zeilenumbruchproblem erhalten.

Zu den Optionen gehören:

  1. Trainieren Sie die Benutzer, die Dateien nicht in Excel zu öffnen :-(
  2. Erwägen Sie, eine XLS-Datei direkt zu schreiben. Dafür stehen in Python / Perl / PHP / .NET / etc. Pakete / Bibliotheken zur Verfügung
John Machin
quelle
1
Vielen Dank, ich habe das Problem mit den führenden Leerzeichen in der Frage behoben. Ich habe das CSV-Beispiel manuell eingegeben und nicht aus einer realen Datei kopiert und eingefügt. Die reale Datei enthält diese Leerzeichen nicht.
Nir
@Nir: Jetzt lass uns über dein wirkliches Problem sprechen. Das bedeutet, dass Sie eine UTF-8-Stückliste hatten und die Datei in Excel geöffnet haben und der Textimport-Assistent nicht erkannt hat, dass Ihre Value3-Newline "geschützt" sein sollte - richtig? Oder hatten Sie keine UTF-8-Stückliste und mussten dem TIW mitteilen, dass Ihre Daten UTF-8-codiert waren und die neue Zeile immer noch verpfuscht wurde?
John Machin
Was ist, wenn ich | verwenden möchte? Verwenden Sie als Feldtrennzeichen, neue Zeile als Datensatztrennzeichen "zum Schutz des Inhalts von Textfeldern, und Textfelder enthalten möglicherweise |," und eine neue Zeile. Ist das möglich?
Giorgio
1
Zu Ihrer Information: Ich habe Excel2007 und CSV aus dem Redmine-System exportiert. Nach dem Hinzufügen der UTF-8-Stückliste (EFBBBF) zu Beginn öffnete Excel die Datei perfekt. Neue Zeilen, die in die Spalte "Problembeschreibung" eingebettet sind, werden korrekt verarbeitet, und die Zeilenstruktur wird nicht beschädigt, und alle nationalen Zeichen werden ordnungsgemäß gelesen (sie wurden beim Lesen ohne UTF8-Stückliste in den Papierkorb verschoben). Excel hat noch nicht einmal den Textimport-Assistenten angezeigt. Derzeit verfügt diese CSV über eine EFBBBFKopfzeile, die 0Aals Zeilentrennzeichen und 0D0Aals neue Zeile in Zeichenfolgen in Textzellen verwendet wird.
Quetzalcoatl
1
Wenn Sie versuchen, Excel für OS X dazu zu bringen, Ihre CSV korrekt zu lesen, sowie Excel für Windows, ist hier eine großartige Ressource: stackoverflow.com/questions/4348802/…
Alexandre R. Janini
25

Nach vielen Optimierungen ist hier eine Konfiguration, die beim Generieren von Dateien unter Linux und Lesen unter Windows + Excel funktioniert, obwohl das eingebettete Zeilenumbruchformat nicht dem Standard entspricht :

  • Zeilenumbrüche innerhalb eines Feldes müssen \ n sein (und werden offensichtlich in doppelte Anführungszeichen gesetzt).
  • Ende der Aufzeichnung: \ r \ n
  • Stellen Sie sicher, dass Sie ein Feld nicht mit gleich beginnen, da es sonst als Formel behandelt und abgeschnitten wird

In Perl habe ich Text :: CSV wie folgt verwendet:

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);
Ian
quelle
3
Ja, dass \ r \ n es getan hat. Ich kann bestätigen, dass dies mit Windows + Excel, OSX + Numbers und Google Docs funktioniert.
Yorick Sijsling
3
Verwenden von \ n (auch versucht \ n) in einem mit "eingeschlossenen Feld und Verwenden von \ r \ n zum Teilen von Zeilen. Dieses Problem wurde in Excel 2010 immer noch nicht behoben. Ich habe ANSI und UTF8 mit Stückliste ausprobiert. Kein Erfolg
nl-x
1
Aber das liegt daran, dass ich | benutze als Feldtrennzeichen. Wenn ich benutze; Als Feldtrennzeichen besteht das Problem weiterhin beim Importieren von CSV-Daten. Das Problem verschwindet jedoch beim Öffnen der CSV, indem Sie im Datei-Explorer darauf doppelklicken.
nl-x
2
Ians Antwort funktioniert in Excel 2003/2010 unter Windows 7 nicht. Ich habe versucht, meine UTF-8-Stücklistendatei mit einem Hex-Editor zu bearbeiten, und 0D (\ r) aus den '0D0A'-Bits (\ r \ n) entfernt. für Zeilenumbrüche innerhalb von Feldern. Aber es funktioniert nicht.
Dan W
Diese Antwort funktionierte für mich (ohne Änderungen!) Mit Excel 2010 und Windows 7; auch mit perl v5.14.2, das mit cygwin geliefert wird. Meine eingebetteten Zeilenumbrüche waren alle \n. Danke
ardnew
21

Vor kurzem hatte ich ein ähnliches Problem. Ich habe es durch Importieren einer HTML- Datei gelöst. Das Basisbeispiel wäre wie folgt:

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>

Ich weiß, es ist keine CSV und funktioniert möglicherweise für verschiedene Versionen von Excel unterschiedlich, aber ich denke, es ist einen Versuch wert.

Ich hoffe das hilft ;-)

dtldarek
quelle
35
@GusDeCooL Der Wortlaut des ersten Satzes von OP "Ich muss eine Datei für Excel generieren, einige der Werte in dieser Datei enthalten mehrere Zeilen." schlägt vor, dass es möglicherweise keine CSV-Datei sein muss. Außerdem gilt das Q & A-Format auch für andere Leser, und es könnte für einige von ihnen eine praktikable Wahl sein (selbst wenn das OP CSV verwenden müsste). Ich finde Ihre Ablehnung unangemessen (trotzdem danke, dass Sie erklärt haben, warum).
dtldarek
1
Dies war in der Tat die beste Option für mich; Danke, dass du es vorgeschlagen hast!
Jordan Gray
8

Es ist anzumerken, dass Excel die CSV-Datei nicht ordnungsgemäß importiert, wenn in einer CSV-Datei Felder in doppelte Anführungszeichen gesetzt sind, die Zeilenumbrüche enthalten, wenn die CSV-Datei im UTF-8-Format geschrieben ist. Excel behandelt den Zeilenumbruch wie CR / LF und beginnt eine neue Zeile. Die Tabelle ist verstümmelt. Dies scheint auch dann der Fall zu sein, wenn Semikolons als Feldtrennzeichen (anstelle von Kommas) verwendet werden.

Das Problem kann behoben werden, indem Sie die CSV-Datei mit Windows Notepad bearbeiten, die Datei mit Datei> Speichern unter ... speichern und vor dem Speichern der Datei die Dateicodierung von UTF-8 in ANSI ändern. Sobald die Datei im ANSI-Format gespeichert ist, wird Microsoft Excel 2013 unter Windows 7 Professional die Datei ordnungsgemäß importieren.

OneSkyWalker
quelle
7

Zeilenumbrüche in einem Wert scheinen zu funktionieren, wenn Sie anstelle von Komma oder Tabulator ein Semikolon als Trennzeichen verwenden und Anführungszeichen verwenden.

Dies funktioniert für mich sowohl in Excel 2010 als auch in Excel 2000. Überraschenderweise funktioniert es jedoch nur, wenn Sie die Datei als neue Tabelle öffnen, nicht, wenn Sie sie mithilfe der Datenimportfunktion in eine vorhandene Tabelle importieren.

Esben
quelle
Ja, aber dann habe ich keine Option gefunden, um eine
Endzeile
Was ist, wenn einige der tatsächlichen Textdaten ein Semikolon enthalten? Das würde nicht funktionieren.
htm11h
4

Auf einem PC möchten Sie mit dem ASCII-Zeichen Nr. 10 eine neue Zeile in einen Wert einfügen.

Sobald Sie es in Excel erhalten haben, müssen Sie jedoch sicherstellen, dass der Zeilenumbruch für die mehrzeiligen Zellen aktiviert ist. Andernfalls wird die neue Zeile als quadratisches Feld angezeigt.

Devuxer
quelle
3

Dies funktioniert nicht, wenn Sie versuchen, die Datei in EXCEL zu importieren.

Verknüpfen Sie die Dateierweiterung csv mit EXCEL.EXE, damit Sie EXCEL durch Doppelklicken auf die csv-Datei aufrufen können.

Hier platziere ich Text gefolgt von NewLine Char, gefolgt von etwas mehr Text UND füge die gesamte Zeichenfolge in doppelte Anführungszeichen ein.

Verwenden Sie keine CR, da EXCEL einen Teil der Zeichenfolge in der nächsten Zelle platziert.

""text" + NL + "text""

Wenn Sie EXCEL aufrufen, wird dies angezeigt. Möglicherweise müssen Sie die Höhe automatisch anpassen, um alles zu sehen. Wo die Zeilenumbrüche stattfinden, hängt von der Breite der Zelle ab.

2

DATUM

Hier ist der Code in Basic

CHR$(34,"2", 10,"DATE", 34)
Peabody
quelle
2

Ich habe das gefunden und es hat bei mir funktioniert

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

Dann, wo Sie Sachen haben müssen

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

..... .....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

Wenn Sie dann etwas ausschreiben müssen - wie HTML, das Folgendes enthält: "Sie können dies tun."

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

Neue Zeilen enden mit . PHP_EOL

Am Ende des Skripts wird ein Link ausgedruckt, damit der Benutzer die Datei herunterladen kann.

echo 'Click <a href="myfile.csv">here</a> to download file';
Lisa Simpson
quelle
1

UTF-Dateien, die eine Stückliste enthalten, bewirken, dass Excel neue Zeilen buchstäblich behandelt, selbst wenn dieses Feld in Anführungszeichen gesetzt ist. (Getesteter Excel 2008 Mac)

Die Lösung besteht darin, neue Zeilen nicht als Zeilenvorschub, sondern als Wagenrücklauf (CHR 13) zu verwenden.

Stephen
quelle
Excel 2016 scheint meine CSV-Datei korrekt zu behandeln, auch wenn sie eine UTF8-Stückliste enthält. Was jedoch den Unterschied ausmachte, war die Verwendung von ';' als Feldtrennzeichen (was Excel für alle Gebietsschemas tut, die ',' als Dezimaltrennzeichen haben).
Ale
1

Testen Sie dies: Es funktioniert vollständig für mich: Fügen Sie die folgenden Zeilen in eine xxxx.csvDatei ein

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

Öffnen Sie mit Excel.

In einigen Fällen wird es direkt geöffnet, andernfalls muss die Konvertierung von Spalten in Daten verwendet werden. Erweitern Sie die Spaltenbreite und klicken Sie auf die Schaltfläche Text umbrechen. oder formatieren Sie Zellen und aktivieren Sie den Zeilenumbruch.

und danke für die anderen Vorschläge, aber sie haben bei mir nicht funktioniert. Ich bin in einer reinen Windows-Umgebung und wollte nicht mit Unicode oder anderen lustigen Dingen spielen.

Auf diese Weise setzen Sie eine Formel von csv auf Excel. Es kann viele Verwendungszwecke für diese Arbeitsmethode geben. (Beachten Sie das = vor den Anführungszeichen)

pd: Bitte geben Sie in Ihren Vorschlägen einige Beispiele der Daten an, nicht nur den Code.

Ivan Cev
quelle
1

Das Setzen von "\ r" am Ende jeder Zeile hatte tatsächlich den Effekt von Zeilenumbrüchen in Excel, aber in der CSV verschwand es und hinterließ ein hässliches Durcheinander, bei dem jede Zeile ohne Leerzeichen und ohne Zeilenumbrüche gegen die nächste gequetscht wurde

Duncan Wallace
quelle
0

Die Art und Weise, wie wir dies tun (wir verwenden VB.Net), besteht darin, den Text in Chr (34) mit neuen Zeilen einzuschließen. Dies ist das Zeichen, das die doppelten Anführungszeichen darstellt, und ersetzt alle CR-LF-Zeichen für LF.

Sebastian
quelle
0

Normalerweise lautet eine neue Zeile "\ r \ n". In meiner CSV habe ich "\ r" durch einen leeren Wert ersetzt. Hier ist Code in Javascript:

cellValue = cellValue.replace(/\r/g, "")

Wenn ich die CSV in MS Excel öffne, hat es gut funktioniert. Wenn ein Wert mehrere Zeilen enthält, bleibt er in einer einzelnen Zelle in der Excel-Tabelle.

Tam Tran
quelle
0

Nur für Datei öffnen lautet die Syntax

 ,"one\n
 two",...

Entscheidend ist, dass nach dem ersten "," kein Leerzeichen mehr vorhanden ist . Normalerweise sind Leerzeichen in Ordnung und werden abgeschnitten, wenn die Zeichenfolge nicht in Anführungszeichen steht. Aber sonst böse. Ich habe eine Weile gebraucht, um das herauszufinden.

Es scheint keine Rolle zu spielen, ob die Zeile beendet ist \ n oder \ c \ n.

Stellen Sie sicher, dass Sie die Formelleiste erweitern, damit Sie den Text in der Zelle tatsächlich sehen können (habe mich nach einem langen Tag erwischt ...)

Jetzt wird File Open UTF-8 natürlich nicht richtig unterstützen (es sei denn, man verwendet Tricks).

Excel> Daten> Externe Daten abrufen > Aus Text

Kann in den UTF-8- Modus versetzt werden (ganz unten in der Liste der Schriftarten). In diesem Fall scheinen die neuen Zeilen jedoch nicht zu funktionieren, und ich kenne keine Möglichkeit, dies zu beheben.

(Man könnte sagen, dass MS nach 30 Jahren dieses Zeug richtig machen würde.)

Tuntable
quelle
0

In Excel 365 beim Importieren der Datei:

Daten -> Aus Text / CSV -> Datei auswählen> Daten transformieren -> Datenquellenkonfiguration -> Datenquelle auswählen -> Klicken Sie auf Quelle bearbeiten -> Wählen Sie in der Dropdown-Liste Zeilenumbruch Zeilenumbrüche in Anführungszeichen ignorieren.

Der obige Text wurde aus dem Portugiesischen übersetzt, sodass der Wortlaut im Englischen möglicherweise anders ist.

Clodoaldo Neto
quelle
-1

Sie können den nächsten tun "\"Value3 Line1 Value3 Line2\"". Es funktioniert für mich, eine CSV-Datei in Java zu generieren

Fredy Chica
quelle
-2

Hier ist ein interessanter Ansatz mit JavaScript ...

  String.prototype.csv = String.prototype.split.partial(/,\s*/);  

  var results = ("Mugan, Jin, Fuu").csv();                        

  console.log(results[0]=="Mugan" &&                                   
         results[1]=="Jin" &&                                     
         results[2]=="Fuu",                                       
         "The text values were split properly");                  
ddeloy
quelle
-3

Das Drucken einer HTML-Newline <br/>in den Inhalt und das Öffnen in Excel funktioniert in jedem Excel einwandfrei

Shashi
quelle
-3

Sie können die Tastenkombination ALT + Eingabetaste verwenden.

  1. Wählen Sie die Zelle aus, die Sie bearbeiten möchten
  2. Rufen Sie den Bearbeitungsmodus entweder durch Doppelklicken oder Drücken von F2 auf. 3. Drücken Sie Alt + Eingabetaste. Dadurch wird eine neue Zeile in der Zelle erstellt
Meghana Chamarthy
quelle
Wie integrieren Sie das in die CVS-Dateierzeugung?
Jikuja