Exporter une table MySQL au format CSV (Excel)
PHP 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 :
- la page sur laquelle est le lien d’appel du fichier excel (export.php)
- 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>
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";
}
?>
That’s all folk
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; }
merci pour la solution
svp vous pouvez nous donner le fichier de connexion connect_base.inc.php
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 »;
}
?>
Merci Patrick de ta contribution. Effectivement ce code commence à dater.
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 »;
}
?>
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 !!!
Bonsoir,
Juste pour que le retour à la ligne soit bon, à la fin il faut
echo « \rn »;