Squelette d'export CSV: comment insérer un saut de ligne ?

Bonsoir,

J’essaye d’exporter une liste d’objets SPIP au format csv à l’aide du squelette ci-dessous. La boucle fonctionne mais tout se trouve sur une même ligne ce qui fait que l’import dans Excel ne fonctionne pas correctement. Comment fait-on pour insérer un caractère de saut de ligne en SPIP (\n) ?

Sinon, est-ce que ma méthode est la bonne pour exporter du contenu au format csv ? Existe-t-il une méthode pour exporter du contenu directement au format Excel (plugin ?).

Alors, en spip, tout le contenu de la boucle est repris à chaque itération. Si la boucle contient 10 retours à la ligne, chaque passage dedans produira 10 retours à la ligne. Du coup, je suis un peu surpris par ce problème. Le mieux pour comprendre ce qui peut se passer, c’est simplement d’ouvrir le fichier de sortie avec un éditeur texte genre notepad ++ pour voir ce que ça donne concrètement. La, visiblement, le tableur rate un truc à l’import. Il faudrait voir comment il est paramétré ( si il sait bien que les ‹ ; › sont les délimiteurs de champs, si ‹ " › est le délimiteur de chaines et \n le délimiteur de ligne ). Celle ci: un squelette, une boucle et des headers. Pour faire du débug d’ailleurs, il vaut mieux commencer par : #CACHE{0}#HTTP_HEADER{Content-Type: text/plain; charset=#CHARSET} Ca permet de voir ce que l’on fait avant de passer à l’export directement. Il existe bien des plugins pour exporter en CSV, mais le format excel natif est : binaire, propriétaire, complexe. Donc à ma connaissance, il n’existe rien de tel en natif …

est-ce qu’un simple

<BOUCLE_ ma_boucle (OBJET){"
"}>

ne ferait pas l’affaire ?

Bonjour, voila comment je fais :

#HTTP_HEADER{Content-type:text/plain; charset=#CHARSET}

<B_ma_boucle>

« colonne1 »;" colonne1";" colonne1"

<BOUCLE_ ma_boucle (OBJET)>"#CHAMPS1";" #CHAMPS2";" #CHAMPS3"

</BOUCLE_ ma_boucle (OBJET)>

le saut à la ligne est généré automatiquement à l’affichage car la fermeture de la boucle est à la ligne

Le 14/12/2016 à 01:54, Frederic Lohier a écrit :

J’essaye d’exporter une liste d’objets SPIP au format csv à l’aide du
squelette ci-dessous. La boucle fonctionne mais tout se trouve sur une
même ligne ce qui fait que l’import dans Excel ne fonctionne pas
correctement. Comment fait-on pour insérer un caractère de saut de ligne
en SPIP (\n) ?

C'est sûrement lié à l'encodage du fichier du squelette lui même.
Si c'est un fichier Linux, la fin de ligne est en un seul caractère \n alors que pour Windows il faut un \r\n

--
nicod_

Merci de vos réponses. J’ai trouvé la source des problèmes :

  • Je passe par un premier squelette qui vérifie qu’un administrateur est bien connecté et si oui, fait appel à un second squelette qui contient les boucles qui vont construire le tableau CSV : ([(#SESSION{statut}|=={0minirezo}|oui)<INCLURE{fond=inclure/export-csv-admin, env}>]). Je n’avais pas spécifié dans ce premier squelette l’entête http (balises #HTTP_HEADER), dans mon cas : #HTTP_HEADER{Content-Type: text/csv; charset=#CHARSET}#HTTP_HEADER{Content-Disposition: attachment; filename=« tableau-#DATE.csv »}

  • Pour que le fichier csv téléchargé s’ouvre directement dans Excel (en tout cas sur la version 2013) sans avoir à importer manuellement les données (onglet « Données » → « Fichier Texte »), il faut construire le tableau CSV avec des valeurs séparées par des virgules ou des tabulations, et non des points-virgules

  • Malgré un CHARSET de la page en UTF-8 et la base de données également en UTF-8, je suis obligé d’ajouter le filtre utf8_decode sur les champs pour que les accents s’affichent correctement dans Excel, ex : [(#CHAMP|textebrut|utf8_decode)]

  • A toutes fin utiles, il suffit d’appliquer les filtres strtolower (passer toute la chaine en minuscule) puis ucfirst (le premier caractère de la chaine en majuscule) pour formater correctement les noms propres, ex : [(#NOM_PROPRE|strtolower|ucfirst)]

Concernant un export dans le format Excel propriétaire, j’ai repéré la librairie PHPSpreadsheet (anciennement PHPExcel) qui permet de générer proprement des fichiers Excel, Open Office, CSV, etc : https://github.com/PHPOffice/PhpSpreadsheet . Ça pourrait se pluginiser si un jour je deviens assez bon en développement de plugin SPIP :slight_smile: !

-Frédéric

  • Je passe par un premier squelette qui vérifie qu’un administrateur est bien connecté et si oui, fait appel à un second squelette qui contient les boucles qui vont construire le tableau CSV : ([(#SESSION{statut}|=={0minirezo}|oui)<INCLURE{fond=inclure/export-csv-admin, env}>]). Je n’avais pas spécifié dans ce premier squelette l’entête http (balises #HTTP_HEADER), dans mon cas : #HTTP_HEADER{Content-Type: text/csv; charset=#CHARSET}#HTTP_HEADER{Content-Disposition: attachment; filename=« tableau-#DATE.csv »}

Si il y a une inclusion en amont, il doit être envisageable pour se simplifier la vie d’appliquer |utf8_decode sur tout le squelette inclus, et sinon, pour ne pas avoir de traitements sur les champs, il y a également la possibilité d’utiliser #CHAMP**

Merci pour l’idée d’appliquer le filtre utf8_decode sur tout le squelette ! Finalement, j’ai ajouté un #FILTRE{utf8_decode} à la fin du fichier squelette.

-Frédéric