Laravel : importer et exporter une collection en Excel avec Fast Excel

Mis à jour il y a 1 an

Un tutoriel sur l’utilisation du package rap2hpoutre/fast-excel pour exporter des données d’une collection ou d’un modèle au format Excel xlsx, ods ou csv et d'importer les données d’une feuille de calcul dans un projet Laravel.

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP
Voir aussi Un tutoriel pour créer une migration contenant le schéma (structure) d'une table existante dans la base de données d'un projet Laravel En savoir plus

Introduction

Fast Excel ou fast-excel est un package Laravel qui permet de lire et d'écrire des fichiers de tableur (CSV, XLSX et ODS). Il offre les fonctionnalités suivantes :

  • Exporter des données de collections ou de modèles vers des fichiers .xlsx, .csv ou .ods
  • Importer des données à partir d'un fichier Excel .xlsx ou .csv en tant que collection
  • Importer plusieurs feuilles de calcul
  • Exportez de grandes collections de données en un temps record
  • ...

Une collection (Illuminate\Support\Collection) dans un projet Laravel, est un wrapper qui fournit des méthodes pour manipuler efficacement des tableaux de données.

Ce guide vous montrera comment installer et utiliser Fast Excel ou rap2hpoutre/fast-excel pour effectuer les opérations ci-dessus. Au moment de la rédaction de cet article, j'utilise la version 9.42.2 de Laravel.

La version anglaise de ce tutoriel : Laravel : import and export a collection in Excel with Fast Excel

Installer Fast Excel

Pour installer le package rap2hpoutre/fast-excel dans un projet Laravel, exécutez la commande composer suivante :

composer require rap2hpoutre/fast-excel

Cette commande téléchargera fast-excel et ses dépendances dans le répertoire /vendor de votre projet Laravel.

Le package rap2hpoutre/fast-excel utilise la bibliothèque box/spout pour lire et écrire des fichiers de tableur.

Utiliser Fast Excel

Une fois fast-excel téléchargé dans votre projet, vous pouvez l'initialiser directement dans un contrôleur et accéder aux méthodes de la classe Rap2hpoutre\FastExcel\FastExcel :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Rap2hpoutre\FastExcel\FastExcel; // La classe FastExcel

class FastExcelController extends Controller
{
    public function index () {

        $data = collect(); // Une collection ou un modèle
        $fastexcel = new FastExcel($data); // L'instance Fast Excel
        dd($fastexcel);

    }
}

L'helper global

FastExcel fournit également l’helper global fastexcel() qui permet un accès direct a ses méthodes n'importe où dans votre projet :

// ...

$data = collect(); // Une collection ou un modèle
$fastexcel = fastexcel($data); // L'instance Fast Excel

// ...

La facade

Si l'importation de la classe Rap2hpoutre\FastExcel\FastExcel ou l'utilisation de l'helper global fastexcel() ne vous convient pas, vous pouvez également enregistrer la façade "FastExcel" dans le tableau $aliases de votre fichier /config/app.php :

'aliases' => Facade::defaultAliases()->merge([

    "FastExcel" => Rap2hpoutre\FastExcel\Facades\FastExcel::class

])->toArray()

Ensuite, initialisez Fast Excel en transmettant des données à la méthode data($data), où $data représente une collection ou un modèle :

// Une collection ou un modèle
$data = User::first();

// L'instance Fast Excel
$fastexcel = \FastExcel::data($data);

Exporter en xlsx, csv ou ods avec Fast Excel

La méthode export($fichier) de FastExcel, où $fichier représente le nom du fichier suivi de l'extension ".xlsx", ".ods" ou ".csv" permet d'exporter les données d'une collection ou d'un modèle vers le répertoire /public :

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;

class FastExcelController extends Controller
{
    public function index () {

        // Une collection de "App\Models\User";
        $users = User::all();

        // Exportation vers le fichier "/public/users.xlsx"
        $chemin = (fastexcel($users))->export("users.xlsx");

        // Exportation vers le fichier "/public/users.csv"
        // $chemin = (fastexcel($users))->export("users.csv");

        // Exportation vers le fichier "/public/users.ods"
        // $chemin = (fastexcel($users))->export("users.ods");

    }
}

Dans cet exemple, $chemin contient le chemin absolu du fichier users.xlsx créé. Exemple : C:\laragon\www\laravel-fastexcel\public\users.xlsx

Réorganiser les colonnes

Si vous souhaitez sélectionner les colonnes à exporter, réorganiser les données ou leur appliquer un traitement, vous pouvez utiliser un callback après le nom de fichier dans la méthode export() :

// Callback "function($user) { ... }" dans export() 
$chemin = (fastexcel($users))->export("users.xlsx", function ($user) {  
    return [
        "Nom" => ucfirst($user['name']),
        "Adresse email" => $user['email']
    ];  
});

Télécharger le fichier .xls, .csv ou .ods

Au lieu d'utiliser la méthode export($fichier) pour enregistrer les fichiers .xlsx, .csv ou .ods dans le répertoire /public, vous pouvez utiliser la méthode download($fichier) pour lancer le téléchargement :

// Collection "App\Models\User";
$users = User::select('id', 'name', 'email')->get();

// Téléchargement du fichier "users.xlsx"
return fastexcel($users)->download('users.xlsx');

