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;
?>

Aucun tag associé à cet article.

feed rss Vous aimez ce type de contenu?
Alors suivez-ce blog par RSS ou par email!

Continuez la lecture avec les articles suivants



61 commentaires pour “PHP: exporter vers un fichier Excel”

  1. bistouri dit :

    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

  2. Guillaume dit :

    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

  3. David TOUVET dit :

    Bonjour Guillaume,
    Peux-tu m’envoyer ton fichier php que je jette un coup d’oeil? Merci

  4. Obielan dit :

    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 ?

  5. Alexis dit :

    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

  6. David TOUVET dit :

    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]

  7. le debutant de base dit :

    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”;

  8. JB dit :

    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 :)

  9. I Dren dit :

    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 !

  10. christopher dit :

    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 ?

  11. veronique m. dit :

    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];…

  12. veronique m. dit :

    rectification : séparer par des points-virgules pour le fichier csv

  13. manuel dit :

    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

  14. playmo dit :

    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. playmo dit :

    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 ?? ;)

  16. Liko dit :

    > 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 ?

  17. playmo dit :

    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

  18. Fanfoué dit :

    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é

  19. super novice dit :

    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.

  20. Guillaume dit :

    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.

  21. Flo dit :

    Ca RoX !

    Merci

  22. broquere dit :

    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 !

  23. numa1985 dit :

    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

  24. numa1985 dit :

    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. ashorlivs dit :

    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é !!

  26. mimi92 dit :

    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.

  27. Bemainty dit :

    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 … !

  28. Laetitia dit :

    >> 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 !

  29. Flow dit :

    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. Flow dit :

    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 !

  31. jerome dit :

    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………….

  32. Flo dit :

    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;
    ?>

  33. dauzac dit :

    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 ?

  34. David TOUVET dit :

    Salut dauzac,
    personnellement je n’en ai aucune idée mais si quelqu’un trouve une astuce, je suis preneur!
    david

  35. Olivier dit :

    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.

  36. Skualler dit :

    C’est exactement ce qu’il me fallait merci beaucouuuuup
    En plus je suis fier que ce soit un David qui ai fait ça :D
    Sinon pour les deux dernières requêtes que dalle.. ^^”
    Je ne suis qu’un jeune padawan ;)

  37. benoit dit :

    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

  38. Skualler dit :

    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 :(

  39. gasy dit :

    Et comment on redirige la page après?

  40. Arnaud thibaud dit :

    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

  41. yoann dit :

    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

  42. Stifu dit :

    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.

  43. conception site internet dit :

    Je fait les tests nécessaires :)

  44. Xou dit :

    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.

  45. kuslargibi dit :

    // ****************************************************************** *
    // ******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 ” ” ;

  46. GLagaffe83 dit :

    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

  47. Sun Location vacances dit :

    Merci pour ce script :)

  48. Nylo dit :

    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 :)

  49. Michael dit :

    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 ;)

  50. Florent dit :

    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

  51. Florent dit :

    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.

  52. Florent dit :

    C ‘eszt bon je vous remercie pour le script tout fonctionne parfaitement merci encore.

  53. Vincent dit :

    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

  54. Vincent dit :

    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

  55. Guillaume44 dit :

    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!!!

  56. Gary dit :

    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

  57. bull39 dit :

    il suffit d’échapper toutes tes virgules avec des “\”, il existe des fonctions PHP faites spécialement pour ça ;)

  58. kati dit :

    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 .

  59. Monsieur dit :

    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);

  60. jjmm dit :

    Merci pour ce script ca marche nikel :)

  61. DUK dit :

    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

Laisser un commentaire



Tag Cloud