Liker
Commenter
S'abonner
Partager
Offrir

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

Mis à jour il y a 6 jours

Un guide pour exporter au format Excel xlsx, ods ou csv les données d’une collection ou d’un modèle et importer les données d’une feuille de calcul via le package rap2hpoutre/fast-excel dans un projet Laravel

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP

Introduction

Une collection, représentée par la classe Illumintate\Support\Collection dans un projet Laravel, est un wrapper qui fournit des méthodes pour travailler efficacement avec des tabeaux de données.

Fast Excel est un package Laravel qui permet de lire et écrire des fichiers de feuille de calcul (CSV, XLSX et ODS) et propose les fonctionnalités suivantes :

  • Exporter les données d'une collection ou d'un modèle vers un fichier .xlsx, .csv ou .ods
  • Importer les données d'un fichier Excel .xlsx ou .csv sous forme d'une collection
  • Importer des multiples feuilles de calcul
  • Exporter une grande collection de données en un temps record
  • ...

Nous allons voir dans ce guide comment installer Fast Excel puis l'utiliser pour effectuer les opérations citées ci-dessus.

Installer Fast Excel

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

composer require rap2hpoutre/fast-excel

Cette commande télécharge fast-excel avec ses dépendances dans le répertoire /vendor du projet Laravel :

Installation de fast-excel via composer

Le package rap2hpoutre/fast-excel utilise la librairie box/spout pour lire et écrire les fichiers de feuille de calcul.

Utiliser Fast Excel

Maintenant que fast-excel est téléchargé dans le projet, nous pouvons directement l'initialiser dans un contrôleur pour accéder à ses méthodes à partir 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 nous propose aussi l’helper global fastexcel() pour accéder directement à ses méthodes n’importe où dans le projet :

// ...

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

// ...

La facade

Si importer la classe Rap2hpoutre\FastExcel\FastExcel ou utiliser l'helper global fastexcel() ne vous convient pas, nous pouvons aussi enregistrer la façade « FastExcel » au tableau $aliases du fichier /config/app.php :

'aliases' => [
    //  ...,
    "FastExcel" => Rap2hpoutre\FastExcel\Facades\FastExcel::class
],

Puis initialiser FastExcel en transmettant les données via la méthode data($data)$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 dossier /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");

    }
}

$chemin dans cet exemple va contenir le chemin absolu du fichier users.xlsx créé. Exemple :  C:\laragon\www\laravel-fastexcel\public\fichier.xlsx

Réorganiser les colonnes

Si nous souhaitons sélectionner les colonnes à exporter, réoganiser les données ou y appliquer un certain traitement, nous pouvons utiliser un callback après le nom du 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’enregistrer le fichier .xlsx, .csv ou .ods dans le répertoire /public via la méthode export($fichier), nous pouvons le lancer en téléchargement via la méthode download($fichier) :

// 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 nous permet d'exporter plusieurs collections ou modèles dans des différentes feuilles de calcul d'un classeur Excel en utilisant « SheetCollection » (Collection des feuilles de calcul).

Prenons un exemple où nous exportons les données des modèles « User », « Post » et « Product » vers le fichier « users-posts-pruducts.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");
    }

}

En ouvrant le fichier users-posts-products.xlsx avec Excel 2019, je retrouve les feuilles de calcul « Utilisateurs », « Publications » et « Produits » :

3 feuilles de calcul dans Excel 2019

Exporter une grande collection

Lorsque nous avons une collection avec une grande quantité de données à exporter, 1M+ lignes par exemple, nous pouvons utiliser une fonction génératrice pour échapper au 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

La méthode import($fichier) de FastExcel où $fichier représente le chemin d'un fichier .xlsx ou .csv permet d’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 nous permet de parcourir les lignes d'un fichier et les insérer dans la base de données en utilisant 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'] indique la colonne libellée « name » dans le fichier clients.xlsx

Importer plusieurs feuilles de calcul d'un fichier xlsx

La méthode importSheets($fichier) de FastExcel permet d’importer les entrées (lignes) des feuilles de calcul du fichier $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, nous pouvons indiquer son numéro ou sa position dans le classeur via 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 dans ce guide comment utiliser le package fast-exel pour exporter les données d'une collection ou d'un modèle vers un fichier Excel .xlsx, .csv ou .ods et importer les données d'une feuille de calcul sous forme d'une collection.

La documentation de Fast Excel présente aussi comment appliquer du style (couleur de texte, police, arrière-plan, ...) aux colonnes et lignes d'une feuille de calcul.

Faisons un récapitulatif des fonctions vues :

  • fastexcel($data) : l'helper global de FastExcel qui 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 une 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 d'un fichier $fichier
  • sheet($numero) : importer une feuille de calcul spécifique $numero d'un classeur
  • download($fichier) : lancer le téléchargement du fichier $fichier après l'exportation de données

N'hésitez pas de partager avec nous votre expérience avec Fast Excel en commentaire. Merci !

Cette publication vous a plu ?
Encouragez-nous en la partageant 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 Akili School

Voir mon profil Suivre