Un tutoriel 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
Sommaire
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 tableaux de données.
Fast Excel ou fast-excel est un package Laravel qui permet de lire et écrire des fichiers de feuille de calcul (CSV, XLSX et ODS). Il propose les fonctionnalités suivantes :
Nous voulons voir dans ce guide comment installer et utiliser Fast Excel pour effectuer les opérations citées ci-dessus.
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 :
Le package rap2hpoutre/fast-excel utilise la librairie box/spout pour lire et écrire les fichiers de feuille de calcul.
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
dans le fichier /config/app.php :
'aliases' => [
// ...,
"FastExcel" => Rap2hpoutre\FastExcel\Facades\FastExcel::class
],
Puis initialiser Fast Excel en transmettant les données via 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);
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
Si nous souhaitons sélectionner les colonnes à exporter, réorganiser 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']
];
});
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');
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 de feuilles de calcul).
Prenons un exemple où nous exportons 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");
}
}
En ouvrant le fichier users-posts-products.xlsx avec Excel 2019, je retrouve les feuilles de calcul « Utilisateurs », « Publications » et « Produits » :
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");
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);
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
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");
Nous venons de voir 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 méthodes fast-excel 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èleimport($fichier)
: importer les lignes d'un fichier $fichier
.xlsx, .csv ou .ods dans une collectionexport($fichier)
: exporter les données d'une collection ou d'un modèle vers un fichier $fichier
.xlsx, .csv ou .odsimportSheets($fichier)
: importer les feuilles de calcul d'un fichier $fichier
sheet($numero)
: importer une feuille de calcul spécifique $numero
d'un classeurdownload($fichier)
: lancer le téléchargement du fichier $fichier
N'hésitez pas de partager avec nous votre expérience avec Fast Excel en commentaire. Portez-vous bien ! 😊
Cette publication vous a plu ?
Encouragez-nous en la partageant sur les réseaux sociaux
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 Suivre
Commentaires