Nous utilisons les cookies afin de fournir les services et fonctionnalités proposés sur notre site et afin d’améliorer l’expérience de nos utilisateurs. Pour plus d'informations nous vous invitons à consulter notre Politiques sur les cookies ainsi que notre Politique de confidentialité.

Lecture optimisée de fichiers Excel en PHP

Ce tutoriel compare les philosophies de PhpSpreadsheet et OpenSpout pour l'importation de données. L'objectif est de lire un fichier, d'ignorer la première ligne (en-têtes) et d'accéder aux colonnes spécifiques.

OpenSpout : Le Choix Recommandé pour l'Importation

OpenSpout est la solution que vous devriez privilégier pour l'importation massive de données. Il est un fork (une reprise tenue à jour) du projet Spout original. Il conserve l'architecture de lecture en flux (streaming), garantissant une vitesse maximale et une consommation de mémoire extrêmement faible, essentielle pour les gros fichiers clients.

Exemple de Code OpenSpout (Lecture en Flux)

use OpenSpoutReaderCommonCreatorReaderFactory;

function readWithOpenSpout(string $filePath): void {
    
    // 1. Ouvrir le lecteur
    $reader = ReaderFactory::createFromFile($filePath);
    $reader->open($filePath);

    foreach ($reader->getSheetIterator() as $sheet) {
        $rowCounter = 0;
        foreach ($sheet->getRowIterator() as $row) {
            
            if ($rowCounter++ === 0) continue; // Ignore l'en-tête
            
            $rowData = $row->toArray();
            
            if (empty(implode('', $rowData))) continue; // Saute les lignes vides
            
            // Accès direct aux colonnes 
            $identifiant = $rowData[0]; 
            $prix = $rowData[4];
            
            // ... Logique de traitement ou d'insertion ...
        }
    }
    $reader->close();
}
// Note : Pour PHP 7.4, vous devrez utiliser une version OpenSpout 3.x.

1. PhpSpreadsheet : La Méthode Classique (toArray())

Cette approche est la plus simple, mais la plus dangereuse. PhpSpreadsheet modélise l'intégralité du document en mémoire.

Code d'Exemple (toArray())

use PhpOfficePhpSpreadsheetIOFactory;

function readWithPhpSpreadsheetSimple(string $filePath): void {
    // AVERTISSEMENT : Risque d'erreurs de mémoire sur les gros fichiers.
    
    $spreadsheet = IOFactory::load($filePath);
    $worksheet = $spreadsheet->getActiveSheet();
    
    // Charge tout le fichier en mémoire vive
    $excelData = $worksheet->toArray(null, true, true, true); 
    
    // Le traitement des données se fait APRÈS le chargement
    $dataRows = array_filter(array_slice($excelData, 1), fn($row) => implode('', $row) !== '');
                             
    foreach ($dataRows as $rowData) {
        $identifiant = $rowData[0]; 
        $prix = $rowData[4];
        // ... Logique de traitement ou d'insertion ...
    }
}
// Note : Nécessite une version de PhpSpreadsheet compatible avec votre version de PHP.

2. PhpSpreadsheet : La Méthode Optimisée (Filtre de Lecture)

C'est la solution pour utiliser PhpSpreadsheet sur de grands fichiers en réduisant la consommation de mémoire (simule le streaming).

Code d'Exemple (Filtre de Lecture)

use PhpOfficePhpSpreadsheetIOFactory;
use PhpOfficePhpSpreadsheetReaderIReadFilter;

function readWithPhpSpreadsheetOptimized(string $filePath): void {
    
    // 1. Définir le filtre pour ne lire que les lignes de données
    $reader = IOFactory::createReaderForFile($filePath);
    $reader->setReadFilter(new class implements IReadFilter {
        public function readCell($column, $row, $worksheetName = ''): bool {
            return $row >= 2;
        }
    });

    // 2. Charger le fichier en appliquant le filtre
    $spreadsheet = $reader->load($filePath);
    $worksheet = $spreadsheet->getActiveSheet();

    // 3. Itération sur les lignes restantes
    foreach ($worksheet->getRowIterator() as $row) {
        $rowData = [];
        $cellIterator = $row->getCellIterator();
        $cellIterator->setIterateOnlyExistingCells(true); 

        $columnIndex = 0;
        foreach ($cellIterator as $cell) {
            if ($columnIndex >= 13) break; // Limiter aux 13 premières colonnes
            
            $rowData[] = $cell->getValue();
            $columnIndex++;
        }
        
        if (empty(implode('', $rowData))) continue; 
        
        $identifiant = $rowData[0]; 
        $prix = $rowData[4];
        // ... Logique de traitement ou d'insertion ...
    }
}

3. Spout (API Originale - Non Maintenue)

use BoxSpoutReaderCommonCreatorReaderEntityFactory;

function readWithSpout(string $filePath): void {
    
    // Le nom de la classe est différent de celui d'OpenSpout
    $reader = ReaderEntityFactory::createReaderFromFile($filePath); 
    $reader->open($filePath);

    foreach ($reader->getSheetIterator() as $sheet) {
        $rowCounter = 0;
        foreach ($sheet->getRowIterator() as $row) {
            
            if ($rowCounter++ === 0) continue; 
            
            $rowData = $row->toArray();
            
            if (empty(implode('', $rowData))) continue; 
            
            $identifiant = $rowData[0]; 
            // ... Logique de traitement ...
        }
    }
    $reader->close();
}

Conclusion : Choisir l'Outil Adapté à la Tâche

Le choix de l'API pour lire les fichiers Excel en PHP se résume à une question de mémoire et de performance. Les trois méthodes examinées reflètent deux philosophies distinctes :

1. Pour l'Importation de Données (Lecture Séquentielle) : OpenSpout est le vainqueur incontesté.

OpenSpout (ou Spout pour les anciens projets) utilise une architecture de lecture en flux (streaming). Cela signifie qu'il lit et traite les données ligne par ligne sans jamais charger l'intégralité du fichier en RAM.

  • Votre Recommandation Finale : Pour l'intégration dans votre système de traitement, OpenSpout est le choix le plus robuste, rapide et sécurisé contre les erreurs de mémoire. Sa simplicité de code et sa maintenance active par la communauté le rendent idéal pour les tâches d'importation de données, peu importe le volume du fichier client.

  • Action Clé : Pensez à installer la version OpenSpout 3.x pour maintenir la compatibilité avec PHP 7.4

{
    "require": {
        "openspout/openspout": "^3.7.3"
    },
    "config": {
        "platform": {
            "php": "7.4"
        }
    }
}

2. Pour la Manipulation Avancée (Écriture/Formatage) : PhpSpreadsheet est nécessaire.

PhpSpreadsheet est le seul choix si vous avez besoin de modifier des formules, d'appliquer des styles complexes, de créer des graphiques ou d'exporter des PDF. Pour la lecture de gros fichiers, vous devez obligatoirement utiliser la méthode du Filtre de Lecture (IReadFilter) pour contrôler l'utilisation de la mémoire. Évitez la méthode simple toArray() dans un contexte d'importation de données.

Vous désirez un site internet pour vous ou votre entreprise ? contactez-nous !
Haut de la page