Day 23 โ Export Data ke Excel dengan Laravel Excel โ
Fase: 3 โ Fitur Lanjutan | Minggu: 5 | Hari: Rabu
๐ฏ Tujuan Hari Ini โ
- Menginstal dan mengkonfigurasi package Maatwebsite Laravel Excel.
- Membuat Export Class untuk data aset dan data peminjaman.
- Mengimplementasikan tombol "Download Excel" yang berfungsi.
- Memahami konsep Exportable, FromQuery, dan WithHeadings di Laravel Excel.
๐ Penjelasan: Mengapa Export Excel? โ
Di dunia kerja, pengelola aset sering membutuhkan data dalam format Excel untuk:
- Laporan bulanan kepada pimpinan.
- Rekap audit aset yang perlu diperiksa.
- Analisis lanjutan menggunakan Microsoft Excel atau Google Sheets.
Package Maatwebsite Laravel Excel (alias laravel-excel) adalah standar industri untuk keperluan ini di ekosistem Laravel.
๐ง Step-by-Step โ
Step 1: Install Package Laravel Excel โ
bash
composer require maatwebsite/excelSetelah instalasi selesai, publish konfigurasi (opsional):
bash
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=configStep 2: Buat Export Class untuk Aset โ
bash
php artisan make:export AssetsExport --model=AssetEdit file yang dibuat:
php
// app/Exports/AssetsExport.php
namespace App\Exports;
use App\Models\Asset;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class AssetsExport implements FromQuery, WithHeadings, WithMapping, WithStyles
{
// FromQuery: data diambil dari query Eloquent (lebih efisien dari collection)
public function query()
{
return Asset::query()->with('category')->latest();
}
// WithHeadings: menentukan baris header di Excel
public function headings(): array
{
return [
'No.',
'Nama Aset',
'Kategori',
'Stok',
'Kondisi',
'Deskripsi',
'Tanggal Dibuat',
];
}
// WithMapping: mentransformasi setiap row data sebelum dimasukkan ke Excel
public function map($asset): array
{
static $no = 1; // nomor urut
return [
$no++,
$asset->name,
$asset->category->name ?? '-',
$asset->stock,
ucfirst($asset->condition), // "good" โ "Good"
$asset->description ?? '-',
$asset->created_at->format('d/m/Y'),
];
}
// WithStyles: styling untuk header agar lebih rapi
public function styles(Worksheet $sheet)
{
return [
// Baris 1 (header) โ bold
1 => ['font' => ['bold' => true]],
];
}
}Step 3: Buat Export Class untuk Peminjaman โ
bash
php artisan make:export LoansExport --model=Loanphp
// app/Exports/LoansExport.php
namespace App\Exports;
use App\Models\Loan;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
class LoansExport implements FromQuery, WithHeadings, WithMapping
{
public function query()
{
return Loan::query()->with('asset')->latest();
}
public function headings(): array
{
return [
'No.',
'Nama Peminjam',
'Nama Aset',
'Jumlah Pinjam',
'Tanggal Pinjam',
'Tanggal Kembali',
'Status',
];
}
public function map($loan): array
{
static $no = 1;
return [
$no++,
$loan->borrower_name,
$loan->asset->name ?? '-',
$loan->quantity,
$loan->loan_date->format('d/m/Y'),
$loan->return_date ? $loan->return_date->format('d/m/Y') : 'Belum dikembalikan',
ucfirst($loan->status),
];
}
}Step 4: Tambahkan Route Export โ
php
// routes/web.php
use App\Exports\AssetsExport;
use App\Exports\LoansExport;
use Maatwebsite\Excel\Facades\Excel;
Route::get('/assets/export/excel', function () {
return Excel::download(new AssetsExport, 'daftar-aset-' . date('Ymd') . '.xlsx');
})->name('assets.export.excel');
Route::get('/loans/export/excel', function () {
return Excel::download(new LoansExport, 'laporan-peminjaman-' . date('Ymd') . '.xlsx');
})->name('loans.export.excel');NOTE
Untuk aplikasi yang lebih besar, sebaiknya pindahkan logika ini ke dalam AssetController atau LoanController, bukan langsung di route closure.
Step 5: Tambahkan Tombol Export di Blade โ
html
{{-- resources/views/assets/index.blade.php --}}
<div class="d-flex justify-content-between align-items-center mb-3">
<h1>Daftar Aset</h1>
<div class="d-flex gap-2">
<a href="{{ route('assets.create') }}" class="btn btn-primary">
+ Tambah Aset
</a>
<a href="{{ route('assets.export.excel') }}" class="btn btn-success">
<i class="bi bi-file-earmark-excel"></i> Export Excel
</a>
</div>
</div>๐งช Uji Coba Mandiri โ
- [ ] Kunjungi halaman
/assetsโ klik tombol "Export Excel" โ file.xlsxter-download. - [ ] Buka file Excel yang ter-download โ pastikan header dan data terisi dengan benar.
- [ ] Pastikan kolom "Kategori" menampilkan nama kategori (bukan ID).
- [ ] Pastikan nama file mengandung tanggal hari ini (misal:
daftar-aset-20260401.xlsx). - [ ] Lakukan hal yang sama untuk export data peminjaman.
๐ Ringkasan Fitur Laravel Excel โ
| Interface | Fungsi |
|---|---|
FromCollection | Data dari Laravel Collection |
FromQuery | Data dari Eloquent Query (lebih efisien) |
WithHeadings | Menambahkan baris header |
WithMapping | Mentransformasi tiap baris data |
WithStyles | Styling sel di spreadsheet |
WithChunkReading | Untuk export data sangat besar (chunking) |
TIP
Untuk data yang sangat banyak (ribuan baris), gunakan Queue Export agar tidak membuat request timeout. Pelajari ShouldQueue di dokumentasi Laravel Excel.