Excel est formidable pour explorer des données, construire un tableau de bord ou automatiser quelques tâches du quotidien. Mais dès qu’il faut traiter plusieurs milliers de lignes, récupérer des informations depuis une API ou générer régulièrement des fichiers personnalisés, ses limites peuvent rapidement se faire sentir.

C’est là que PHP entre en jeu. Ce langage permet de créer de petits outils web capables de préparer, modifier et exporter des fichiers Excel automatiquement. L’utilisateur n’a plus besoin de copier-coller des données pendant une heure : il clique sur un bouton, et le fichier est prêt.

Dans cet article, nous allons voir comment PHP peut compléter Excel, quelles bibliothèques utiliser et comment construire un outil fiable et performant. Pas besoin de transformer votre serveur en usine à gaz : quelques bonnes pratiques suffisent déjà à gagner beaucoup de temps.

Pourquoi utiliser PHP avec Excel ?

Excel est particulièrement efficace pour analyser des données. En revanche, il n’est pas toujours le meilleur outil pour les collecter ou les préparer. PHP peut prendre en charge toute cette partie répétitive.

Imaginez un outil qui récupère chaque matin les ventes depuis une base de données, applique les règles de calcul de votre entreprise et génère automatiquement un fichier Excel. Vous pouvez ensuite ouvrir ce fichier pour créer vos graphiques ou effectuer vos analyses habituelles.

PHP peut notamment servir à :

  • générer des fichiers Excel à partir de données stockées dans une base MySQL ;
  • importer un fichier envoyé par un utilisateur et contrôler son contenu ;
  • fusionner plusieurs fichiers dans un seul classeur ;
  • ajouter des formules, des styles et des graphiques ;
  • récupérer des données depuis une API ;
  • planifier la création automatique de rapports ;
  • proposer une interface web simple pour lancer un traitement.

Le principe est simple : PHP prépare le travail, Excel reste l’outil d’analyse et de présentation. Chacun joue sur son terrain préféré.

La bibliothèque à privilégier : PhpSpreadsheet

Pour manipuler des fichiers Excel en PHP, la bibliothèque la plus couramment utilisée aujourd’hui est PhpSpreadsheet. Elle permet de lire et d’écrire des fichiers aux formats XLSX, XLS, CSV, ODS et bien d’autres.

Vous rencontrerez peut-être le nom PHPExcel dans d’anciens tutoriels. Cette bibliothèque a été abandonnée et remplacée par PhpSpreadsheet. Si vous démarrez un nouveau projet, mieux vaut donc utiliser la solution actuelle plutôt que de construire votre outil sur une technologie qui ne reçoit plus de mises à jour.

L’installation se fait généralement avec Composer, le gestionnaire de dépendances de PHP :

composer require phpoffice/phpspreadsheet

Dans votre script, il suffit ensuite de charger l’autoloader de Composer :

<?phprequire 'vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

Cette organisation facilite également la maintenance. Si la bibliothèque évolue, vous pouvez mettre à jour sa version sans recopier manuellement une multitude de fichiers.

Créer un premier fichier Excel avec PHP

Commençons par un exemple très simple : générer une feuille contenant une liste de produits et leur prix.

<?phprequire 'vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;$classeur = new Spreadsheet();$feuille = $classeur->getActiveSheet();$feuille->setTitle('Produits');$feuille->setCellValue('A1', 'Produit');$feuille->setCellValue('B1', 'Prix');$feuille->setCellValue('A2', 'Clavier');$feuille->setCellValue('B2', 49.90);$feuille->setCellValue('A3', 'Souris');$feuille->setCellValue('B3', 24.90);$feuille->setCellValue('A4', 'Écran');$feuille->setCellValue('B4', 199.90);$ecriture = new Xlsx($classeur);$ecriture->save('produits.xlsx');

Le fichier produits.xlsx est créé dans le dossier du script. Dans un outil web, vous pouvez ensuite proposer son téléchargement à l’utilisateur.

Pour envoyer directement le fichier au navigateur, utilisez les en-têtes HTTP adaptés :

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');header('Content-Disposition: attachment; filename="produits.xlsx"');header('Cache-Control: max-age=0');$ecriture = new Xlsx($classeur);$ecriture->save('php://output');

Le navigateur déclenchera alors le téléchargement sans enregistrer temporairement le document sur le serveur.

Améliorer la présentation du classeur

Un fichier Excel fonctionnel n’est pas forcément agréable à utiliser. Quelques styles bien choisis peuvent faire toute la différence, notamment pour les rapports destinés à être imprimés ou présentés à une équipe.

Vous pouvez mettre en forme les en-têtes, ajuster automatiquement la largeur des colonnes et appliquer un format monétaire aux cellules contenant des prix :

