web-dev-qa-db-fra.com

Générer un fichier CSV pour Excel, comment avoir une nouvelle 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 avec beaucoup de lignes)

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

Notez que la valeur multiligne est placée entre guillemets, avec une nouvelle ligne normale au quotidien.

D'après ce que j'ai trouvé sur le Web, cela est censé fonctionner, mais cela ne fonctionne pas. Du moins ne gagne-t-il pas les fichiers Excel 2007 et UTF8, Excel considère la 3è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 .

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 compatible avec Excel 2000 et les versions ultérieures.

Merci

EDIT: J'ai "résolu" mon problème en disposant de deux options CSV, une pour Excel (Unicode, séparées par des tabulations, aucun saut de 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)

146
Nir

Vous devez avoir des espaces au début des champs UNIQUEMENT où les espaces font partie des données. Excel ne supprimera pas les espaces de début. Vous obtiendrez des espaces non désirés dans vos en-têtes et champs de données. Pire encore, le " qui devrait "protéger" cette coupure de ligne dans la troisième colonne sera ignoré car ce 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 devez avoir une nomenclature UTF-8 (3 octets, hex EF BB BF) au début du fichier. Sinon, Excel interprétera les données en fonction du codage par défaut de votre environnement local (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 correctement.

Si vous l'ouvrez à partir d'Excel, les résultats varient:

  1. Vous ne disposez que de ASCII caractères 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 laisse tomber dans le fichier Importation de texte not-a-Wizard , malheureusement avec pour résultat que vous obtenez le problème de saut de ligne.

Les options comprennent:

  1. Entraînez les utilisateurs à ne pas ouvrir les fichiers depuis Excel :-(
  2. Pensez à écrire directement un fichier XLS ... il existe des packages/bibliothèques disponibles à cet effet dans Python/Perl/PHP/.NET/etc
65
John Machin

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

  • Les nouvelles lignes dans un champ doivent être\n (et évidemment entre guillemets)
  • Fin de l'enregistrement:\r\n
  • Assurez-vous de ne pas démarrer un champ avec des égaux, sinon il sera traité comme une formule et tronqué.

En Perl, j'ai utilisé Text :: CSV pour faire ceci 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);
23
Ian

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 que ce n'est pas un fichier CSV et qu'il pourrait 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 ;-)

19
dtldarek

Il est à noter que lorsqu'un fichier .CSV comporte des champs entourés de guillemets doubles contenant des sauts de ligne, Excel n'importera pas le fichier .CSV correctement 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 de sauvegarder le fichier, en modifiant l'encodage du fichier de UTF-8 à ANSI. Une fois le fichier enregistré au format ANSI, j’aperçois que Microsoft Excel 2013 exécuté sous Windows 7 Professional l’importera correctement.

8
OneSkyWalker

La nouvelle ligne dans une valeur semble fonctionner si vous utilisez le point-virgule comme séparateur, au lieu de virgule ou de tabulation, et que vous 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, et non lorsque vous l'importez dans une feuille de calcul existante à l'aide de la fonctionnalité d'importation de données.

6
Esben

Sur un PC, ASCII caractère # 10 correspond à ce que vous souhaitez placer une nouvelle ligne dans une valeur.

Cependant, une fois que vous avez accédé à Excel, vous devez vous assurer que le retour à la ligne est activé pour les cellules multilignes, sinon la nouvelle ligne apparaîtra sous la forme d'une zone carrée.

4
devuxer

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 texte suivi du caractère NewLine suivi d'un texte supplémentaire ET entourant la chaîne entière de 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 appelez Excel, vous verrez ceci. Vous devrez peut-être redimensionner automatiquement la hauteur pour tout voir. L'emplacement des sauts de ligne dépend de la largeur de la cellule.

2

DATE

Voici le code en Basic

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

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

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

Ensuite, où vous devez avoir des trucs inclus

$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 le HTML qui inclut "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';
2
Lisa Simpson

Testez ceci: Cela fonctionne parfaitement pour moi: Mettez les lignes suivantes dans un fichier xxxx.csv

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

Ouvrir avec Excel.

dans certains cas, ouvrira directement sinon il faudra utiliser la conversion de colonne en données. Développez la largeur de la colonne et cliquez sur le bouton de retour à la ligne. ou formatez les cellules et activez le texte renvoyé.

et merci pour les autres suggestions, mais elles n’ont pas fonctionné pour moi. Je suis dans une pure fenêtre env, et je ne voulais pas jouer avec Unicode ou autre chose amusante.

De cette façon, vous mettez une formule de CSV à Excel. 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 de données, pas seulement le code.

1
Ivan Cev

Les fichiers UTF contenant une nomenclature obligent Excel à traiter les nouvelles lignes de manière littérale, même si ce champ est entouré de guillemets. (Testé Excel 2008 Mac)

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

1
Stephen

mettre "\ r" à la fin de chaque ligne a effectivement eu l'effet de sauts de ligne dans Excel, mais dans le fichier .csv, il a disparu et a laissé un vilain fouillis où chaque ligne a été écrasée contre la suivante, sans espace ni sauts de ligne.

1
Duncan Wallace

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

0
Sebastian

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'ai ouvert le fichier CSV sous MS Excel, cela a bien fonctionné. Si une valeur a plusieurs lignes, elle restera dans une seule cellule de la feuille Excel.

0
Tam Tran

Pour Fichier Ouvrir uniquement, la syntaxe est la suivante:

 ,"one\n
 two",...

La chose critique est qu'il y a 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.

Cela ne semble pas avoir d’importance si la ligne est terminée\n ou\c\n.

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

Maintenant bien sûr, File Open ne supportera pas correctement UTF-8 (à moins que vous utilisiez des astuces).

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

Peut être réglé en mode TF-8 (il s’agit d’une façon très basse dans la liste des polices). Cependant, dans ce cas, les nouvelles lignes ne semblent pas fonctionner et je ne sais pas comment résoudre ce problème.

(On pourrait penser qu’après 30 ans, MS obtiendrait les résultats escomptés.)

0
Tuntable