Générer un fichier CSV pour Excel, Comment avoir une nouvelle ligne à l'intérieur d'une valeur

je dois générer un fichier pour Excel, certaines des valeurs de ce fichier contiennent plusieurs lignes.

il y a aussi du texte non-anglais là-dedans, donc le fichier doit être Unicode.

le fichier que je génère maintenant ressemble à ceci: (en UTF8, avec du texte non anglais mélangé dans et avec beaucoup de lignes)

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

Note la valeur multi-ligne est incluse entre guillemets, avec une nouvelle ligne ordinaire.

selon ce que j'ai trouvé sur le web cela devait fonctionner, mais il ne fonctionne pas, au moins pas gagner Excel 2007 et fichiers UTF8, Excel traite la troisième ligne comme la deuxième ligne de données pas comme la deuxième ligne de la première ligne de données.

cela doit fonctionner sur les machines de mon client et je n'ai aucun contrôle sur leur version D'Excel, donc j'ai besoin d'une solution qui fonctionnera avec Excel 2000 et plus tard.

Merci

EDIT: j'ai "résolu" mon problème en ayant deux options CSV, une pour Excel (Unicode, tab séparé, aucune nouvelle ligne dans les champs) et une pour le reste du monde (UTF8, CSV standard).

non Pas ce que je cherchais, mais au moins ça marche (pour l'instant)

139
demandé sur Nir 2009-08-07 00:28:54

17 réponses

vous devez avoir des caractères d'espace au début des champs seulement lorsque les caractères d'espace font partie des données. Excel ne supprimera pas les espaces principaux. Vous obtiendrez des espaces indésirables dans vos rubriques et vos champs de données. Pire, le " qui devrait être" protéger " cette rupture de ligne dans la troisième colonne sera ignoré parce qu'il n'est pas au début du champ.

si vous avez des caractères non-ASCII (encodés en UTF-8) dans le fichier, vous devriez avoir un BOM UTF-8 (3 octets, hex EF BB BF ) au début du fichier. Sinon Excel interprétera les données selon le codage par défaut de votre locale (par exemple cp1252) au lieu de utf-8, et vos caractères non-ASCII seront détruits.

les commentaires suivants S'appliquent à Excel 2003, 2007 et 2013; non testé sur Excel 2000

si vous ouvrez le fichier en double-cliquant sur son nom dans L'Explorateur de Windows, Tout fonctionne bien.

si vous l'ouvrez depuis Excel, les résultats varient:

  1. Vous avez uniquement des caractères ASCII dans le fichier (et sans BOM): œuvres.
  2. vous avez des caractères non-ASCII (encodés en UTF-8) dans le fichier, avec un BOM UTF-8 au début: il reconnaît que vos données sont encodées en UTF-8 mais il ignore l'extension csv et vous dépose dans le importation de texte non-a-Wizard , malheureusement avec le résultat que vous avez le problème de rupture de ligne.

Options comprennent:

  1. former les utilisateurs à ne pas ouvrir les fichiers à partir de L'intérieur D'Excel: - (
  2. envisagez d'écrire un fichier XLS directement ... il y a des paquets/bibliothèques disponibles pour faire cela dans Python/Perl/PHP/.NET/etc
61
répondu John Machin 2015-01-24 16:43:45

après beaucoup de retouches, voici une configuration qui fonctionne en générant des fichiers sur Linux, en lisant sur Windows + Excel

  • les nouvelles lignes dans un champ doivent être \n (et évidemment citées en double guillemets)
  • fin de l'enregistrement: \r\n
  • assurez-vous que vous ne commencez pas un champ avec des égaux, sinon il est traité comme une formule et tronqué

En Perl, j'ai utilisé Text::CSV pour ce faire, comme

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);
22
répondu Ian 2012-03-15 00:11:11

récemment j'ai eu un problème similaire, Je l'ai résolu en important un fichier HTML , l'exemple de base serait comme ceci:

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

je sais, ce n'est pas un CSV, et pourrait fonctionner différemment pour différentes versions D'Excel, mais je pense que cela vaut la peine d'essayer.

j'espère que cette aide ;-)

13
répondu dtldarek 2013-06-06 22:05:36

Il est intéressant de noter que lorsqu'un .Fichier CSV a des champs enveloppés dans des guillemets doubles qui contiennent des sauts de ligne, Excel ne sera pas importer le .CSV fichier correctement si le .Le fichier CSV est écrit au format UTF-8. Excel traite le saut de ligne comme S'il s'agissait D'un CR/LF et commence une nouvelle ligne. La feuille de calcul est déformé. Cela semble vrai même si les semi-colons sont utilisés comme délimiteurs de champ (au lieu des virgules).

le problème peut être résolu en utilisant le bloc-notes de Windows pour éditer le .CSV fichier, en utilisant le Fichier > Enregistrer sous... pour sauvegarder le fichier, et avant de sauvegarder le fichier, changer le codage du fichier de UTF-8 à ANSI. Une fois le fichier sauvegardé au format ANSI, je constate que Microsoft Excel 2013 tournant sous Windows 7 Professional importera le fichier correctement.

8
répondu OneSkyWalker 2015-04-28 21:40:50

Saut de ligne à l'intérieur d'une valeur semble fonctionner si vous utilisez le point-virgule comme séparateur, au lieu d'une virgule ou un onglet, et utiliser des guillemets.

cela fonctionne pour moi dans Excel 2010 et Excel 2000. Cependant, étonnamment, cela ne fonctionne que lorsque vous ouvrez le fichier en tant que nouvelle feuille de calcul, pas lorsque vous l'importez dans une feuille de calcul existante en utilisant la fonctionnalité d'importation de données.

5
répondu Esben 2011-09-22 09:49:40

sur un PC, le caractère ASCII #10 est ce que vous voulez placer une nouvelle ligne dans une valeur.

une fois que vous l'obtenez dans Excel, cependant, vous devez vous assurer que Word wrap est allumé pour les cellules multi-ligne ou la nouvelle ligne apparaîtra comme une boîte carrée.

3
répondu devuxer 2009-08-06 21:57:01

cela ne fonctionnera pas si vous essayez D'importer le fichier dans EXCEL.

associe l'extension de fichier csv avec EXCEL.EXE ainsi vous serez en mesure d'invoquer EXCEL en double-cliquant sur le fichier csv.

ici, je place du texte suivi de la ligne de caractères suivie de plus de texte et j'enferme toute la chaîne de caractères avec des guillemets doubles.

N'utilisez pas de CR car EXCEL placera une partie de la chaîne dans la cellule suivante.

""text" + NL + "text""

quand vous invoquez EXCEL, vous le verrez. Vous devrez peut-être faire la taille automatique de la hauteur pour tout voir. Où les sauts de ligne dépendra de la largeur de la cellule.

2

DATE

voici le code de base

CHR$(34,"2", 10,"DATE", 34)
3
répondu Peabody 2013-09-15 20:39:53

fichiers UTF qui contiennent un BOM fera Excel pour traiter les nouvelles lignes littéralement même dans ce champ est entouré de guillemets. (Testé Excel 2008 Mac)

la solution est de faire de toute nouvelle ligne un retour de chariot (CHR 13) plutôt qu'un retour de ligne.

1
répondu Stephen 2011-12-09 08:02:14

tester ce: Il marche pour moi: Mettez les lignes suivantes dans un xxxx.csv fichier

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

ouvert avec excel.

dans certains cas s'ouvrira directement sinon devra utiliser la conversion de colonne aux données. élargir la largeur de la colonne et de frapper l'écharpe bouton texte. ou formater des cellules et activer le texte enveloppant.

et merci pour les autres suggestions, mais elles n'ont pas fonctionné pour moi. Je suis dans un environnement pur de fenêtres, et n'ai pas vous voulez jouer avec unicode ou autre chose drôle.

de cette façon, vous mettez une formule de csv pour exceller. Il peut être de nombreuses utilisations de cette méthode de travail. (noter le = avant les guillemets)

pd: dans vos suggestions s'il vous plaît mettre quelques échantillons des données non seulement le code.

1
répondu Ivan Cev 2016-12-09 13:01:05

mettre "\r" à la fin de chaque ligne fait a eu pour effet de les sauts de ligne dans excel, mais dans l' .csv il a disparu et a laissé un vilain désordre où chaque rangée a été écrasée contre la suivante sans espace et sans rupture de ligne

1
répondu Duncan Wallace 2017-02-04 08:42:24

La façon dont nous le faisons (nous utilisons VB.Net) est de joindre le texte avec de nouvelles lignes dans les Chr(34) qui est le char qui représente le double des devis et de les remplacer tous les CR-LF caractères de la FL.

0
répondu Sebastian 2009-10-06 14:03:55

j'ai trouvé ceci et cela a fonctionné pour moi

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

Puis où vous avez besoin d'avoir des choses incluses

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

puis quand vous avez besoin d'écrire quelque chose comme HTML qui inclut le "vous pouvez faire ceci

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

les nouvelles lignes se terminent par . PHP_EOL

La fin du script affiche un lien afin que l'utilisateur peut télécharger le fichier.

echo 'Click <a href="myfile.csv">here</a> to download file';
0
répondu Lisa Simpson 2011-07-22 21:06:06

Normalement, une nouvelle ligne est "\r\n". Dans mon CSV, j'ai remplacé "\r " par "empty value". Voici le code en Javascript:

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

quand j'ouvre le CSV dans MS Excel, ça a bien marché. Si une valeur a plusieurs lignes, elle restera dans une seule cellule de la feuille Excel.

0
répondu Tam Tran 2015-05-14 05:48:09

vous pouvez faire la ligne suivante "\"Valeur3 ligne 1 Value3 Line2\"". Il fonctionne pour moi la génération d'un fichier csv en java

-1
répondu Fredy Chica 2013-12-06 14:01:02

vous pouvez utiliser le raccourci clavier ALT+Enter.

  1. Sélectionnez la cellule que vous souhaitez modifier
  2. entrer en mode édition soit en double cliquant dessus, soit en appuyant sur F2 3.Appuyez sur Alt+entrée. Cela créera une nouvelle ligne dans la cellule
-1
répondu Meghana Chamarthy 2018-02-07 11:24:10

Voici une approche intéressante en utilisant 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");                  
-2
répondu ddeloy 2013-06-02 08:45:46

L'impression D'une nouvelle ligne HTML <br/> dans le contenu et l'ouverture dans excel fonctionnera très bien sur tout excel

-3
répondu Shashi 2013-10-25 12:18:08