Kaherecode

[Laravel] Importer des données depuis un fichier excel

Diallo Mamoudou
@Moudjames23 26 avr. 2022
97

Il nous arrive parfois dans notre quotidien de développeurs d'avoir à importer des données dans l'application que nous sommes en train de développer depuis un fichier excel.

Dans ce tutoriel, nous allons partir d'un exemple concret. Supposons que nous sommes entrain de developper une application web de recenser toutes les écoles de la Guinée (oui, je sais que je ne suis pas très inspiré aujourd’hui ) mais l'idée est que chaque école soit rattachée à une préfecture/ville.

Il y'a 33 préfectures en Guinée (en tout cas a l'heure j'écris ces lignes), et vous savez tous que la flemme est la première qualité par défaut chez tout développeur qui se respecte donc nous n'allons absolument pas rajouter manuellement toutes ces données.

Dans notre table prefectures nous n'aurons que deux champs: id, et le nom qui va, évidemment représenter le nom de la préfecture. Donc, nous avons:

Vous pouvez télécharger le fichier excel ici. Ce fichier contient 34 lignes, les 33 préfectures et la zone spéciale de Conakry.

Commençons par créer un nouveau projet Laravel qu'on va appeler Laravel-excel:

composer create-project --prefer-dist laravel/laravel Laravel-excel

Créons notre migration Prefecture en tapant la commande suivante:

php artisan make:model Prefecture -m

Le schéma est représenté comme suit:

Schema::create('prefectures', function (Blueprint $table) {
           $table->id();
           $table->string("nom")->unique();
           $table->timestamps();
       }); 

En fonction de notre contexte, nous pouvons decider de quelle façon nous allons insérer les données dans la base de données. Dans ce tutoriel nous allons passer par les seeders au lieu d'importer le fichier excel via un formulaire mais à le code que nous écrirons sera valable dans les deux cas.

Tapons la commande suivante pour créer un seeder qui va nous permettre d’insérer les données:

php artisan make:seeder PrefectureSeeder

Maintenant installons la librairie qui nous permettre de manipuler un fichier excel:

composer require rap2hpoutre/fast-excel

Allons dans le répertoire App\ et créons un dossier qu'on va nommer: service et créons une autre class qu'on va appeler PrefectureImportService

Cette classe App\Service\ PrefectureImportService.class nous permettra d'importer les données. Nous allons créer une fonction qu'on va appeler: readExcelFile

Il faudra qu'on définisse la façon dont nous allons nommer nos colonnes parce que c'est grace à elles qu'on identifiera nos données. Dans le fichier excel que je vous ai fourni plus haut, vous remarquerez que le nom de la colonne est Préfecture si on fournit un autre fichier excel avec une colonne "préFectures" ça ne marchera pas dans notre cas. C'est toujours possible de contourner cela mais le plus on essaie d'avoir un format de données bien défini.

Notre fonction readExcelFile prendra en paramètre le chemin du fichier excel:

 public function readExcelFile($path)
 {
 }

Vérifions si le paramètre path n'est pas null et est bel et bien un fichier.

if (!empty($path) && is_file($path))
{

}

Créons une variable qui va representer notre colonne Préfecture,

$COLUMN_PREFECTURE = "Préfecture";

À noter que la valeur doit être identique au nom de la colonne du fichier excel.

Maintenant importons le fichier excel:

php use Rap2hpoutre\FastExcel\Facades\FastExcel;

FastExcel::import($path, function ($data) use ($COLUMN_PREFECTURE)
{

 });

Expliquons ce bout de code: Nous avons appelé la fonction import qui est une static de la classe FastExcel. Cette fonction prendre deux paramètres: le chemin du fichier excel path et un callback function ($data).

La variable $data est un tableau contenant a chaque itération une ligne du fichier excel. Dans ce cas présent, lors de la première iteration $data contiendra:

array:1 [
  "Préfecture" => "Boffa"
]

Préfecture est le nom de la colonne et Boffa la ligne correspondant à la colonne Préfecture.

Si par exemple notre fichier excel avait deux colonnes: Préfecture et Région, $data vaudra à la première itération:

array:2 [
  "Préfecture" => "Boffa",
  "Région"    => "Boké"               
]

$data étant un tableau, pour accéder au nom de la préfecture actuelle, il suffit de faire:

$data[$COLUMN_PREFECTURE]

Maintenant il suffit de verifier si le nom de la préfecture est bel et bien renseigné puis on insère les données.

if (isset($data[$COLUMN_PREFECTURE]))
  {
       $prefecture = new Prefecture();
       $prefecture->nom = $data[$COLUMN_PREFECTURE];

       $prefecture->save();
  }

Au final, notre PrefectureImportService ressemblera à ceci:


namespace App\service;

use App\Models\Prefecture;
use Rap2hpoutre\FastExcel\Facades\FastExcel;

class PrefectureImportService
{

    public function readExcelFile($path)
    {
        if (!empty($path) && is_file($path)) {
            $COLUMN_PREFECTURE = "Préfecture";

            FastExcel::import($path, function ($data) use ($COLUMN_PREFECTURE) {


                if (isset($data[$COLUMN_PREFECTURE])) {
                    $prefecture = new Prefecture();
                    $prefecture->nom = $data[$COLUMN_PREFECTURE];

                    $prefecture->save();
                }

            });
        }

    }

}

N'oublions pas de rajouter cette ligne de code dans Database/Seeders/DatabaseSeeder.php afin de seeder nos données

$this->call(PrefectureSeeder::class);

Maintenant créons un controller HomeController.php et retournons la liste des prefectures dans la vue welcome.

 public function index()
 {
     $prefectures = Prefecture::get();
     return view('welcome', compact('prefectures'));
}

Dans web.php, nous aurons ceci:

Route::get('/', [HomeController::class, 'index']);

Et dans la vue welcome.blade.php, on affiche simplement la liste des préfectures:

<div
    class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
    <div class="relative overflow-x-auto shadow-md sm:rounded-lg" style="color: white">
        @if(count($prefectures))
            <ul>
                @foreach($prefectures as $prefecture)
                    <li>{{ $prefecture->nom }}</li>
                @endforeach
            </ul>
        @else
            <h1>Aucune donnée </h1>
        @endif

    </div>
</div>

N'oublier pas de configurer le fichier .env pour la connexion à la base de données. On va migrer nos tables en exécutant la commande suivante: php artisan migrate Puis on va maintenant seeder la base avec ceci: php artisan db:seed Maintenant lançons le serveur: php artisan serve Rendez-vous sur l'adresse suivante pour voir la liste des 34 villes de la Guinée. http://127.0.0.1:8000/.

On peut toujours utiliser un formulaire pour lire le fichier, il vous suffira de créer le formulaire et dans votre votre controller, il faudra juste appeler fonction readExcelFile de notre service PrefectureImportService.php en lui donnant le chemin du fichier excel.

Le code source est disponible ici.

J’espère que vous auriez appris quelque chose avec ce tutoriel.

Merci à vous.

Mes articles:


Partage ce tutoriel


Merci à

Diallo Mamoudou

Continue de lire

Discussion

Tu dois être connecté pour participer à la discussion. Me connecter.