[Résolu] Générer un download de fichier Excel.CSV à la v

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

[Résolu] Générer un download de fichier Excel.CSV à la v

Message par Jacques-64 »

Bonjour,

Avant de jeter l'éponge et de passer par l'écriture d'un fichier temporaire, j'aimerais l'avis de ceux qui sont plus expérimentés que moi en PHP + MYSQL.

Contexte du problème : dans une base de donnée, j'ai des enregistrements de statistiques. Pas de problème pour la requête pour effectuer l'extraction appropriée. Je voudrais maintenant pouvoir donner à l'utilisateur la possibilité de charger les données dans EXCEL (ou OpenOffice) pour manipulation en local. Mon problème est que j'ignore comment générer le download de ce fichier.csv à partir de ma boucle sur mysql_fetch_row lors de l'affichage de la page après appui sur le bouton ad'hoc.

L'un d'entre vous aurait-il un lien expliquant ce genre de manipulation (je n'ai pas trouvé dans manuelPHP).

Merci d'avance,

Jacques

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Dernière modification par Jacques-64 le 10 mars 2009, 21:45, modifié 1 fois.
Zefling
Tyrannosaurus Rex
Messages : 2577
Inscription : 21 déc. 2004, 03:45

Message par Zefling »

Question t'as déjà fais du PHP ? (histoire de voir s'il faut t'écrire tout l'algo)

En java j'avais fait ça :

Code : Tout sélectionner

for (ArrayList<String> ligne: table) {
	String ligneTxt = ""; // création d'un nouvelle ligne
	for (String champ : ligne) {
		// si il trouve des double quotes il les protèges
		if (champ != null && champ.indexOf("\"") != -1) {
			champ = Str.str_replace("\"", "\"\"", champ);
		} else if (champ == null) {
			champ = "";
		}
		// ajoute le champ
		if (!ligneTxt.equals("")) ligneTxt += ";";
		ligneTxt += "\""+champ+"\"";
	}
	// on ajoute la ligne
	CSV += ligneTxt+"\n";
}
Après, il suffit d'adapter.

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Mon blog de dév web ― Thème pour le forum Geckozone ― Le clavier Latin-9 fr sous Windows ― Raccourcis clavier pour Firefox
Debian 8 KDE avec Firefox & Nightly
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

Message par Jacques-64 »

Bonjour et merci,

Pour répondre à la question, j'ai fait "un peu" de PHP mais n'en maitrise pas tous les aspects.
Pour l'instant, mon code qui affiche (en vrac) à partir d'un fichier de test :

Code : Tout sélectionner

      while ($Tableau=mysql_fetch_row($SQLresult) ) {
?>            <table style="text-align: center; width: 90%;" border="1"
 cellpadding="2" cellspacing="2">
  <tbody>

  <?php
  foreach ($Tableau as $index => $cellule)   {
 if ($cellule != ""){
     echo "<tr><td>$nomsItems[$index] :</td><td>";
     echo StripSlashes ($cellule) ;
     echo "</td></tr>";
     }     // Cellule non vide
   } // fin for each cellule
  echo '</tbody></table><br>';
 }  // fin while fetch_row
dans lequel je ne vois pas où insérer le JS (que je maitrise beaucoup moins) pour écrire en local un fichier à ouvrir par le logiciel choisi par l'utilisateur.

A+

Jacques




Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Zefling
Tyrannosaurus Rex
Messages : 2577
Inscription : 21 déc. 2004, 03:45

Message par Zefling »

C'est pas du JS mais du Java.

Déjà c'est pas avec un tableau que tu va faire du CSV.

C'est plus un truc comme ça.

Code : Tout sélectionner

while ($Tableau = mysql_fetch_row($SQLresult) ) {
	$ligne = arrya();
	foreach ($Tableau as $index => $cellule)   {
		if (!empty($cellule){
			$ligne[] = '"'.str_replace('"', '""', $cellule).'"';
		} else {
			$ligne[] = echo '""';
		}
	} 
	echo implode (';', $ligne)."\n";
}
Après il faut ajouter dans le header, en début de programme, que tu veux que ça soit télécharger et non visualiser dans le navigateur.

Code : Tout sélectionner

header("Content-Type: application/force-download; name=\"stats.csv\"");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=\"stats.csv\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)
Mon blog de dév web ― Thème pour le forum Geckozone ― Le clavier Latin-9 fr sous Windows ― Raccourcis clavier pour Firefox
Debian 8 KDE avec Firefox & Nightly
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

Message par Jacques-64 »

Merci,

Pour le tableau, c'était une première étape pour visualiser les résultats sur mon fichier de test. Je pense qu'avec cela je vais pouvoir m'en sortir. Le fait que tout soit en PHP m'arrange.

Je marquerais comme résolu si je m'en sort dans un délai raisonnable, sinon, je reviens exposer mes lacunes.

Adishatz

Jacques

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Zefling a écrit :

Code : Tout sélectionner

header("Content-Type: application/force-download; name="stats.csv"");[/quote]C'est plutôt text/csv pour du CSV. Le "Content-disposition:attachment" suffira à lancer le téléchargement.
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

Message par Jacques-64 »

Merci, bien noté.

A+

Jacques

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Zefling
Tyrannosaurus Rex
Messages : 2577
Inscription : 21 déc. 2004, 03:45

Message par Zefling »

calimo a écrit :
Zefling a écrit :

Code : Tout sélectionner

header("Content-Type: application/force-download; name="stats.csv"");[/quote]C'est plutôt text/csv pour du CSV. Le "Content-disposition:attachment" suffira à lancer le téléchargement.[/quote]

Faut dire j'avais fait ça pour que ça téléchargement n'importe quel type de fichier sans se poser de question. Pour beaucoup, j'avais pas moyen de connaitre le Content-Type. 


[size=75]Message envoyé avec : [color=olive]Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)[/color][/size]
Mon blog de dév web ― Thème pour le forum Geckozone ― Le clavier Latin-9 fr sous Windows ― Raccourcis clavier pour Firefox
Debian 8 KDE avec Firefox & Nightly
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Je me rends compte, attention à ça aussi :
Zefling a écrit :

Code : Tout sélectionner

	echo implode (';', $ligne)."\n";
Le ; dans du CSV passe très bien dans MS Excel en français, attention à d'autres logiciels. OO.o permet de choisir le séparateur, donc c'est bon, mais d'autres ne le supportent pas ; je ne sais pas ce qu'il en est dans excel en anglais.
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

Message par Jacques-64 »

Bonsoir,

A ce niveau là, je maitrise et peux demander au moment de la consruction de la requête quel séparateur (dans une liste pour cause de sécurité).

A+

Jacques

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Zefling
Tyrannosaurus Rex
Messages : 2577
Inscription : 21 déc. 2004, 03:45

Message par Zefling »

calimo a écrit :Je me rends compte, attention à ça aussi :
Zefling a écrit :

Code : Tout sélectionner

	echo implode (';', $ligne)."\n";
Le ; dans du CSV passe très bien dans MS Excel en français, attention à d'autres logiciels. OO.o permet de choisir le séparateur, donc c'est bon, mais d'autres ne le supportent pas ; je ne sais pas ce qu'il en est dans excel en anglais.
:roll: Monsieur chipote. :wink:

C'est un exemple après faut adapter. Moi c'était pour Ms Excel Fr donc j'ai fais ce que qu'on m'avait demandé. :P Après je connais pas les spécifications CSV à la lettre (surtout que je ne m'en sert jamais).

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)
Mon blog de dév web ― Thème pour le forum Geckozone ― Le clavier Latin-9 fr sous Windows ― Raccourcis clavier pour Firefox
Debian 8 KDE avec Firefox & Nightly
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

Message par Jacques-64 »

Bonsoir,

Pour ma part, cette aide m'a été précieuse. J'ai juste eu besoin de rajouter un paramètre

Code : Tout sélectionner

target="blank"
dans le reste de mon code pour que cela fonctionne correctement (chez moi). reste à voir si chez ceux qui vont l'utiliser les paramètres FF et IE seront bons du premier coup :wink:

A+

Jacques

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Zefling a écrit ::roll: Monsieur chipote. :wink:
Il faut bien que quelqu'un le fasse :-P (ayant moi-même eu quelques ennuis liés à ça)
Zefling a écrit :C'est un exemple après faut adapter. Moi c'était pour Ms Excel Fr donc j'ai fais ce que qu'on m'avait demandé. :P Après je connais pas les spécifications CSV à la lettre (surtout que je ne m'en sert jamais).
Il n'y a pas de spécification officielle, juste une info : http://tools.ietf.org/html/rfc4180 Je me rends compte que l'utilisation du point-virgule n'y est même pas mentionnée. Mais comme ce n'est qu'une info... :wink:
Jacques-64 a écrit :Pour ma part, cette aide m'a été précieuse. J'ai juste eu besoin de rajouter un paramètre

Code : Tout sélectionner

target="blank"
dans le reste de mon code pour que cela fonctionne correctement (chez moi).
Bizarre, et assez ennuyeux pour l'utilisateur qui doit ensuite fermer l'onglet, non ?
Zefling
Tyrannosaurus Rex
Messages : 2577
Inscription : 21 déc. 2004, 03:45

Message par Zefling »

calimo a écrit :
Zefling a écrit ::roll: Monsieur chipote. :wink:
Il faut bien que quelqu'un le fasse :-P (ayant moi-même eu quelques ennuis liés à ça)
C'est si compliqué de remplacer le ; du code pour mettre un , à la place ? :wink:

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)
Mon blog de dév web ― Thème pour le forum Geckozone ― Le clavier Latin-9 fr sous Windows ― Raccourcis clavier pour Firefox
Debian 8 KDE avec Firefox & Nightly
Jacques-64
Tyrannosaurus Rex
Messages : 3198
Inscription : 20 juin 2008, 16:58

Message par Jacques-64 »

Bonjour,
calimo a écrit :Bizarre, et assez ennuyeux pour l'utilisateur qui doit ensuite fermer l'onglet, non ?
Pas d'onglet à refermer puisque cela n'ouvre que la boite de dialogue "ouvrir / enregistrer" en laissant la page d'origine.
calimo a écrit :Le ; dans du CSV passe très bien dans MS Excel en français, attention à d'autres logiciels. OO.o permet de choisir le séparateur, donc c'est bon, mais d'autres ne le supportent pas ; je ne sais pas ce qu'il en est dans excel en anglais.
Il suffit d'ajouter une série de "boutons radio" contenant "," ";" et "tabulation" pour donner le choix à l'utilisateur. A partir du moment où on se lance dans la construction de requêtes MySql, c'est assez simple.
Autrement, si on se trompe, Excel ou OOo permettent de répartir la cellule dans celles qui suivent fonction du séparateur. Le problème est plus complexe s'il y a des valeurs numériques avec décimale.

A+

Jacques

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Semrush [Bot] et 5 invités