picture picture
juin 17, 2015 Excel, MySQL, PHP 7 Commentaires

Exporter une table MySQL au format CSV (Excel)

PHP calculsPHP est un langage d’extraction et d’affichage, mais sa puissance de calcul est limitée. Qui n’a pas été confronté un jour ou l’autre à ses erreurs ses memory_limit, upload_max_filesize ou autres blocage du temps de connexion d’un script ?

Il est possible de « bidouiller » le serveur pour tenter de rallonger tout cela, mais c’est tout de même limité et handicapant lorsque certains exports de grosses bases des données nécessitent des calculs croisés complexes. L’autre solution consiste à exporter les tables, puis à les retravailler avec les tableaux croisés dynamiques de Excel ou Access, par exemple, dont c’est la vocation.

Mode d’emploi pour un export PHP propre, d’une table MySQL vers un ficher Excel (csv en l’occurrence) …

NOTA BENE : une version plus récente de cet article existe ici : https://www.webtolosa.com/2018/01/11/exporter-une-table-mysql-au-format-csv-sans-message-derreur/

L’export comporte 2 pages :

  1. la page sur laquelle est le lien d’appel du fichier excel (export.php)
  2. la page de traitement de l’export de la table (mysql2csv.php)

Page export.php

La première étape consiste à créer un lien cliquable vers le fichier Excel. Ce lien pointe vers la page PHP qui va extraire les données, et doit transmettre le nom de la table que vous souhaitez exporter (ici en GET, on peut aussi le faire en POST avec une balise hidden) . Par exemple :

<p><a href="mysql2csv.php?nom_table=<?php echo 'ma_table1'; ?>">Cliquez ici pour exporter la table 1</a></p>
									

export MyQL 2 CSV

Page mysql2csv.php

ce second fichier va extraire en boucle les lignes de votre table et les formater pour être lus par Excel :

<?php
// connexion à la base des données : 
include("connect_base.inc.php");

// on indique au navigateur qu'on va exporter un CSV
header('Content-Type: text/csv');
header('Content-Disposition: attachment;filename='.$_GET['nom_table'].'.csv');

// selection de la table à exporter
$select_table = mysql_query('select * from '.$_GET['nom_table']);
$rows = mysql_fetch_assoc($select_table);

if($rows) {
  makecsv(array_keys($rows));
}

while($rows) {
  makecsv($rows);
  $rows = mysql_fetch_assoc($select_table); 
}

// la fonction magique
function makecsv($num_field_names) {
  $separate = '';
  
  // on formate les données pour remplacer les séparateurs par des traits d'union
  foreach ($num_field_names as $field_name) {
    $field_name = str_replace( array('<br>', '<br />', "n", "r", ",", ";"), array( '-', '-', '-', '-', '-', '-'), $field_name);
    echo $separate . $field_name;
    
    // on insère un séparateur de champ reconnu par Excel (si ça ne marche pas, essayez avec une virgule)
    $separate = ';';
  }
    
  // nouvelle rangée, nouvelle ligne
  echo "rn";
}
?>
									

Il ne vous reste plus qu’a ouvrir le fichier ma_table1.csv, et à « l’enregistrer sous » un format de travail Excel (.xls ou .xlsx)  si vous souhaitez maintenant faire des calculs complexes, que la puissance de votre CPU et d’Excel géreront dans difficultés.
Pour pourrez également le croiser avec d’autres tables via des clés secondaires… mais c’est un autre sujet.

That’s all folk 8)

NB : cet article est une mise à jour de celui de 2011 qui traitait déjà de la question

7 Responses to “Exporter une table MySQL au format CSV (Excel)”

7 Commentaires

  1. webtolosa dit :

    Bonjour Zara.
    Il s’agit de la connexion avec ta base. Ce code est spécifique des identifiants de ta proper base !
    Je peux te proposer par exemple !
    // Avant PHP 7 (code déprécié)
    $db_link = mysql_connect (‘IP_serveur’, ‘utilisateur_mysql’, ‘mot_de_passe’) or die (‘Je ne peux pas me connecter a la base parceque : ‘ . mysql_error());
    mysql_select_db (‘nom_de_la_base’);

    // Après PHP 7
    $db_link = mysqli_connect(‘IP_serveur’, ‘utilisateur_mysql’, ‘mot_de_passe’, ‘nom_de_la_base’);
    if (mysqli_connect_errno()) { printf(‘Échec de la connexion : %sn’, mysqli_connect_error()); exit; }

  2. zara dit :

    merci pour la solution
    svp vous pouvez nous donner le fichier de connexion connect_base.inc.php

  3. patrick dit :

    Il date mais ce code est toujours utile !
    Le code que je propose n’a pas été recopié correctement :
    • corriger le tableau des valeurs de remplacement,
    • le début du script est tronqué
    le voici en espérant que ça passe :
    query($sql);
    $rows = $select_table->fetch_assoc();
    if($rows) {
    makecsv(array_keys($rows));
    }
    while($rows) {
    makecsv($rows);
    $rows = $select_table->fetch_assoc();
    }
    // la fonction magique
    function makecsv($num_field_names) {
    $separate =  »;
    // on formate les données pour remplacer les séparateurs par des traits d’union
    foreach ($num_field_names as $field_name) {
    $field_name = str_replace( array( »,  », « \n », « \r », « ; »), array( ‘-‘, ‘-‘, ‘-‘, ‘-‘, ‘,’), $field_name);
    echo $separate . $field_name;
    // on insère un séparateur de champ reconnu par Excel (si ça ne marche pas, essayez avec une virgule)
    $separate = ‘;’;
    }
    // nouvelle rangée, nouvelle ligne
    echo « \r\n »;
    }
    ?>

  4. webtolosa dit :

    Merci Patrick de ta contribution. Effectivement ce code commence à dater.

  5. Patrick dit :

    Voici l’adaptation pour PHP 7.
    J’ai supprimé le remplacement des virgules par le tiret car mon fichier csv utilise le point virgule pour délimiter les champs.
    Sous Windows, il faut échapper les retours chariot et ligne au risque de remplacer les r et les n par des tirets.

    query($sql);
    $rows = $select_table->fetch_assoc();
    if($rows) {
    makecsv(array_keys($rows));
    }
    while($rows) {
    makecsv($rows);
    $rows = $select_table->fetch_assoc();
    }
    // la fonction magique
    function makecsv($num_field_names) {
    $separate =  »;
    // on formate les données pour remplacer les séparateurs par des traits d’union
    foreach ($num_field_names as $field_name) {
    $field_name = str_replace( array( »,  », « \n », « \r », « ; »), array( ‘-‘, ‘-‘, ‘-‘, ‘-‘, ‘,’), $field_name);
    echo $separate . $field_name;
    // on insère un séparateur de champ reconnu par Excel (si ça ne marche pas, essayez avec une virgule)
    $separate = ‘;’;
    }
    // nouvelle rangée, nouvelle ligne
    echo « \r\n »;
    }
    ?>

  6. Lolita dit :

    Bonjour et surtout merci pour ce petit code excellemment bien expliqué. Je débute en développement web et je dois dire que j’ai eu beaucoup de mal à trouver un déroulé aussi clair.
    Merci mille fois !!!

  7. lanner dit :

    Bonsoir,
    Juste pour que le retour à la ligne soit bon, à la fin il faut

    echo « \rn »;

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: