Comment sauvegarder en format CSV avec PHP

Comment sauvegarder en format CSV avec PHP

On m’a récemment demandé d’offrir une version Excel d’une liste de prix d’un catalogue en-ligne afin que les visiteurs puissent la sauvegarder. En premier lieu j’ai exploré un module Pear, Spreadsheet_Excel_Writer, qui sauvegardait le fichier en mode XLS, le format propriétaire Excel. Ce module est assez simple d’utilisation et ne requiert pas de fichiers dépendants additionnels de l’architecture Pear. Par contre, pour une plus grande flexibilité et compatibilité avec divers logiciels chiffriers, j’ai finalement décidé de créer moi-même un fichier texte CSV (Comma-separated values). Ce n’est pas très compliqué.

La structure typique d’un fichier CSV lisible avec divers chiffriers électroniques, dont Excel, est de séparer les données pour chaque colonne avec une virgule et un espace, et de faire un retour de ligne \n à la fin de la rangée. Il suffit donc de reprendre la fonction originale PHP qui affiche la liste de produits dans la page web et de changer les éléments de structure HTML pour un formatage CSV. Afin de rendre cette information téléchargeable, on doit créer une nouvelle page avec le code PHP exclusivement, sans éléments HTML.

Commençons par insérer le titre des colonnes dans une variable, divisé par des virgules et finissant avec le caractère de nouvelle ligne:

$catalogue_csv = "ID, Nom, Prix, Description\n";

Ensuite on peut aller chercher les données. Mais comme la virgule est l’élément de séparation entre les colonnes, il faudra la remplacer dans les valeurs qui pourraient en contenir, comme le champs de description de produit. Aussi, les informations d’un produit dans un fichier CSV doivent toutes tenir sur une ligne, car le retour de ligne indique une nouvelle rangée de données, alors on devra effacer les caractères espace de type tab, newline, carriage return, et autres qui pourraient causer accidentellement une nouvelle ligne dans le fichier CSV:

$query = "SELECT * FROM table_produits";
$result = mysql_query($query);
$num_results = mysql_num_rows($result);
if ($num_results) {

	for ($i = 0; $i < $num_results; $i++) {

		$row = mysql_fetch_array($result);
	
		$produit_description = $row["Description"];
		
		//effacer les espaces inutiles au début et la fin du champs ainsi que les possibles retours de ligne à l'intérieur
		$produit_description = trim(preg_replace("/\s+/", " ", $produit_description));
		
		//remplacer les virgules par un simple espace blanc
		$produit_description = str_replace(",", " ", $produit_description);
	
		$catalogue_csv .= $row["ID"] . ", " . $row["Nom"] . ", " . $row["Prix"] . ", " . $produit_description . "\n" . 
	
	}
}

Si votre texte contient des accents et requiert l'encodage UTF-8, il faudra convertir la variable une fois terminée:

$catalogue_csv = mb_convert_encoding($catalogue_csv, 'ISO-8859-1', 'UTF-8');

Nous avons toute l'information nécessaire maintenant dans une variable, il nous reste juste à l'envoyer. Pour générer un fichier CSV, il faut indiquer au navigateur web la nature de la page ("mime type") afin qu'il lance la bonne application pour lire ce type de fichier ou le sauvegarder dans le bon format. Voici le code à ajouter à la fin de notre page:

$nom_fichier = "catalogue-" . date("Y-m-d", time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=" . $nom_fichier . ".csv");
print $catalogue_csv;
exit;

Comme le catalogue est mise à jour régulièrement, c'est une bonne idée d'ajouter la date au nom de fichier. Voilà, on n'a plus qu'à faire un lien vers cette page à quelque part dans le site web et l'utilisateur se verra offrir d'ouvrir le catalogue de produits avec son logiciel chiffrier (généralement, Excel) ou de sauvegarder le fichier avec une extension .csv pour le consulter plus tard.

3 thoughts on “Comment sauvegarder en format CSV avec PHP

  1. if ($num_results) {
    while($row = mysql_fetch_array($result){
    $produit_description = $row[« Description »];
    }
    }

  2. Bonjour,

    Merci pour ton tuto.
    Mon problème est que je voudrais pouvoir donner une taille à chaque colonne ou formatter chaque colonne pour qu’on puisse à l’ouverture du fichier excel avoir de belles colonnes bien alignées. Saurais-tu comment ou où trouver cela. Je cherche depuis un bout de temps et rien …
    Merci pour ta réponse

    Cordialement
    gkalikoba

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *