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
- Laravel: https://laravel.com/
- Laravel/Excel: https://laravel-excel.com/
- Codice su Github: https://github.com/SviluppoK/laravel-csv-upload-1




Lascia un commento