picture picture
juin 17, 2015 MySQL, PHP 2 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) …

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

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

2 Commentaires

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

  2. 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: