Fitur export data ke Excel adalah salah satu permintaan yang sangat umum dalam pengembangan aplikasi web, terutama untuk kebutuhan laporan, analisis, atau migrasi data. Di ekosistem Laravel yang luas, ada banyak cara untuk melakukannya, tetapi salah satu yang paling efisien, populer, dan developer-friendly adalah menggunakan package Maatwebsite/Laravel-Excel.
Sebagai seorang developer yang sering berkutat dengan pengelolaan data dan kebutuhan klien, saya pribadi sangat mengandalkan package ini. Bukan hanya karena kemudahannya, tapi juga karena performa dan fitur-fitur canggih yang ditawarkannya, seperti export data besar dengan chunking, custom styling, atau bahkan multiple sheets dalam satu file Excel.
Artikel ini akan memandu Anda langkah demi langkah tentang cara membuat fitur export Excel di Laravel menggunakan Maatwebsite/Laravel-Excel. Kita akan mulai dari instalasi, membuat export class sederhana, hingga integrasi ke controller dan view Anda.
Mengapa Fitur Export Excel Penting untuk Aplikasi Web?
Dalam praktiknya, data di database seringkali perlu diakses dan dianalisis di luar aplikasi. Entah itu untuk laporan keuangan bulanan, daftar inventaris, data pelanggan untuk marketing, atau sekadar backup. Format Excel (.xlsx atau .csv) adalah standar de facto di banyak industri karena kemudahan penggunaannya oleh non-teknisi dan kompatibilitasnya dengan berbagai software analisis data.
Banyak developer pemula mungkin berpikir export Excel itu rumit, melibatkan manipulasi file binary secara manual. Namun, dengan tool yang tepat seperti Maatwebsite/Laravel-Excel, proses ini menjadi sangat sederhana dan elegan, layaknya filosofi Laravel itu sendiri.
Mengenal Maatwebsite/Laravel-Excel
Maatwebsite/Laravel-Excel adalah package yang dibangun di atas pustaka PHPSpreadsheet. Package ini menyediakan API yang sangat intuitif dan Laravel-friendly untuk mengelola import dan export file Excel serta CSV. Dengan integrasi yang mendalam ke ekosistem Laravel, Anda bisa menggunakan Eloquent model, query builder, atau array data untuk di-export menjadi spreadsheet.
Kelebihan utama package ini:
- Sintaks Elegance: Sesuai gaya Laravel.
- Performa: Mampu menangani data dalam jumlah besar dengan chunking.
- Fitur Lengkap: Export dari Eloquent, Collection, Array, Query Builder, multiple sheets, custom styling, dll.
- Komunitas Aktif: Dokumentasi lengkap dan banyak dukungan.
Langkah 1: Instalasi Maatwebsite/Laravel-Excel
Langkah pertama adalah menginstal package ini ke project Laravel Anda. Buka terminal di root project Laravel Anda dan jalankan perintah Composer berikut:
composer require maatwebsite/excel
Setelah instalasi selesai, jika Anda menggunakan Laravel 5.5 ke atas (yang sudah mendukung Package Auto-Discovery), Anda tidak perlu lagi menambahkan service provider atau alias secara manual. Laravel akan secara otomatis menemukan dan mendaftarkan package ini. Namun, jika Anda menggunakan versi yang lebih lama atau ingin melakukan konfigurasi lebih lanjut, Anda bisa mem-publish file konfigurasi:
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
Perintah ini akan membuat file config/excel.php. Di file ini, Anda bisa mengatur berbagai opsi default, seperti disk penyimpanan untuk file sementara, jenis reader/writer default, dan lain-lain.
Langkah 2: Membuat Export Class Sederhana
Dalam Maatwebsite/Laravel-Excel, logika untuk export data dibungkus dalam sebuah “Export Class”. Class ini bertanggung jawab untuk menentukan data apa yang akan diexport, bagaimana kolom-kolomnya akan dinamai, dan fitur-fitur kustom lainnya. Anda bisa membuat export class baru menggunakan perintah Artisan:
php artisan make:export UsersExport --model=User
Perintah ini akan membuat file app/Exports/UsersExport.php dan secara otomatis mengimplementasikan interface FromCollection (karena kita menambahkan --model=User) atau FromArray jika Anda tidak menyertakan --model. Isi file UsersExport.php akan terlihat seperti ini:
<?php
namespace App\Exports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;
class UsersExport implements FromCollection
{
/
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return User::all();
}
}
Mari kita bedah kodenya:
namespace App\Exports;Ini adalah namespace untuk export class Anda.use App\Models\User;Mengimpor model User yang akan kita export.use Maatwebsite\Excel\Concerns\FromCollection;Ini adalah interface yang memberitahu package bahwa data akan diambil dari sebuah Collection.public function collection(): Method ini wajib ada ketika mengimplementasikanFromCollection. Di sinilah Anda mendefinisikan data yang akan diexport. Dalam contoh ini, kita mengambil semua user dari database.
Kustomisasi Kolom Heading
Secara default, jika Anda export dari Eloquent model, nama kolom di Excel akan sesuai dengan nama atribut di model/database. Jika Anda ingin kustomisasi heading atau urutan kolom, Anda bisa mengimplementasikan interface WithHeadings. Mari kita modifikasi UsersExport.php:
<?php
namespace App\Exports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class UsersExport implements FromCollection, WithHeadings
{
public function collection()
{
// Kita hanya mengambil kolom yang ingin kita tampilkan
return User::select('id', 'name', 'email', 'created_at')->get();
}
public function headings(): array
{
return [
'#',
'Nama Lengkap',
'Email Pengguna',
'Tanggal Daftar',
];
}
}
Perhatikan beberapa perubahan di atas:
- Kita menambahkan
WithHeadingske daftar implementasi interface. - Method
headings()baru ditambahkan, yang mengembalikan array string untuk nama-nama kolom heading. - Di method
collection(), kita sekarang secara eksplisit memilih kolomid,name,email, dancreated_at. Ini penting agar jumlah kolom yang diambil sesuai dengan jumlah heading yang kita definisikan.
Langkah 3: Mengintegrasikan ke Controller dan Route
Setelah export class siap, saatnya menghubungkannya ke aplikasi Laravel Anda. Kita akan membuat sebuah method di controller yang akan memicu proses export.
Buat controller baru (jika belum ada) atau gunakan controller yang sudah ada, misalnya UserController:
php artisan make:controller UserController
Kemudian, buka file app/Http/Controllers/UserController.php dan tambahkan method export():
<?php
namespace App\Http\Controllers;
use App\Exports\UsersExport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class UserController extends Controller
{
public function export()
{
return Excel::download(new UsersExport, 'users.xlsx');
}
}
Di controller ini:
- Kita mengimpor
UsersExportclass yang telah kita buat. - Kita juga mengimpor facade
Exceldari Maatwebsite/Laravel-Excel. - Method
Excel::download()adalah intinya. Ia menerima dua argumen: instance dari export class Anda (new UsersExport) dan nama file output ('users.xlsx'). Package akan otomatis membuat file Excel dan mengirimkannya sebagai respons download ke browser.
Selanjutnya, daftarkan route untuk method ini di file routes/web.php:
use App\Http\Controllers\UserController;
Route::get('/users/export', [UserController::class, 'export'])->name('users.export');
Sekarang, jika Anda mengakses URL /users/export di browser Anda, sebuah file users.xlsx akan secara otomatis ter-download!
Langkah 4: Menambahkan Tombol Export di View
Agar pengguna dapat dengan mudah melakukan export, kita perlu menambahkan tombol di tampilan aplikasi Anda. Misalnya, di file resources/views/users.blade.php (atau di mana pun daftar user Anda ditampilkan):
<a href="{{ route('users.export') }}" class="btn btn-success">Export Data User ke Excel</a>
Pastikan Anda sudah memiliki Bootstrap atau styling CSS yang sesuai untuk kelas btn dan btn-success jika Anda menggunakannya. Dengan ini, pengguna cukup mengklik tombol tersebut untuk mendownload data user.
Fitur Lanjutan: Export Data dari Multiple Sheets
Terkadang, Anda mungkin perlu mengekspor beberapa jenis data ke dalam satu file Excel, namun di sheet yang berbeda. Maatwebsite/Laravel-Excel mempermudah ini dengan interface WithMultipleSheets.
Buat satu export class utama yang akan mengelola beberapa sheet. Contoh: CombinedDataExport.php
php artisan make:export CombinedDataExport
Modifikasi CombinedDataExport.php:
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class CombinedDataExport implements WithMultipleSheets
{
use Exportable;
public function sheets(): array
{
$sheets = [];
// Tambahkan sheet untuk User
$sheets[] = new UsersExport(); // UsersExport harus mengimplementasikan WithTitle
// Tambahkan sheet lain, misalnya ProductsExport (anda perlu membuat class ini sendiri)
// $sheets[] = new ProductsExport();
return $sheets;
}
}
Agar setiap sheet memiliki judul, export class seperti UsersExport Anda perlu mengimplementasikan interface WithTitle:
<?php
namespace App\Exports;
// ... kode lainnya
use Maatwebsite\Excel\Concerns\WithTitle;
class UsersExport implements FromCollection, WithHeadings, WithTitle
{
// ... method collection() dan headings()
public function title(): string
{
return 'Data Pengguna';
}
}
Sekarang di controller Anda, panggil CombinedDataExport:
public function exportCombinedData()
{
return Excel::download(new CombinedDataExport, 'combined_data.xlsx');
}
Dengan cara ini, Anda bisa menyajikan data yang terstruktur dengan baik dalam satu file Excel.
Mengatur Format dan Styling
Maatwebsite/Laravel-Excel juga memungkinkan Anda untuk mengatur styling sel, lebar kolom, format angka, dan lainnya. Anda bisa mengimplementasikan interface seperti WithStyles, ShouldAutoSize, WithColumnWidths, dan lainnya.
Contoh dengan WithStyles untuk membuat heading menjadi bold:
<?php
namespace App\Exports;
// ... kode lainnya
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class UsersExport implements FromCollection, WithHeadings, WithTitle, WithStyles
{
// ... method collection() dan headings() dan title()
public function styles(Worksheet $sheet)
{
return [
// Styling untuk baris pertama (headings)
1 => ['font' => ['bold' => true]],
];
}
}
Anda bisa mengeksplorasi dokumentasi resmi Maatwebsite/Laravel-Excel untuk lebih banyak opsi styling dan formatting. Ini sangat membantu untuk laporan yang profesional.
Export dengan Query Builder (untuk Data Besar)
Untuk dataset yang sangat besar (ribuan hingga jutaan baris), mengambil semua data ke dalam memory menggunakan User::all() atau ->get() bisa menyebabkan masalah memori atau timeout. Dalam kasus ini, Anda bisa menggunakan interface FromQuery.
Modifikasi UsersExport.php:
<?php
namespace App\Exports;
use App\Models\User;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
// ... interface lainnya jika diperlukan
class UsersExport implements FromQuery, WithHeadings, WithMapping
{
public function query()
{
// Mengembalikan instance Query Builder
return User::query()->select('id', 'name', 'email', 'created_at');
}
public function headings(): array
{
return [
'#',
'Nama Lengkap',
'Email Pengguna',
'Tanggal Daftar',
];
}
public function map($user): array
{
// Ini akan memetakan setiap baris dari query ke format yang diinginkan
// Sangat berguna jika ada logika formatting khusus
return [
$user->id,
$user->name,
$user->email,
$user->created_at->format('d/m/Y H:i'), // Contoh formatting tanggal
];
}
}
Dengan FromQuery, package akan secara otomatis melakukan chunking, mengambil data sedikit demi sedikit, sehingga penggunaan memori lebih efisien. Tambahan WithMapping memungkinkan Anda mengontrol data per kolom secara lebih granular, misalnya untuk memformat tanggal atau menambahkan logika kondisional.
Masalah yang Sering Terjadi
Meskipun Maatwebsite/Laravel-Excel cukup robust, ada beberapa masalah umum yang sering dihadapi developer saat mengimplementasikannya:
1. Masalah Memori (Allowed memory size exhausted)
Gejala: Aplikasi error dengan pesan “Allowed memory size of X bytes exhausted”.
Penyebab: Ini terjadi ketika Anda mencoba mengekspor dataset yang sangat besar dengan mengambil semua data sekaligus ke dalam memori (misalnya menggunakan User::all()).
Solusi: Gunakan interface FromQuery. Seperti yang dijelaskan di atas, FromQuery akan otomatis melakukan chunking data, sehingga data diproses dan ditulis ke file sedikit demi sedikit, mengurangi beban memori secara drastis.
2. Data Tidak Sesuai (Missing Columns, Wrong Order, Incorrect Headings)
Gejala: File Excel ter-download, tetapi kolomnya tidak lengkap, urutannya salah, atau heading tidak sesuai.
Penyebab: Ketidaksesuaian antara kolom yang diambil dari database (di method collection() atau query()) dengan jumlah atau urutan heading yang didefinisikan di method headings().
Solusi: Pastikan Anda menggunakan select() di query Anda untuk memilih kolom yang spesifik dan urutannya sama persis dengan yang Anda definisikan di headings(). Jika menggunakan WithMapping, pastikan array yang dikembalikan dari map() memiliki jumlah elemen dan urutan yang benar.
3. File Excel Corrupt atau Tidak Bisa Dibuka
Gejala: File yang di-download tidak bisa dibuka oleh Excel atau muncul pesan error “file corrupt”.
Penyebab: Biasanya disebabkan oleh output tambahan yang tidak diinginkan sebelum atau sesudah file Excel dihasilkan. Ini bisa berupa spasi kosong, karakter tersembunyi, atau error PHP yang tidak tertangani dan tercetak ke output.
Solusi: Pastikan tidak ada spasi kosong di luar tag <?php dan ?> di file PHP mana pun. Periksa juga file .env Anda untuk spasi kosong atau karakter tidak valid. Pastikan juga error reporting tidak mencetak pesan error ke output yang mengganggu format file Excel. Dalam lingkungan produksi, matikan APP_DEBUG.
4. Time Limit Exceeded
Gejala: Browser menampilkan error timeout sebelum file selesai di-download.
Penyebab: Proses export data memakan waktu terlalu lama, melebihi batas waktu eksekusi skrip PHP.
Solusi: Tingkatkan nilai max_execution_time di php.ini Anda (misalnya menjadi 300 atau 600 detik). Untuk proses yang sangat panjang, pertimbangkan untuk menjalankan export di background menggunakan queue Laravel. Ini adalah solusi paling robust untuk proses yang intensif.
Pengalaman dan Pertimbangan Praktis
Sebagai praktisi, ada beberapa hal yang saya perhatikan saat mengimplementasikan fitur export Excel:
1. Validasi Data dan Filter
Seringkali, pengguna ingin mengekspor data berdasarkan kriteria tertentu (tanggal, status, kategori). Pastikan controller Anda menerima parameter filter dan meneruskannya ke export class. Misalnya, Anda bisa menambahkan constructor ke export class untuk menerima parameter filter:
class UsersExport implements FromQuery, WithHeadings
{
protected $startDate;
protected $endDate;
public function __construct($startDate, $endDate)
{
$this->startDate = $startDate;
$this->endDate = $endDate;
}
public function query()
{
return User::query()
->whereBetween('created_at', [$this->startDate, $this->endDate]);
}
}
Kemudian di controller:
public function export(Request $request)
{
$startDate = $request->input('start_date');
$endDate = $request->input('end_date');
return Excel::download(new UsersExport($startDate, $endDate), 'users.xlsx');
}
2. Performa untuk Dataset Sangat Besar
Untuk dataset yang benar-benar masif (jutaan baris), bahkan FromQuery dengan chunking masih bisa memakan waktu lama dan berpotensi timeout di browser. Solusi terbaik adalah menjalankannya sebagai Job di Queue Laravel.
Pengguna dapat memicu export, dan prosesnya berjalan di background. Setelah selesai, pengguna bisa mendapatkan notifikasi atau link download melalui email atau di dashboard aplikasi. Ini adalah pendekatan yang lebih skalabel dan memberikan pengalaman pengguna yang lebih baik untuk laporan besar.
3. Keamanan Data
Pastikan hanya pengguna yang berwenang yang dapat melakukan export data sensitif. Gunakan Laravel Gates atau Policies untuk membatasi akses ke route export Anda.
Route::get('/users/export', [UserController::class, 'export'])
->middleware('can:export-users')
->name('users.export');
Atau di dalam controller:
public function export()
{
$this->authorize('export-users');
return Excel::download(new UsersExport, 'users.xlsx');
}
4. User Experience
Saat proses export data besar berjalan, berikan indikasi kepada pengguna bahwa proses sedang berlangsung (misalnya, tombol menjadi “Loading…” atau muncul spinner). Jika menggunakan queue, berikan pesan bahwa laporan sedang diproses dan akan tersedia nanti. Hindari membuat pengguna menunggu tanpa feedback.
FAQ
Apakah Maatwebsite/Laravel-Excel bisa export ke CSV?
Ya, tentu saja. Anda cukup mengganti ekstensi file di method Excel::download() menjadi .csv. Contoh: return Excel::download(new UsersExport, 'users.csv');
Bagaimana cara mengatur encoding saat export ke CSV?
Anda bisa mengaturnya di file konfigurasi config/excel.php di bagian csv.delimiter dan csv.enclosure. Untuk encoding, package ini umumnya sudah cukup baik dalam menangani UTF-8.
Bisakah saya export data tanpa model Eloquent?
Ya, Anda bisa menggunakan interface FromArray atau FromCollection dan mengembalikan array atau collection data secara manual, bukan dari model Eloquent. Ini berguna jika data Anda berasal dari sumber lain atau sudah diolah sebelumnya.
Apakah ada batasan jumlah baris yang bisa diexport?
Secara teori tidak ada, namun secara praktis sangat dibatasi oleh sumber daya server (memori dan waktu eksekusi). Untuk data sangat besar, selalu gunakan FromQuery dan pertimbangkan menjalankan di background via Queue.
Kesimpulan
Fitur export Excel adalah kebutuhan esensial di banyak aplikasi web modern. Dengan Maatwebsite/Laravel-Excel, Anda tidak perlu lagi pusing memikirkan detail kompleks pembuatan file spreadsheet. Package ini menawarkan solusi yang elegan, performa tinggi, dan mudah diintegrasikan dengan aplikasi Laravel Anda.
Dari instalasi sederhana hingga penanganan dataset besar dengan FromQuery dan kustomisasi styling, package ini memiliki semua yang Anda butuhkan. Ingatlah untuk selalu mempertimbangkan aspek performa, keamanan, dan pengalaman pengguna saat mengimplementasikan fitur ini, terutama untuk kebutuhan skala enterprise. Dengan panduan ini, Anda sekarang memiliki fondasi yang kuat untuk menambahkan kemampuan export Excel di project Laravel Anda.
TAGS: Laravel, Export Excel, Maatwebsite, PHP, Web Development, Productivity, Developer Tools, Coding Tutorial


