Skip to content

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/excel

Setelah instalasi selesai, publish konfigurasi (opsional):

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

Step 2: Buat Export Class untuk Aset โ€‹

bash
php artisan make:export AssetsExport --model=Asset

Edit 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=Loan
php
// 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 .xlsx ter-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 โ€‹

InterfaceFungsi
FromCollectionData dari Laravel Collection
FromQueryData dari Eloquent Query (lebih efisien)
WithHeadingsMenambahkan baris header
WithMappingMentransformasi tiap baris data
WithStylesStyling sel di spreadsheet
WithChunkReadingUntuk 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.

Program Magang SMK RPL โ€” Rekayasa Perangkat Lunak (2 Bulan)