Exporter plusieurs modèles dans un fichier Excel

Fast Excel vous permet d'exporter plusieurs collections ou modèles vers différentes feuilles de calcul dans un classeur Excel à l'aide de la classe SheetCollection (Collection de feuilles de calcul).

Regardons un exemple qui exporte les données des modèles User, Post et Product vers le fichier users-posts-products.xlsx :

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

// Importation de SheetCollection
use Rap2hpoutre\FastExcel\SheetCollection; 

use App\Models\Post;
use App\Models\Product;
use App\Models\User;

class FastExcelController extends Controller
{
    public function index () {

        // Collection "App\Models\User";
        $users = User::select('id', 'name', 'email')->get();

        // Collection "App\Models\Post"
        $posts = Post::orderBy("created_at")->get();

        // Collection "App\Models\Product"
        $products = Product::select('id', "name", "description")->get();

        // Collection des feuilles de calcul (SheetCollection)
        $sheets = new SheetCollection([
            "Utilisateurs" => $users,
            "Publications" => $posts,
            "Produits" => $products
        ]);

        // Exportation des feuilles de calcul vers "/public/users-posts-products.xlsx"
        $chemin = (fastexcel($sheets))->export("users-posts-products.xlsx");
    }

}

Si vous ouvrez le fichier users-posts-products.xlsx dans Microsoft Excel, vous trouverez les feuilles de calcul "Utilisateurs", "Publications" et "Produits" :

3 feuilles de calcul dans Excel 2019

Exporter de grandes collections

Si vous avez une collection qui exporte une grande quantité de données, 1M+ lignes par exemple, vous pouvez utiliser une fonction génératrice pour éviter le problème memory_limit :

use App\Models\Client;

// Fonction génératrice "clients()"
function clients () {
    foreach (Client::cursor() as $client) {
        yield $client;
    }
};

// Exportation vers "users-clients.xlsx"
fastexcel(iterator_to_array(clients()))->export("users-clients.xlsx");

Importer un fichier xlsx, csv ou ods avec Fast Excel

Vous pouvez utiliser la méthode import($fichier) de FastExcel, où $fichier représente le chemin d'un fichier .xlsx ou .csv, pour importer les entrées (lignes) de $fichier dans une collection (Illuminate\Support\Collection) :

// Importation du fichier "/public/users.xlsx"
$data = fastexcel()->import("users.xlsx");

// $data contient une collection
dd($data);

Importer dans la base de données

FastExcel vous permet de parcourir les lignes d'un fichier et de les insérer dans la base de données à l'aide d'un callback après le nom du fichier dans la méthode import() :

use App\Models\Client;

// Callback "function ($ligne) { ... }" dans "import"
$data = fastexcel()->import("clients.xlsx", function ($ligne) {

    return Client::create([
        'name' => $ligne['name'],
        'email' => $ligne['email'],
        'phone' => $ligne['phone'],
        'address' => $ligne['address'],
    ]);

});

$ligne['name'] spécifie la colonne intitulée "name" dans le fichier clients.xlsx.

Importer plusieurs feuilles de calcul à partir d'un fichier xlsx

La méthode importSheets($fichier) de FastExcel importe les entrées de feuille de calcul (lignes) de $fichier dans une collection (Illuminate\Support\Collection) :

// Importation du fichier "/public/users-posts-products.xlsx"
$data = fastexcel()->importSheets("users-posts-products.xlsx");

// $data contient une collection de 3 tableaux
dd($data);

Pour importer une feuille de calcul spécifique, vous pouvez spécifier son numéro ou sa position dans le classeur à l'aide de la méthode sheet($numero) :

// Importation de la 2e feuille de calcul du fichier "/public/users-posts-products.xlsx"
$data = fastexcel()->sheet(2)->import("users-posts-products.xlsx");

Conclusion

Nous venons de voir comment utiliser le package Fast Excel pour exporter des données d'une collection ou d'un modèle vers un fichier Excel au format .xlsx, .csv ou .ods, et importer des données à partir d'une feuille de calcul en tant que collection.

La documentation de Fast Excel montre également comment appliquer des styles (couleur du texte, police, arrière-plan, ...) aux colonnes et aux lignes d'une feuille de calcul.

Résumons les méthodes fast-excel vues :

  • fastexcel($data) : l'helper global de FastExcel permet de l'initialiser avec les données $data d'une collection ou d'un modèle
  • import($fichier) : importer les lignes d'un fichier $fichier .xlsx, .csv ou .ods dans la collection
  • export($fichier) : exporter les données d'une collection ou d'un modèle vers un fichier $fichier .xlsx, .csv ou .ods
  • importSheets($fichier) : importer les feuilles de calcul depuis $fichier
  • sheet($numero) : importer une feuille de calcul spécifique $numero
  • download($fichier) : lancer le téléchargement du fichier $fichier

N'hésitez pas à partager votre expérience avec Fast Excel dans les commentaires. Portez-vous bien ! 😊

Cette publication vous a plu ?
Partagez-la avec vos ami(e)s sur les réseaux sociaux.

Wilo Ahadi

Wilo Ahadi, l'auteur

Passionné de l'informatique, je suis spécialiste en techniques des systèmes et réseaux, développeur web et mobile, infographiste et designer, ... J'aime partager mon expérience en formant sur la plateforme Akili School

Voir profil

Commentaires