Générer un fichier CSV pour Excel, comment avoir une nouvelle ligne dans une valeur

158

J'ai besoin de 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"

Notez que la valeur multiligne est placée entre guillemets doubles, avec un saut de ligne quotidien normal.

Selon ce que j'ai trouvé sur le Web, cela est censé fonctionner, mais cela ne fonctionne pas, du moins ne gagne pas les fichiers Excel 2007 et UTF8, Excel traite la 3e ligne comme la deuxième ligne de données et non comme la deuxième ligne de la première ligne de données .

Cela doit fonctionner sur les machines de mes clients et je n'ai aucun contrôle sur leur version d'Excel, j'ai donc besoin d'une solution qui fonctionnera avec Excel 2000 et versions ultérieures.

Merci

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

Pas ce que je cherchais mais au moins ça marche (jusqu'à présent)

Nir
la source
1
FYI: Tout cela fonctionne parfaitement dans LibreOffice et l'importation d'un CSV est beaucoup plus facile en premier lieu.
user2061057
9
La réponse acceptée concernant les espaces supplémentaires est incroyablement déroutante maintenant que vous avez modifié vos questions et supprimé les espaces ...
Matti Virkkunen

Réponses:

70

Vous devez avoir des espaces au début des champs UNIQUEMENT là où les espaces font partie des données. Excel ne supprimera pas les espaces de début. Vous obtiendrez des espaces indésirables dans vos en-têtes et vos champs de données. Pire encore, celui "qui devrait «protéger» ce saut de ligne dans la troisième colonne sera ignoré car il ne se trouve pas au début du champ.

Si vous avez des caractères non ASCII (codés en UTF-8) dans le fichier, vous devez avoir une nomenclature 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 vos paramètres régionaux (par exemple cp1252) au lieu de utf-8, et vos caractères non ASCII seront supprimés.

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 Windows, tout fonctionne bien.

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

  1. Vous n'avez que des caractères ASCII dans le fichier (et pas de nomenclature): fonctionne.
  2. Vous avez des caractères non ASCII (encodés en UTF-8) dans le fichier, avec une nomenclature 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 texte Importez not-a-Wizard , malheureusement avec le résultat que vous obtenez le problème de saut de ligne.

Les options comprennent:

  1. Former les utilisateurs à ne pas ouvrir les fichiers depuis Excel :-(
  2. Pensez à écrire un fichier XLS directement ... il existe des packages / bibliothèques disponibles pour le faire dans Python / Perl / PHP / .NET / etc
John Machin
la source
1
Merci, j'ai corrigé le problème des espaces principaux dans la question, j'ai tapé l'exemple CSV manuellement et je n'ai pas copié-collé à partir d'un vrai fichier, le vrai fichier n'inclut pas ces espaces, bonne prise.
Nir
@Nir: Parlons maintenant de votre vrai problème. Cela signifie que vous aviez une nomenclature UTF-8 et que vous avez ouvert le fichier à partir d'Excel et que l'assistant d'importation de texte ne reconnaît pas que votre nouvelle ligne Value3 doit être "protégée" - correct? Ou peut-être que vous n'aviez pas de nomenclature UTF-8 et que vous deviez dire au TIW que vos données étaient encodées en UTF-8 et que cela gênait toujours la nouvelle ligne?
John Machin
Et si je veux utiliser | comme séparateur de champ, nouvelle ligne comme séparateur d'enregistrement, utilisez "pour protéger le contenu des champs de texte, et les champs de texte peuvent contenir |," et nouvelle ligne. Est-ce possible?
Giorgio
1
FYI: J'ai Excel2007 et CSV exportés du système Redmine. Après avoir ajouté la nomenclature UTF-8 (EFBBBF) à son début, Excel a parfaitement ouvert le fichier. Les nouvelles lignes intégrées dans la colonne "description du problème" sont traitées correctement, la structure des lignes n'est pas endommagée et tous les caractères nationaux sont lus correctement (ils ont été supprimés lors de la lecture sans nomenclature UTF8). Excel n'a même pas affiché l'assistant d'importation de texte. Actuellement, ce CSV a maintenant un en- EFBBBFtête, utilise 0Acomme séparateur de ligne et 0D0Acomme nouvelle ligne à l'intérieur des chaînes dans les cellules de texte.
quetzalcoatl
1
Si vous essayez d'obtenir Excel pour OS X pour lire correctement votre CSV, ainsi qu'Excel pour Windows, voici une excellente ressource: stackoverflow.com/questions/4348802/…
Alexandre R. Janini
25

Après de nombreux ajustements, voici une configuration qui fonctionne en générant des fichiers sous Linux, à lire sous Windows + Excel, bien que le format de nouvelle ligne intégré ne soit pas conforme à la norme :

  • Les retours à la ligne dans un champ doivent être \ n (et évidemment entre guillemets)
  • Fin de l'enregistrement: \ r \ n
  • Assurez-vous que vous ne commencez pas un champ avec égal, sinon il sera traité comme une formule et tronqué

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

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
la source
3
Oui que \ r \ n l'a fait. Je peux confirmer que cela fonctionne avec Windows + Excel, OSX + Numbers et Google Docs.
Yorick Sijsling
3
Utiliser \ n (également essayé \ n) dans un champ entouré de ", et utiliser \ r \ n pour diviser les lignes. Je n'ai toujours pas résolu ce problème pour moi dans Excel 2010. J'ai essayé ANSI et UTF8-avec-BOM. Pas de succès
nl-x
1
Mais c'est parce que j'utilise | comme séparateur de champ. Si j'utilise; comme séparateur de champ, le problème persiste lors de l'importation de données CSV, mais le problème disparaît lors de l'ouverture du CSV en double-cliquant dessus dans l'explorateur de fichiers.
nl-x
2
La réponse d'Ian ne fonctionne pas pour moi dans Excel 2003/2010 sous Windows 7. J'ai essayé d'utiliser un éditeur hexadécimal pour modifier mon fichier de nomenclature UTF-8 et j'ai supprimé 0D (\ r) des bits '0D0A' (\ r \ n) pour les retours à la ligne dans les champs. Mais ça ne marche pas.
Dan W
Cette réponse a fonctionné pour moi (sans aucune modification!) En utilisant Excel 2010 et Windows 7; également en utilisant perl v5.14.2 fourni avec cygwin. Mes nouvelles lignes intégrées étaient toutes \n. Merci
ardnew
21

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 peut fonctionner différemment pour différentes versions d'Excel, mais je pense que cela vaut la peine d'essayer.

J'espère que ça aide ;-)

dtldarek
la source
35
@GusDeCooL Le libellé de la première phrase d'OP "J'ai besoin de générer un fichier pour Excel, certaines des valeurs de ce fichier contiennent plusieurs lignes." suggère qu'il n'est peut-être pas nécessaire qu'il s'agisse d'un fichier CSV. En outre, le format Q&A s'applique également à d'autres lecteurs, et cela pourrait être un choix viable pour certains d'entre eux (même si l'OP devait utiliser CSV). Je trouve votre vote défavorable déraisonnable (encore, merci d'avoir expliqué pourquoi).
dtldarek
1
C'était la meilleure option pour moi, en fait; merci de l'avoir suggéré!
Jordan Grey
8

Il est à noter que lorsqu'un fichier .CSV contient des champs entourés de guillemets doubles contenant des sauts de ligne, Excel n'importera pas correctement le fichier .CSV si le fichier .CSV est écrit au format UTF-8. Excel traite le saut de ligne comme s'il s'agissait de CR / LF et commence une nouvelle ligne. La feuille de calcul est tronquée. Cela semble être vrai même si les points-virgules sont utilisés comme délimiteurs de champ (au lieu de virgules).

Le problème peut être résolu en utilisant le Bloc-notes Windows pour modifier le fichier .CSV, en utilisant Fichier> Enregistrer sous ... pour enregistrer le fichier, et avant d'enregistrer le fichier, en modifiant le codage du fichier de UTF-8 à ANSI. Une fois le fichier enregistré au format ANSI, je constate que Microsoft Excel 2013 sous Windows 7 Professionnel importera le fichier correctement.

OneSkyWalker
la source
7

Le retour à la ligne à l'intérieur d'une valeur semble fonctionner si vous utilisez un point-virgule comme séparateur, au lieu d'une virgule ou d'une tabulation, et utilisez 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 à l'aide de la fonction d'importation de données.

Esben
la source
ouais, mais je n'ai pas trouvé d'option pour faire la ligne de fin avec un point-virgule dans Excel
GusDeCooL
Que faire si certaines des données textuelles réelles contiennent des points-virgules? Cela ne marcherait pas.
htm11h
4

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

Cependant, une fois que vous l'avez dans Excel, vous devez vous assurer que le retour à la ligne est activé pour les cellules multilignes ou que la nouvelle ligne apparaîtra sous forme de boîte carrée.

devuxer
la source
3

Cela ne fonctionnera pas si vous essayez d'importer le fichier dans EXCEL.

Associez l'extension de fichier csv à EXCEL.EXE pour pouvoir appeler EXCEL en double-cliquant sur le fichier csv.

Ici, je place un peu de texte suivi du NewLine Char suivi d'un peu plus de texte ET entourant la chaîne entière 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""

Lorsque vous invoquez EXCEL, vous verrez ceci. Vous devrez peut-être dimensionner automatiquement la hauteur pour tout voir. L'endroit où les sauts de ligne dépendront de la largeur de la cellule.

2

DATE

Voici le code en Basic

CHR$(34,"2", 10,"DATE", 34)
Peabody
la source
2

J'ai trouvé ça et ça a marché pour moi

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

Ensuite, où vous devez avoir des choses enfermées

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

Ensuite, lorsque vous avez besoin d'écrire quelque chose - comme du HTML qui inclut le ", vous pouvez le faire

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

Les nouvelles lignes se terminent par . PHP_EOL

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

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

Les fichiers UTF qui contiennent une nomenclature obligeront Excel à traiter les nouvelles lignes littéralement même si ce champ est entouré de guillemets. (Testé Excel 2008 Mac)

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

Stephen
la source
Excel 2016 semble traiter correctement mon fichier CSV même s'il a une nomenclature UTF8. Cependant, ce qui a fait toute la différence, c'est d'utiliser ';' en tant que séparateur de champ (ce que fait Excel pour tous les paramètres régionaux qui ont «,» comme séparateur décimal).
Ale
1

Testez ceci: cela fonctionne parfaitement pour moi: mettez les lignes suivantes dans un xxxx.csvfichier

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

Ouvrez avec Excel.

dans certains cas s'ouvrira directement sinon devra utiliser la conversion de colonne en données. développez la largeur de la colonne et appuyez sur le bouton d'habillage de texte. ou formatez les cellules et activez le texte d'habillage.

et merci pour les autres suggestions, mais elles n'ont pas fonctionné pour moi. Je suis dans un environnement pur Windows, et je ne voulais pas jouer avec unicode ou autre chose amusante.

De cette façon, vous mettez une formule de csv à exceller. Il peut y avoir de nombreuses utilisations pour cette méthode de travail. (notez le = avant les guillemets)

pd: Dans vos suggestions, veuillez mettre quelques exemples des données, pas seulement le code.

Ivan Cev
la source
1

mettre "\ r" à la fin de chaque ligne avait en fait l'effet de sauts de ligne dans Excel, mais dans le .csv, il disparaissait et laissait un désordre affreux où chaque ligne était écrasée contre la suivante sans espace ni saut de ligne

Duncan Wallace
la source
0

La façon dont nous le faisons (nous utilisons VB.Net) est de placer le texte avec de nouvelles lignes dans Chr (34) qui est le caractère représentant les guillemets doubles et de remplacer tous les caractères CR-LF pour LF.

Sébastien
la source
0

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

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

Lorsque j'ouvre le CSV dans MS Excel, cela a bien fonctionné. Si une valeur comporte plusieurs lignes, elle restera dans une seule cellule de la feuille Excel.

Tam Tran
la source
0

Pour l' ouverture de fichier uniquement, la syntaxe est

 ,"one\n
 two",...

L'essentiel est qu'il n'y ait pas d'espace après le premier ",". Normalement, les espaces sont corrects et coupés si la chaîne n'est pas entre guillemets. Mais sinon méchant. Il m'a fallu un certain temps pour comprendre cela.

Il semble que peu importe si la ligne est terminée \ n ou \ c \ n.

Assurez-vous d'agrandir la barre de formule afin que vous puissiez réellement voir le texte dans la cellule (m'a obtenu après une longue journée ...)

Maintenant, bien sûr, File Open ne supportera pas correctement UTF-8 (à moins que l'on utilise des astuces).

Excel> Données> Obtenir des données externes > À partir du texte

Peut être réglé en mode UTF-8 (il est en bas de la liste des polices). Cependant, dans ce cas, les nouvelles lignes ne semblent pas fonctionner et je ne connais aucun moyen de résoudre ce problème.

(On pourrait penser qu'après 30 ans, la sclérose en plaques ferait bien l'affaire.)

Tuntable
la source
0

Dans Excel 365 lors de l'importation du fichier:

Données -> À partir du texte / CSV -> Sélectionnez Fichier> Transformer les données -> Configuration de la source de données -> Sélectionnez la source de données -> Cliquez sur Modifier la source -> Dans la liste déroulante des sauts de ligne, sélectionnez Ignorer les sauts de ligne entre guillemets.

Le texte ci-dessus a été traduit du portugais, le libellé pourrait donc être différent en anglais.

Clodoaldo Neto
la source
-1

vous pouvez faire le suivant "\"Value3 Line1 Value3 Line2\"". Cela fonctionne pour moi générer un fichier csv en java

Fredy Chica
la source
-2

Voici une approche intéressante 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");                  
ddeloy
la source
-3

L'impression d'une nouvelle ligne HTML <br/>dans le contenu et l'ouverture dans Excel fonctionneront bien sur n'importe quel Excel

Shashi
la source
-3

Vous pouvez utiliser le raccourci clavier ALT + Entrée.

  1. Sélectionnez la cellule que vous souhaitez modifier
  2. entrez en mode édition en double-cliquant dessus ou en appuyant sur F2 3.Appuyez sur Alt + entrée. Cela créera une nouvelle ligne dans la cellule
Meghana Chamarthy
la source
Comment intégrez-vous cela dans la génération de fichiers CVS?
jikuja