Laravel: importare files con Laravel Excel

Laravel Excel

📦 Laravel Excel è un pacchetto open-source sviluppato da Maatwebsite/Spartner che semplifica l’importazione ed esportazione di file Excel e CSV all’interno di applicazioni Laravel. È ampiamente usato per gestire grandi quantità di dati, generare report e sincronizzare database

🔧 Funzionalità principali:

  • Esportazione diretta di collezioni Laravel in Excel o CSV
  • Importazione di fogli di lavoro in modelli Eloquent
  • Supporto per lettura a blocchi e inserimenti batch
  • Integrazione con Laravel Nova per esportazioni personalizzate

In questo articolo creeremo un semplice progetto per spiegare le funzionalità base di Laravel Excel per l’importazione di un file csv in una tabella mysql.

1 – Creazione del progetto

Come prerequisito è richiesto un ambiente con mysql installato e preferibilmente anche PhpMyAdmin.

Creiamo un progetto Laravel che chiameremo Maatwebsite

composer create-project --prefer-dist laravel/laravel Maatwebsite

2 – Installazione di Laravel Excel

Installiamo il pacchetto utilizzando Composer:

composer require maatwebsite/excel

Poi andiamo a pubblicare il file di configurazione del pacchetto

php artisan vendor:publish --provider="Maatwebsite\\Excel\\ExcelServiceProvider"

Il file di configurazione sarà molto utile per tutte le personalizzazioni successive che eventualmente introdurremo. Per il momento ci limiteremo al caricamento semplice di un file excel che contiene due colonne di testo: colonna1 e colonna2

Trovate il file di esempio qui: Prova-1.csv che ha il carattere virgola come separatore.

Laravel Excel riconosce automaticamente il separatore, qui trovate la versione con il punto e virgola Prova-2.csv così potrete verificare direttamente.

3 – File di configurazione .env

Impostiamo sul file .env il database mysql:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=importCsv
DB_USERNAME=*inserisci username*
DB_PASSWORD=*insersci password*

4 – Creazione del modello dati e della migrazione

Creiamo il modello CsvData e la relativa migrazione per la tabella csv_data dove andremo ad importare il file csv:

php artisan make:model CsvData -m

E modifichiamo il fil di migrazione come segue:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('csv_data', function (Blueprint $table) {
            $table->id();
            $table->string('colonna1');
            $table->string('colonna2'); 
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('csv_data');
    }
};

Nel modelli andare ad aggiungere nel modello CsvData la proprità fillabile per i campi colonna1 e colonna2:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class CsvData extends Model
{
    protected $fillable = [
        'colonna1',
        'colonna2',
    ];
}

5 – Prima migrazione e verfiche

Eseguiamo la migrazione

php artisan migrate

Andiamo a verificare con PhpMyAdmin e troviamo il database csv_import

Proviamo anche che l’applicazione giri senza problemi

php artisan serve

E abbiamo verificato che tutto funziona.

6 – Creazione di un modello di importazione

Andiamo ora a creare un modello di importazione della classe CsvData per Laravel Excel:

php artisan make:import CsvDataImport --model=CsvData

Implementiamo la logica di importazione, modificando la classe CsvDataImport appensa creata in App\Imports:

<?php

namespace App\Imports;

use App\Models\CsvData;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class CsvDataImport implements ToModel, WithHeadingRow
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    
    public function model(array $row)
    {
        return new CsvData([
            'colonna1' => $row['colonna1'],
            'colonna2' => $row['colonna2'],
            
        ]);
    }
    
}

Apri la classe UsersImport e implementa la logica di importazione. Ad esempio:

7 – Creazione di una pagina per il caricamento

Creiamo ora una semplice pagina per il caricamento andando a creare in resources\views il file upload.blade,php

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Importa File CSV</title>
</head>

<body>
    <form action="/import" method="POST" enctype="multipart/form-data">
        @csrf
        <input type="file" name="file" required>
        <button type="submit">Importa</button>
    </form>
    @if(session('success'))
    <br>
    {!!session('success')!!}
    @endif
</body>

</html>

8 – Creazione di un Controller

Andiamo ora a creare n controller per gestire l’importazione del file CSV:

php artisan make:controller CsvImportController

Modifichiamo come segue:

<?php

namespace App\Http\Controllers;

use App\Imports\CsvDataImport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Http\Request;

class CsvImportController extends Controller
{
    public function import_form()
    {
        return view('upload');
    }


    public function import(Request $request)
    {
        Excel::import(new CsvDataImport, $request->file('file'));

        return back()->with('success', 'File importato con successo!');
    }
}

9 – Impostazione delle rotte

Nel file web.php aggiungiamo

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CsvImportController;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/import', [CsvImportController::class, 'import_form']);
Route::post('import', [CsvImportController::class, 'import']);

10 – Caricamento del file csv

Andiamo ora a testare il tutto. Se non già attivo, avviamo il server con

php artisan serve

andiamo su http://127.0.0.1:8000/import

Selezioniamo e carichiamo il file. Dopo qualche secondo possiamo vedere su PhpMYadmin che la tabella è stata regolarmente popolata

Conclusioni

Abbiamo visto come si può implementare rapidamente il caricamento di un file csv,
Tuttavia quanto presentato ha dei limiti e non è efficiente per file molto grandi. In articoli successivi andremo a vedere come migliorare e adattare l’importazione di grandi file, con caricamento asincrono, con logiche di validazioni, ecc.

Riferimenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Benvenuto

Questo blog nasce con un obiettivo semplice: rendere la programmazione e l’innovazione tecnologica accessibili e coinvolgenti per tutti. Dalle basi del coding alle ultime tendenze nel mondo dell’intelligenza artificiale, dalle guide pratiche agli approfondimenti sulle tecnologie emergenti – ogni articolo è pensato per stimolare la curiosità, semplificare i concetti e invitare alla scoperta.

💡 Qui la tecnologia non è solo per esperti. È uno spazio inclusivo, dove si impara, si sperimenta e ci si ispira… insieme.

Let’s connect