168 votes

Générer un fichier CSV pour Excel, comment avoir un saut de ligne dans 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, 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é et beaucoup de lignes)

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

Notez que la valeur sur plusieurs lignes est entourée de guillemets doubles, avec une nouvelle ligne normale.

D'après ce que j'ai trouvé sur le web, cela devrait fonctionner, mais ce n'est pas le cas, du moins pas avec Excel 2007 et les fichiers UTF8, Excel traite la troisième ligne comme la deuxième ligne de données et non comme la deuxième ligne de la première ligne de données.

Ce programme doit être exécuté 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 fonctionne avec Excel 2000 et les versions ultérieures.

Merci

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

Ce n'est pas ce que je cherchais, mais au moins cela fonctionne (pour l'instant).

1 votes

FYI : Tout cela fonctionne parfaitement dans LibreOffice et l'importation d'un CSV est beaucoup plus facile en premier lieu.

10 votes

La réponse acceptée concernant les espaces supplémentaires est incroyablement confuse maintenant que vous avez modifié vos questions et supprimé les espaces...

72voto

John Machin Points 39706

Vous devez avoir des caractères d'espacement au début des champs UNIQUEMENT lorsque les caractères d'espacement font partie des données. Excel ne supprime pas les espaces en début de champ. Vous obtiendrez des espaces indésirables dans vos en-têtes et vos champs de données. Pire encore, les " qui devrait "protéger" que le saut de ligne dans la troisième colonne sera ignoré parce qu'il n'est pas au début du champ.

Si le fichier contient des caractères non ASCII (codés en UTF-8), vous devez avoir une BOM UTF-8 (3 octets, hex EF BB BF ) au début du fichier. Sinon, Excel interprétera les données selon l'encodage par défaut de votre locale (par exemple cp1252) au lieu de utf-8, et vos caractères non-ASCII seront mis à la poubelle.

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 à partir d'Excel, les résultats varient :

  1. Vous n'avez que des caractères ASCII dans le fichier (et pas de BOM) : fonctionne.
  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 fait tomber dans le fichier L'importation de texte n'est pas un jeu d'enfant malheureusement, le résultat est un problème de saut de ligne.

Les options comprennent :

  1. Formez les utilisateurs à ne pas ouvrir les fichiers à partir d'Excel :-(
  2. Envisagez d'écrire un fichier XLS directement ... il existe des paquets/librairies pour le faire en Python/Perl/PHP/.NET/etc.

1 votes

Merci, j'ai corrigé le problème des espaces dans la question, j'ai tapé l'exemple CSV manuellement et n'ai pas fait de copier-coller à partir d'un fichier réel, le fichier réel n'inclut pas ces espaces, bonne prise.

0 votes

@Nir : Parlons maintenant de votre vrai problème. Cela signifie que vous aviez une nomenclature UTF-8, que vous avez ouvert le fichier depuis Excel et que l'assistant d'importation de texte n'a pas reconnu que la nouvelle ligne de la valeur 3 devait être "protégée", n'est-ce pas ? Ou peut-être que vous n'aviez pas de nomenclature UTF-8 et que vous avez dû indiquer à l'assistant d'importation de texte que vos données étaient codées en UTF-8 et qu'il a quand même oublié la nouvelle ligne ?

0 votes

Que faire si je veux utiliser | comme séparateur de champ, une nouvelle ligne comme séparateur d'enregistrement, utiliser " pour protéger le contenu des champs de texte, et que les champs de texte peuvent contenir |, " et une nouvelle ligne. Cela est-il possible ?

31voto

Ian Points 71

Après de nombreux ajustements, voici une configuration qui fonctionne en générant des fichiers sous Linux et en les lisant sous Windows+Excel, bien que le format des nouvelles lignes intégrées ne soit pas conforme à la norme. la norme :

  • Les retours à la ligne dans un champ doivent être \n (et évidemment entre guillemets)
  • Fin de l'enregistrement : \r\n
  • Veillez à ne pas commencer un champ par des égalités, 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);

4 votes

Oui que \r\n l'a fait. Je peux confirmer que cela fonctionne avec Windows+Excel, OSX+Numbers et Google Docs.

3 votes

Utilisation de \n (a également essayé \n ) dans un champ entouré de " , et en utilisant \r\n pour diviser les rangées. Cela n'a toujours pas résolu ce problème pour moi dans Excel 2010. J'ai essayé ANSI et UTF8-with-BOM. Sans succès

1 votes

Mais c'est parce que j'utilise | comme séparateur de champs. Si j'utilise ; comme séparateur de champ, le problème existe toujours lors de l'importation de données CSV, mais le problème disparaît lorsque l'on ouvre le CSV en double-cliquant dessus dans l'explorateur de fichiers.

21voto

dtldarek Points 206

Récemment j'ai eu un problème similaire, je l'ai résolu en important une HTML l'exemple de base serait le suivant :

<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 que ce n'est pas un CSV et que cela peut fonctionner différemment selon les versions d'Excel, mais je pense que cela vaut la peine d'essayer.

J'espère que cela vous aidera ;-)

35 votes

@GusDeCooL La formulation de la première phrase du PO "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 que ce soit un fichier CSV. En outre, le format Q&A s'applique également à d'autres lecteurs, et il pourrait être un choix viable pour certains d'entre eux (même si le PO devait utiliser CSV). Je trouve votre downvote déraisonnable (tout de même, merci d'avoir expliqué pourquoi).

1 votes

C'était la meilleure option pour moi, en fait ; merci de l'avoir suggérée !

7voto

Esben Points 29

Le saut de ligne à l'intérieur d'une valeur semble fonctionner si vous utilisez le point-virgule comme séparateur, au lieu de la virgule ou de la tabulation, et si vous utilisez des guillemets.

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

0 votes

Oui, mais je n'ai pas trouvé d'option pour terminer la ligne avec un point-virgule dans Excel.

1 votes

Que se passe-t-il si certaines des données textuelles actuelles contiennent des points-virgules ? Cela ne fonctionnerait pas.

4voto

Rudolf Rein Points 77

À prendre en considération :

$string.'\n'; o $string.'\r\n'; ne fonctionnera pas

$string."\n"; o $string."\r\n"; fonctionnera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X