$feuille->getStyle('A1:B1')->applyFromArray([    'font' => [        'bold' => true,        'color' => ['rgb' => 'FFFFFF']    ],    'fill' => [        'fillType' => 'solid',        'startColor' => ['rgb' => '217346']    ]]);$feuille->getColumnDimension('A')->setAutoSize(true);$feuille->getColumnDimension('B')->setAutoSize(true);$feuille->getStyle('B2:B4')    ->getNumberFormat()    ->setFormatCode('#,##0.00 €');

Le vert utilisé dans l’exemple rappelle l’univers Excel, mais rien ne vous oblige à reprendre cette couleur. L’idéal est de rester cohérent avec votre charte graphique et de ne pas transformer le fichier en sapin de Noël.

Vous pouvez également figer la première ligne afin que les titres restent visibles lorsque l’utilisateur fait défiler un long tableau :

$feuille->freezePane('A2');

Ajouter des formules plutôt que des résultats figés

PHP peut écrire des formules Excel dans les cellules. C’est utile lorsque le destinataire doit pouvoir modifier les données et obtenir automatiquement un nouveau résultat.

$feuille->setCellValue('C1', 'Total');$feuille->setCellValue('C2', '=B2*1.20');$feuille->setCellValue('C3', '=B3*1.20');$feuille->setCellValue('C4', '=B4*1.20');$feuille->getStyle('C2:C4')    ->getNumberFormat()    ->setFormatCode('#,##0.00 €');

Dans cet exemple, la colonne C calcule un prix avec une TVA de 20 %. La formule reste modifiable dans Excel, ce qui est plus souple qu’un résultat définitif calculé côté PHP.

Pour une liste plus longue, vous pouvez générer les formules dans une boucle :

for ($ligne = 2; $ligne <= 100; $ligne++) {    $feuille->setCellValue("C$ligne", "=B$ligne*1.20");}

Attention toutefois : PhpSpreadsheet écrit les formules, mais ne se comporte pas exactement comme Excel pour leur recalcul. Si vous devez fournir immédiatement des valeurs calculées, effectuez le calcul en PHP ou vérifiez les paramètres de recalcul du classeur.

Importer un fichier Excel et contrôler les données

La génération de fichiers n’est qu’une partie du sujet. Un outil PHP peut aussi recevoir un fichier Excel envoyé par un utilisateur, le lire et importer son contenu dans une base de données.

