PHP: exporter vers un fichier Excel
Voici un code PHP utilisé pour exporter des données d’une base de données MySQL vers un fichier Excel (.csv ou .xls):
<?
//ce fichier montre un exemple permettant de generer un fichier excel (on peut remplacer le .csv par .xls)
//parametres de connexion a la bdd
include("config.php");
//Premiere ligne = nom des champs (si on en a besoin)
//$csv_output = "p_nom,p_email";
//$csv_output .= "\n";
//Requete SQL
$query = "SELECT ...
FROM ...
WHERE ...
";
$result = mysql_query($query)
or die('Erreur SQL !<br />' . $query . '<br />' . mysql_error());
//Boucle sur les resultats
while($row = mysql_fetch_array($result)) {
$csv_output .= "$row[p_nom] $row[p_prenom],$row[p_nom],$row[p_prenom],$row[p_email]\n";
}
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=AddressBook_" . date("Ymd").".csv");
print $csv_output;
exit;
?>
Vous aimez ce type de contenu?
Alors suivez-ce blog par RSS ou par email!
23 November 2005 à 11:31
Parfait pour finaliser un calcul de paye
A approfondir dès que j’aurais terminé d’explorer la création de fichiers PDF avec Apache .
merci
15 December 2005 à 23:19
Chez moi, ça ne fonctionne pas…
Voici l’erreur :
Notice: Undefined variable: csv_output in c:\program files\easyphp1-8\www\pop\export.php on line 19
Warning: Cannot modify header information - headers already sent by (output started at c:\program files\easyphp1-8\www\pop\export.php:19) in c:\program files\easyphp1-8\www\pop\export.php on line 22
Warning: Cannot modify header information - headers already sent by (output started at c:\program files\easyphp1-8\www\pop\export.php:19) in c:\program files\easyphp1-8\www\pop\export.php on line 23
16 December 2005 à 7:16
Bonjour Guillaume,
Peux-tu m’envoyer ton fichier php que je jette un coup d’oeil? Merci
4 January 2006 à 10:18
Pareil…
Warning: Cannot add header information - headers already sent by (output started at d:\easyphp\www\cpam\qualite.php:7) in d:\easyphp\www\cpam\qualite.php on line 809
Warning: Cannot add header information - headers already sent by (output started at d:\easyphp\www\cpam\qualite.php:7) in d:\easyphp\www\cpam\qualite.php on line 810
une explication possible ?
6 January 2006 à 15:39
Salut moi j’ai essayé le code mais avec .xls a la place de .csv et tout fonctionne cependant je cherche a créer un fichier excel tu saurai comment faire? et à l’organiser correctement
7 January 2006 à 11:14
Pour Alexis: non, à part ce code, je n’ai pas poussée plus loin. Pour les autres, les warning proviennent sans doute de l’erreur classique “headers already sent by”. Vous trouverez une explication en lisant: “Cannot add header information - headers already sent by (output started at [script1]) in [script2] on line [line]“
4 February 2006 à 17:52
reponse a guillaume ton erreur vient de là !!!!
tu ne definie pas ta variable $csv_output au depart donc il ne peut pas la completer. retire les // dans les expressons ci dessous et la ca va marcher
//Premiere ligne = nom des champs (si on en a besoin)
//$csv_output = “p_nom,p_email”;
//$csv_output .= “\n”;
13 February 2006 à 21:27
Salut David,
Ton script fonctionne chez moi mais cependant il me met toutes les données à la suite dans la même case.
Une idée ?
Merci
8 March 2006 à 15:07
Pour tout ceux qui ont des souci dans la création de fichiers .xls, il existe un site web :www.pear.php.net qui permet d’installer notament le module SpreadsheetExcelWriter.
Vous aurez comme résultat (en suivant un peu la doc) une ou des belle(s) feuille(s) Excel !
16 March 2006 à 18:55
Bonjour !
Le code marche parfaitemen chez moi. Seul regret l’export dans excel met toutes les données que je lui ai indiqué de prendre dans la même cellule.. Aurais-tu une astuce ?
20 March 2006 à 11:42
brrrravo parfait !
pour ce qui est de tout dans une même cellule : remplacer , par ;
virgule par point-virgule
merci encore
–> $row[blabla];$row[bloublou];…
20 March 2006 à 11:53
rectification : séparer par des points-virgules pour le fichier csv
14 April 2006 à 21:04
Bonsoir,
Alors là je dis un grand merci à David pour ce script !!! celà fait des semaines que je cherche sur les forums où personne ne me réponds ou bien je trouve des scripts inbuvable de complexité!!!
Et là un script d’une clarté et d’une simplicité digne d’éloge et montrant le talent de l’auteur.
Merci à véronique pour les ; Celà a marhé du premier coup;celà ouvre une fenêtre qui me demande si je veux enregistrer ou lire le fichier csv..le top!!!!
je te remercie de tout coeur de partager ton savoir David
Cordialement votre
Manuel
10 May 2006 à 14:28
coooooooooooooooool ça marche du tonerre !!!!!!!!!!!!!
J’ai un peu galéré au début, je voulais absoluement mettre du HTML dedans alors que ça sert à rien
Enfin bref, NICKEL.
merci bien…
15 May 2006 à 14:00
Euh…
J’espere qu’il y en a qui veront ce message…
Je voudrais pouvoir spécifier le programme à exécuter. C’est-à-dire par exemple que je voudrais mettre dans le code à je ne sais quel endroit (c:\Program Files\Microsoft Office\Excel\…)
Mais je ne sais ni comment faire, ni si c’est possible.
A votre avis ??
24 May 2006 à 3:48
> Playmo :
Pour des raisons de sécurité le fait de pointer d’une page web à un fichier local au travers d’un naviguateur est tout simplement impossible enfin tout du moins le lancement de cette application. Par defaut les naviguateur sont “préréglés” pour réagir de telle ou telle manière selon les fichiers qu’ils doivent ouvrir. Alors evidement c’est discutable et modifiable, mais au mieux tu proposeras un téléchargement de l’exe mais pas de lancement.
En plus si c’est pour toi perso pourquoi pas mais si c’est pour mettre en ligne tu fais comment pour être certain que le chemin de l’appli est le bon ?
29 May 2006 à 17:23
Ba en fait le code marche sur mon PC en local (easyphp1.8)
Mais dès que je met le code sur le serveur (Windows Serveur 2003 Standard)
lorsque je clic sur exporter, au lieu d’avoir la fenetre de telechargement, j’ai une page blanche et je ne sais pas d’ou vient le probleme
31 May 2006 à 14:08
Bravo pour le script.
Mais comme je ne suis pas un cador, je ne parviens pas à ouvrir excel en appelant ce script.
S’agit-il du navigateur qui bloque l’ouverture du logiciel?
Merci d’avance
Fanfoué
1 June 2006 à 8:46
SUPER !!! merci David,
Je suis débutant et trouver un script aussi simple à mettre en oeuvre est vraiment génial.
Bonne journée à tous et bonne continuation.
13 June 2006 à 11:31
Bonjour,
merci pour cette fonction d’export très efficace ! c’est exactement ce que je recherchais !
J’ai néanmoins une question !
Est-il possible que une fois dans excel au lieu d’avoir les champs en ligne on puisse les avoirs en colonnes ?
Merci d’avance.
18 June 2006 à 13:01
Ca RoX !
Merci
19 June 2006 à 15:38
Bjr,
J’ai fait un export CSV qui marche au top ! mais j’aimerais que tout soit sur une seule et même ligne. Pour l’instant j’ai une ligne avec les champs nom, prénom … et d’autres champs décalés aux lignes suivantes. HELP !
20 June 2006 à 14:41
Voila, c’est ce que je cherchais, mais j’ai un “léger” souci.
Ma feuille générée contient le code source de ma page et en aucun cas le résultat de ma requete.
Mon code:
//Requete SQL
//Premiere ligne = nom des champs (si on en a besoin)
$csv_output = “id,description,kilometres,total_kilometre,d_vidange”;
$csv_output .= “\n”;
$query = “SELECT * from vehicles”;
$result = mysql_query($query)
or die(’Erreur SQL !’ . $query . ” . mysql_error());
//Boucle sur les resultats
while($row = mysql_fetch_array($result)) {
$csv_output .= “$row[vehicle_id],$row[description],$row[d_kilometres],$row[km_total],$row[d_vidange]\n”;
}
header(”Content-type: application/vnd.ms-excel”);
header(”Content-disposition: attachment; filename=AddressBook_” . date(”Ymd”).”.csv”);
print $csv_output;
exit;
Merci
20 June 2006 à 14:42
Et pour info, met ton overflow des commentaires à “hidden” dans ton CSS.
Ca évitera que ca dépasse comme dans le cas précédent.
25 July 2006 à 12:14
Heu numa1985 tu as bien écrit “” après le code donné par David ? Ca a l’air con, mais visiblement ton source n’est tout simplement pas interprété !!
11 August 2006 à 13:01
Bonjour,
Merci pour le code, cependant j’ai un problème d’accent lorsque j’essaye d’ouvrir le fichier csv avec Excel (avec bloc note les accents s’affichent correctement) pourtant j’ai essayé de mettre:
header(”Content-type: application/vnd.ms-excel; charset=utf-8\n”);
header(”Content-Encoding:utf-8″);
Mais le problème persiste toujours.
Est-ce que quelq’un pourra m’aider???
Merci d’avance.
11 August 2006 à 17:02
Bonjour,
Vraiment super le code.
J’ai remplacé le . (point) en ; (point virgule) mais j’ai du traiter le Excel avant d’avoir un bon excel que mes assitants traitent. Mais ça va !
Merci encore David et les autres … !
22 August 2006 à 12:57
>> mimi92
Je pense que c’est dû à l’encodage des caractères, le bloc note lui enregistre en UTF8 et le web généralement en ASCII donc il faut que tu appliques une fonction d’encodage ou de décodage php (utf8_encode($csv_output) ou encore utf8_decode(Ton $csv_output) ).
Code très court et très utile merci !
22 August 2006 à 14:54
Merci David pour ce script très simple à mettre en oeuvre.
Cependant j’ai l’impression que ce script marchant sur ma version Office 2003 ne fonctionne pas sur les versions antérieures (d’aprés ce que ma dit un collégue) n’ayant pas de version excel antérieur avez vous eu le même probléme ?
30 August 2006 à 15:06
Bonjour à tous, comme vous pouvez le voir j’ai eu un petit probléme de compatibilité entre les multiples versions d’excel et ce script, j’ai trouvé la solution en replaçant les ; par des \t pour les sauts de colonnes.
EX: $csv_output = “id\tdescription\tkilometres\ttotal_kilometre\td_vidange”;
Ceci en utilisant l’extention .xls, et sa marche impec !
20 September 2006 à 11:43
Merci pour ce script.
Désolé si cela a deja été dit.
Pour l’enregistrement en xls il faut ajouter un \t pour aller ans la cellule suivante.
nom\tprenom\t………….
27 September 2006 à 11:38
Bonjour j’ai un souci avec le script … il va bien chercher les infos en table mais affiche seulement une ligne … j’ai essayé plein de chose et rien ne fonctionne … voici le code
‘ .$query.”.mysql_error());
//Boucle sur les resultats
while($row = mysql_fetch_array ($result))
{
$csv_output = “$row[date]\t$row[name]\t$row[email]\t$row[addy1]\t$row[addy2]“;
}
header(”Content-type: application/x-msexcel”);
header(”Content-disposition: attachment; filename=contact_” . date(”Ymd”).”.xls”);
print $csv_output;
exit;
?>
10 January 2007 à 7:49
Bonjour David,
Top génial ! Exactement ce que je cherchais. Après adaptation du script ça marche nickel pour moi ! Merci encore …
Une question malgré tout : pour simplifier l’exploitation de la feuille EXCEL, je cherche à améliorer la présentation / mise en forme. Comment par exemple :
- préformater l’orientation de la page (portait / paysage),
- préformater la taille des colonnes, leur tabulation, leur couleur,
- idem pour les lignes,
- préformater la police, sa taille,
- gérer les bordures,
- etc …
Y-a-t’il un site (je pense qu’il n’y a pas de tuto
de référence pour détailler tout ça ?
10 January 2007 à 15:43
Salut dauzac,
personnellement je n’en ai aucune idée mais si quelqu’un trouve une astuce, je suis preneur!
david
19 February 2007 à 2:40
Bonjour,
Solution simple et efficace, toutefois et après avoir passer qq heures à lire ce qui tourne autour de l’encodage etc… mes fichiers csv ne comportent toujours pas d’accent ( remplacés par des gliphes bizares) , j’explique:
Que ce soit des charactères ( intitulé des colones codé “en dur ” dans le php) ou des résultats de la requète mysql, le csv ne prends pas en compte les accents…
une piste de réflexion?
d’avance merci.
21 February 2007 à 11:14
C’est exactement ce qu’il me fallait merci beaucouuuuup

En plus je suis fier que ce soit un David qui ai fait ça
Sinon pour les deux dernières requêtes que dalle.. ^^”
Je ne suis qu’un jeune padawan
27 March 2007 à 13:53
Bonjour et merci pour ton script David.
Chez moi cela fonctionne à 50% on va dire. C’est à dire que le script va bien chercher les infos en table mais affiche tout seulement sur une ligne.
Je n’arrive pas à créer mon .cvs ou .xls. Voici mon code et le résultat à l’écran:
//parametres de connexion a la bdd
mysql_select_db($database_test, $test);
//Premiere ligne = nom des champs (si on en a besoin)
$csv_output = “Qté\t Articles\t Description\t Motif”;
$csv_output .= “\n\t”;
//Requete SQL
$query= sprintf(”SELECT * FROM demarque_article WHERE id_demarque = %s ORDER BY id_demarque_article ASC”, $colname_ARTICLEALL);
$result = mysql_query($query, $test) or die(mysql_error());
//Boucle sur les resultats
while($row = mysql_fetch_array($result))
{
$csv_output .=”$row[qte_demarque_article]\t $row[code_demarque_article]\t $row[description_demarque_article]\t $row[motif_demarque_article]\t \n”;
}
header(”Content-type: application/vnd.ms-excel”);
header(”Content-disposition: attachment; filename=FeuilleDeDemarque_”.date(”Ymd”).”.xls”);
print $csv_output;
exit;
=> le résultat à l’écran:
Qté Articles Description Motif 2 22 deux et pas trois Annimations 3 33 comme la Ville Games Day 4 444 quatre Peinture Démo 1 111 white dwarf Games Day 5 5 5555 Games Day
Voila , un petit coup de pouce pour un jeune padawan
Merci
27 March 2007 à 14:53
essaie:
$csv_output.=$row["qte_demarque_article"].”\t”.$row["code_demarque_article"].”\t”.$row["description_demarque_article"].”\t “.$row["motif_demarque_article"].”\t\n”;
Sinon je vois pas
7 May 2007 à 14:00
Et comment on redirige la page après?
18 May 2007 à 15:54
Déjà david bien joué, super script !
j’écris ce commentaire pour faire gagner du temps aux autres, j’avais le probléme des headers et en fait c’est en faisant copier-coller dans golive que ce put**n de logiciel m’a rajouté un caractére parasite devant mon
22 May 2007 à 11:15
franchement merci pr ce script ! il est tt se quil ya de plu simple alors que sur d’autre forums c’est des truc bien compliqués et souvent très mal expliqué ! je serai heureux de taider, mm de vous aider si jamais un jour vous avez un probleme
merci en tt cas
8 June 2007 à 15:01
Merci pour le code… Par contre pour moi, pour séparer les champs, ni les virgules ni les points virgules ne marchaient… Alors j’ai essayé \t un peu au pif, et ça marche nickel.
12 June 2007 à 14:09
Je fait les tests nécessaires
8 August 2007 à 17:42
Bonjour à toutes et tous,
voyant que vous maitriser le sujet, j’aurais une question pour vous : Lorsque j’exporte mes données vers Excel, le format de celles ci n’est pas respecté.
A savoir, mes identifiants se presentent sous forme d’exposant, mes chaines commencant par 0 le perdent, les dates sont modifiées, …
J’ai essayer de concaténer la valeur avec un ‘ comme l’on fait en excel : le ‘ devient persistant : avant ma valeur 030 s’affichée 30; maintenant elle s’affiche ‘030
Quelqu’un a t il une idée miracle pour résoudre ce problème svp ?
Merci à vous tous.
30 August 2007 à 0:27
// ****************************************************************** *
// ******Lire un csv et l’importer dans la base de donnée *
// ******2 fichiers nécessaires : formulaire.php et ajouter.php *
// *********l’un pour choisir le fichier csv et l’autre pour *
// ***************enregistrer dans la bdd *
**** le fichier csv doit etre du type ci dessous *
*** link,email *
*** http://www.mafonction.com,axel@tueslemeilleur.com *
*** http://www.csvfacile.com,csv@insert.com *
///************************************************************ *********
//formulaire.php
________________________________________________
//ajouter.php
//lire un csv et ajouter le couple email,url dans la base de donnee
if (isset($_FILES['file'])) {
$file = $_FILES['file']['tmp_name'];
$handle = fopen($file,’r');
$row = 1;
$handle = fopen(”$file”, “r”);
while (($data = fgetcsv($handle, 4096, “,”)) !== FALSE) {
$num = count($data);
//echo ” $num fields in line $row: \n”;
$row++;
for ($c=0; $c insertion with Succesfully
//” ;
//si des adresses ont ete enregistrer
if ($numberdownload>0){
echo ” You have downloaded $numberdownload combinaisons “;
echo “The list Id is : $rowIdListNext “;
}
///si aucune adresse a ete enregistrer
if ($existadresse==0 && $numberdownload==0)
{
echo ” Error .. Your Csv file has a problem.”;
echo ” Please notice that your csv file has a header”;
}
//si les adresses existe deja
if ($existadresse>0 )
{
echo ” $existadresse combinaisons already exist! “;
}
//renvoie à la page qui a valider le formulaire…c’est à dire vers formulaire.php
$departure=$_SERVER['HTTP_REFERER'];//recover the adress which the user come from
echo ” ” ;
25 January 2008 à 20:14
Bonsoir,
Super ce script, j’en cherchais un depuis longtemps dans les couloirs du web…
J’ai un petit souci : Je remplace csv par xls, je remplace les virgules par des points virgules, mais quand j’ouvre mon fichier xls avec openoffice, ce n’est pas le tableur qui s’ouvre mais le traitement de texte…
Y a-t-il une explication ? Je n’ai pas pu vérifier sur le véritable Excel (qui dépasse mes finances…)
Merci pour le script en tout cas
14 May 2008 à 14:16
Merci pour ce script
19 May 2008 à 11:27
Woot,
“<?php” ça marche mieux, j’ai cherché pendant un p’tit quart d’heure après un copier/coller de cochon :p
Quoiqu’il en soit merci pour ce script
27 May 2008 à 14:16
Hello à tous, et merci pour ce script sympathique.
Pour ceux qui ont le problème du genre “une seule ligne de données dans le tableau”, c’est probablement dû à ça:
- soit votre $csv_output = “blabla;blabla;blabla”; est dans la boucle while
- soit votre $csv_output .= “\n”; n’y est justement pas
Vérifiez
30 May 2008 à 11:29
salut,
Tout d’abord merci pour le script, cependant j’ai besoin d’un leger coup de pouce.
Mes données s’affichent bien dans ma pages, mais aucun fichiers n’est créer.
D’où ma question, comment fonctionnent les headers et si on pouvais me les expliquer sa serait sympathique car je supose que mon erreur vient de là.
merci d’avance
Florent
30 May 2008 à 11:48
j’ai fais mes recherches en attendant vos réponses d’après ce que j’ai compris le premier header envoie les données vers un fichier csv et le second header sert un donner un nom au fichier csv.
Je ne comprend pas d’où vient mon erreur.
2 June 2008 à 9:11
C ‘eszt bon je vous remercie pour le script tout fonctionne parfaitement merci encore.
18 June 2008 à 10:46
Bonjour Florent,
J’ai le même soucis que tu as eu, le texte s’affiche mais ne génère pas de fichier. Comment as-tu résolu ce problème stp ?
Merci de votre aide
Ce script a l’air super mais je ne m’en sort pas
++
Vincent
18 June 2008 à 11:04
Réponse : afficher la page en directe ne fonctionne pas, il faut la consulter a partir d’un lien d’une autre page. Et là ca fonctionne :p
19 June 2008 à 13:54
Bonjour et…. BRAVO BIEN SUR!!!! Enfin quelque chose de clair qui fonctionne!!! Merci beaucoup!
Juste un petit souci, lorsque je mets ce code dans ma page php, dans mon fichier excel, avant les valeurs du tableau j’ai tout mon code!!
Quelqu’un sait comment faire pour pas qu’il apparraisse dans le fichier csv?
Merci d’avance!!!
31 July 2008 à 11:58
bonjour je suis entrain de developer un intranet en ce moment pour mon travail et je dois exporter un base de donnee en csv ou xls. tout fonctionne, l’export se fait mais le seul soucis que jai c’est que des quil y a une virgule dans ma base elle change de case dans la feuille excel. y’a til un moyen pour changer cela?
ceci devient tres urgent pour moi de trouver une solution a ce problem pouvez vous maider svp…
merci davance
7 August 2008 à 14:21
il suffit d’échapper toutes tes virgules avec des “\”, il existe des fonctions PHP faites spécialement pour ça
16 August 2008 à 9:55
slt,
bah merci pour ton code c vraiment génial.mais le probleme chez moi c’est que sur mon fichier excel tout est affiché,c à dire le code html que j utilise pour la décoration de la page.cà c’est d’une part d’autre part le code se bloque qand je commnace la page avec session_start() sachant que g besoin de ça pour utilser une variable d’une autre page dans la requett sql.
merci de me répondre .
8 October 2008 à 15:50
Salut
Sympa de mettre ton script, perso ça fais un moment que je joue avec mysql et excel et plus simplement j’ouvre un fichier que j’apelle .xls pis je fais des fwrite
$chaine = ” \t”.$num_facture.”\t”.$Societe.”\t”.$MontantHT.”\t”.$MontantTTC.”\t \n”;
$file = “tableau_excel.xls”;
$fp = fopen($file, “w+”);
foreach ($tab_excel as $id=>$val)
{
fwrite($fp,$val);
}
fclose($fp);
27 October 2008 à 22:50
Merci pour ce script ca marche nikel
20 November 2008 à 9:37
Bonjour,
J’ai besoin de faire une export de ma base en csv ou xls. Je suis débutant en PHP. J’écris le code sur notepad puis je test ma page avec le serveur apache (en local). Aucun fichier ne se telecharge. J ‘arrive pas a recuperer le fichier . CSV.
Voici mon code:
Merci pour votre aide