Page 1 sur 2
[Résolu] Générer un download de fichier Excel.CSV à la v
Publié : 09 mars 2009, 11:27
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
Publié : 09 mars 2009, 11:34
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
Publié : 09 mars 2009, 11:49
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
Publié : 09 mars 2009, 12:11
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)
Publié : 09 mars 2009, 12:54
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
Publié : 09 mars 2009, 13:59
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.
Publié : 09 mars 2009, 14:01
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
Publié : 09 mars 2009, 15:04
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]
Publié : 10 mars 2009, 13:07
par calimo
Je me rends compte, attention à ça aussi :
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.
Publié : 10 mars 2009, 19:14
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
Publié : 10 mars 2009, 20:40
par Zefling
calimo a écrit :Je me rends compte, attention à ça aussi :
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.

Monsieur chipote.
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é.

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)
Publié : 10 mars 2009, 21:45
par Jacques-64
Bonsoir,
Pour ma part, cette aide m'a été précieuse. J'ai juste eu besoin de rajouter un paramètre
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
A+
Jacques
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2
Publié : 11 mars 2009, 09:32
par calimo
Zefling a écrit :
Monsieur chipote.
Il faut bien que quelqu'un le fasse

(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é.

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...
Jacques-64 a écrit :Pour ma part, cette aide m'a été précieuse. J'ai juste eu besoin de rajouter un paramètre
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 ?
Publié : 11 mars 2009, 10:11
par Zefling
calimo a écrit :Zefling a écrit :
Monsieur chipote.
Il faut bien que quelqu'un le fasse

(ayant moi-même eu quelques ennuis liés à ça)
C'est si compliqué de remplacer le ; du code pour mettre un , à la place ?
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)
Publié : 11 mars 2009, 10:36
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