use PhpOffice\PhpSpreadsheet\IOFactory;$fichier = $_FILES['fichier_excel']['tmp_name'];$classeur = IOFactory::load($fichier);$feuille = $classeur->getActiveSheet();foreach ($feuille->toArray() as $index => $ligne) {    if ($index === 0) {        continue;    }    $nom = trim($ligne[0] ?? '');    $email = trim($ligne[1] ?? '');    if ($nom === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {        continue;    }    // Insertion en base de données après validation}

Ne faites jamais confiance aux données provenant d’un fichier importé. Contrôlez le type et la taille du fichier, vérifiez les colonnes attendues et validez chaque valeur avant de l’enregistrer.

Il est également préférable de limiter les extensions acceptées et de renommer le fichier sur le serveur. Le nom transmis par l’utilisateur ne doit pas être utilisé directement dans un chemin de fichier.

Connecter PHP à une base de données

Dans un cas réel, les données proviennent souvent d’une base MySQL. Utilisez PDO et les requêtes préparées afin d’éviter les injections SQL.

$pdo = new PDO(    'mysql:host=localhost;dbname=entreprise;charset=utf8mb4',    'utilisateur',    'mot_de_passe',    [        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC    ]);$requete = $pdo->query(    'SELECT produit, prix, quantite FROM ventes ORDER BY produit');$ventes = $requete->fetchAll();

Vous pouvez ensuite parcourir le tableau obtenu pour remplir votre feuille Excel :

$ligne = 2;foreach ($ventes as $vente) {    $feuille->setCellValue("A$ligne", $vente['produit']);    $feuille->setCellValue("B$ligne", (float) $vente['prix']);    $feuille->setCellValue("C$ligne", (int) $vente['quantite']);    $feuille->setCellValue("D$ligne", "=B$ligne*C$ligne");    $ligne++;}

Cette méthode convient pour quelques milliers de lignes. Pour des volumes plus importants, il faudra surveiller la mémoire utilisée par PhpSpreadsheet.

Améliorer les performances sur les gros fichiers

Un classeur Excel n’est pas un simple fichier texte. Chaque cellule peut contenir une valeur, un style, une formule ou des métadonnées. Lorsque le nombre de cellules augmente, la consommation mémoire peut devenir importante.

Voici plusieurs réflexes utiles :

  • évitez d’appliquer un style cellule par cellule si une plage entière peut être stylée en une seule opération ;
  • ne chargez qu’une feuille ou qu’une partie des données lorsque c’est possible ;
  • préférez le format CSV pour les exports très volumineux ne nécessitant pas de mise en forme ;
  • limitez le nombre de formules et de graphiques générés ;
  • traitez les données par lots plutôt que de tout conserver en mémoire ;
  • augmentez la limite mémoire de PHP uniquement après avoir optimisé le script.

Le format CSV est souvent sous-estimé. Si votre besoin se résume à exporter des lignes et des colonnes, il sera beaucoup plus rapide à produire qu’un fichier XLSX :

$sortie = fopen('php://output', 'w');fputcsv($sortie, ['Produit', 'Prix', 'Quantité'], ';');foreach ($ventes as $vente) {    fputcsv($sortie, [        $vente['produit'],        $vente['prix'],        $vente['quantite']    ], ';');}fclose($sortie);

Excel ouvre très bien les fichiers CSV, même si l’encodage et le séparateur doivent être choisis avec soin pour éviter les mauvaises surprises à l’ouverture.

Créer un outil web simple pour les utilisateurs

Vous pouvez rendre votre script accessible depuis une petite page web. L’utilisateur sélectionne une période, un service ou un type de rapport, puis PHP génère le classeur correspondant.

Par exemple, un formulaire peut proposer deux dates :

<form method="post">    <label for="date_debut">Du</label>    <input type="date" id="date_debut" name="date_debut" required>    <label for="date_fin">Au</label>    <input type="date" id="date_fin" name="date_fin" required>    <button type="submit">Générer le rapport</button></form>

Côté PHP, validez les dates avant de les utiliser dans une requête. Ne concaténez jamais directement des valeurs transmises par le formulaire dans une requête SQL. Utilisez des paramètres :

$requete = $pdo->prepare(    'SELECT produit, prix, quantite     FROM ventes     WHERE date_vente BETWEEN :debut AND :fin');$requete->execute([    'debut' => $_POST['date_debut'],    'fin' => $_POST['date_fin']]);

Un bouton « Générer » paraît anodin, mais derrière lui se trouvent de la validation, de la sécurité et parfois plusieurs secondes de traitement. Un bon outil masque cette complexité à l’utilisateur.

Automatiser la génération des rapports

Si un rapport doit être produit chaque lundi matin, inutile de demander à quelqu’un de se connecter pour cliquer sur un bouton. Une tâche planifiée, appelée cron sous Linux, peut lancer votre script automatiquement.

Une commande de ce type peut exécuter un script chaque jour à 7 heures :

0 7 * * * /usr/bin/php /var/www/rapport.php

Le script peut enregistrer le fichier dans un dossier sécurisé, l’envoyer par e-mail ou le déposer dans un espace partagé. Pensez à conserver un journal d’exécution : en cas d’échec, vous devez savoir si le problème vient de la base de données, d’une API indisponible ou d’un manque d’espace disque.

Pour les rapports sensibles, évitez de joindre systématiquement un fichier Excel non protégé à un e-mail. Un lien temporaire vers un espace authentifié est souvent une meilleure option.

Les bonnes pratiques à retenir

Un outil PHP destiné à Excel doit être pensé comme une petite application, pas comme un script jetable. Même si le premier prototype tient en cinquante lignes, les besoins vont souvent évoluer.

  • séparez la récupération des données, la préparation du classeur et son téléchargement ;
  • utilisez Composer et maintenez les dépendances à jour ;
  • validez toutes les données entrantes ;
  • protégez les accès à la base de données et aux fichiers générés ;
  • gérez les erreurs avec des messages compréhensibles ;
  • testez le résultat avec plusieurs volumes de données ;
  • documentez les colonnes, les formules et les règles de calcul utilisées.

PHP ne remplace pas Excel. Il lui donne plutôt un assistant infatigable pour collecter les données, appliquer les règles métier et préparer les fichiers. Avec PhpSpreadsheet, une base de données bien structurée et quelques contrôles de sécurité, vous pouvez créer des outils vraiment utiles : générateurs de rapports, importateurs, tableaux de suivi ou exports automatisés.

Et si votre fichier Excel commence à dépasser plusieurs dizaines de milliers de lignes, prenez une minute pour vous demander si l’utilisateur a réellement besoin de toutes ces données dans un classeur. Parfois, le meilleur outil est un export plus léger, un filtre bien pensé ou un tableau de bord connecté. Excel appréciera, et votre serveur aussi.