Artikel kali ini akan menjelaskan mengenai cara melakukan export data menjadi file excel pada Laravel 5.5. Dalam tutorial ini saya akan menggunakan package Laravel Excel yang sudah tersedia untuk melakukan hal tersebut yang dapat diakses pada link berikut ini https://github.com/Maatwebsite/Laravel-Excel. Berikut ini adalah langkah-langkah yang perlu dilakukan :
#INSTALASI
Cara instalasi nya adalah dengan menambahkan package pada composer.json atau dengan cara mengetikkan perintah berikut pada command prompt direktori program yang anda buat.
composer require maatwebsite/excel
Pada saat artikel ini ditulis versi terbaru dari package ini adalah menggunakan versi 3.1. Setelah selesai mendownload package tersebut bukalah file app.php yang terdapat di dalam direktori config dan tambahkan baris berikut
'providers' => [
/*
* Package Service Providers...
*/
Maatwebsite\Excel\ExcelServiceProvider::class,
]
Tambahkah kode di atas pada bagian providers dan kemudian tambahkan kode di bawah ini pada bagian aliases
'aliases' => [
...
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
Kode di atas yang pertama adalah untuk menambahkan ServiceProvider dan yang kedua adalah untuk menambahkan Facade yang sekali lagi semuanya terletak pada file config/app.php. Dan yang terakhir adalah jalankan perintah artisan berikut pada command prompt.
php artisan vendor:publish
Kode di atas akan menambahkan file config baru yaitu excel.php di dalam direktori config.
#CARA PENGGUNAAAN
Pada tutorial kali ini saya hanya menjelaskan bagaimana cara melakukan export saja sesuai dengan judul dari artikel. Walaupun sebenarnya package ini sudah mendukung fitur untuk melakukan import data juga. Untuk melakukan export data menjadi file excel dapat dilakukan dengan beberapa cara sebagai berikut :
#From Collection
Cara pertama adalah dengan menggunakan FromCollection. Cara ini adalah cara yang paling sederhana dari ketiga cara yang akan saya jelaskan dalam artikel ini. Buatlah direktori Exports di dalam direktori app. Kemudian buatlah file PesertaExport.php di dalam direktori Exports tersebut. Saya menggunakan nama PesertaExport karena saya menggunakan model Peserta sebagai datanya. Penamaan file di dalam direktori Exports ini dapat disesuaikan dengan penamaan file yang biasa anda gunakan.
<?php
namespace App\Exports;
use App\Model\Peserta;
use Maatwebsite\Excel\Concerns\FromCollection;
class PesertaExport implements FromCollection
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return Peserta::select('nama','nik')->get();
}
}
Pada contoh kode di atas saya hanya ingin menampilkan field nama dan nik saja sehingga saya menggunakan perintah select. Jika anda ingin menampilkan semua data maka anda juga dapat menggunakan perintah sebagai berikut
return Peserta::all();
Kode yang digunakan di sini sama dengan Eloquent pada Laravel seperti biasanya. Namun kelemahan dari FromCollection ini adalah tidak bisa menggunakan filter query berdasarkan parameter inputan dari program. Mungkin saya yang tidak tahu bagaimana cara menggunakannya namun ketika saya mencoba menggunakan kode yang sama dari cara-cara lainnya (di mana pada cara-cara lain tersebut kode saya dapat berjalan dengan baik) muncul error. Masalah filter ini nanti akan saya jelaskan pada cara-cara selain FromCollection di bawah ini.
Langkah selanjutnya adalah membuat route serta Controller dan Action yang diperlukan. Kode di bawah adalah contoh route dan contoller yang saya buat.
Route::get('/excel','ExcelController@export');
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers;
use App\Exports\PesertaExport;
use Excel;
class ExcelController extends Controller {
public function export()
{
return Excel::download(new PesertaExport, 'peserta.xlsx');
}
}
Di dalam file controller yang anda gunakan jangan lupa untuk menggunakan use dari Export yang anda buat tadi dan juga use Excel sebagai package yang digunakan. Perintah untuk melakukan export data ke excel adalah download dengan parameter file Export sebagai querynya dan kemudian nama file excel hasil download sesuai dengan contoh kode di atas.
#From Query
Cara kedua adalah dengan menggunakan From Query. Dengan menggunakan cara ini saya bisa menambahkan filter pada query sesuai dengan parameter dari url atau form. Buatlah sebuah file di dalam direktori Exports sama seperti sebelumnya. Kali ini saya memberi nama PesertaQueryExport.php dan berikut ini adalah isi dari file tersebut.
<?php
namespace App\Exports;
use App\Model\Peserta;
use Maatwebsite\Excel\Concerns\FromQuery;
class PesertaQueryExport implements FromQuery
{
public function __construct(string $name, string $bagian)
{
$this->name = $name;
$this->bagian = $bagian;
}
public function query()
{
return Peserta::query()->select('nama','nik')->where('nama','like', '%'.$this->name.'%')->where('bagian', 'like', '%'.$this->bagian.'%');
}
}
Cara penulisan kode dengan metode From Query ini berbeda dengan cara From Collection sebelumnya. Perbedaan terletak pada use yang digunakan, implements serta nama function yang digunakan. Dalam contoh kode di atas saya menerapkan filter nama dan bagian pada querynya yang diset pada function __construct dan kemudian nilai dari variabel tersebut diterapkan dalam query.
Seperti sebelumnya, hal selanjutnya yang perlu anda lakukan adalah membuat route dan controllernya. Berikut ini adalah contoh route dan controller yang saya buat.
Route::get('/excel-query','ExcelController@export_query');
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers;
use App\Exports\PesertaQueryExport;
use Excel;
class ExcelController extends Controller {
public function export_query(Request $request)
{
return Excel::download(new PesertaQueryExport($request->name, $request->bagian), 'peserta_query.xlsx');
}
}
Dalam contoh kode di atas saya sengaja memberikan route dan nama action yang berbeda untuk membedakan antara From Collection dengan From Query ini. Contoh kasus dari penerapan filter di sini misalnya ketika anda megakses url berikut :
http://localhost/namaproject/public/excel-query?name=a&bagian=b
Parameter name dan bagian akan diambil dan dikirim menuju ke PesertaQueryExport dan kemudian program akan memproses data sesuai dengan query yang dibuat pada file Export di atas. Jumlah parameter yang dikirim dapat anda sesuaikan dengan kebutuhan, misalnya anda membuat program untuk mencetak laporan dengan rentang tanggal tertentu dan status tertentu maka parameter yang dibutuhkan adalah tanggal awal, tanggal akhir, dan status.
#From View
Cara terakhir yang akan saya jelaskan adalah From View. Cara ini, sesuai dengan namanya akan melakukan export file excel sesuai dengan blade view yang anda buat. Langkah pertama masih sama seperti cara-cara sebelumnya adalah membuat file di dalam direktori Exports terlebih dahulu.
<?php
namespace App\Exports;
use App\Model\Peserta;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromView;
class PesertaViewExport implements FromView
{
public function __construct(string $name, string $bagian)
{
$this->name = $name;
$this->bagian = $bagian;
}
public function view(): View
{
return view('exports.peserta', [
'data' => Peserta::where('nama','like', '%'.$this->name.'%')->where('bagian', 'like', '%'.$this->bagian.'%')->get()
]);
}
}
Kode di atas mirip dengan kode pada cara From Query. Saya juga menggunakan contoh filter sama seperti cara sebelumnya. Langkah berikunya adalah membuat file blade dengan nama dan letak sesuai dengan kode yang anda tulis di dalam file Export di atas. Dalam contoh ini saya membuat file peserta.blade.php dan saya letakkan dalam direktori resources/views/exports. Berikut ini adalah isi dari file blade tersebut :
<table>
<thead>
<tr>
<th>NIK</th>
<th>Nama</th>
</tr>
</thead>
<tbody>
@foreach($data as $item)
<tr>
<td>{{ $item->NIK }}</td>
<td>{{ $item->nama }}</td>
</tr>
@endforeach
</tbody>
</table>
Isi dari file blade inilah yang nantinya akan diexport menjadi file excel. Silahkan isi file blade tersebut dengan tampilan yang sesuai dengan yang anda butuhkan. Dan langkah terakhir adalah membuat route dan juga controllernya.
Route::get('/excel-view','ExcelController@export_view');
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers;
use App\Exports\PesertaViewExport;
use Excel;
class ExcelController extends Controller {
public function export_view(Request $request)
{
return Excel::download(new PesertaViewExport($request->name, $request->bagian), 'peserta_view.xlsx');
}
}
Cara penggunaan parameter pada metode From View ini masih sama dengan cara pada metode From Query. Perbedaan dengan metode From Query adalah pada metode From View ini anda dapat memberikan header kolom sesuai dengan tabel yang anda buat pada view blade tadi. Hasil export file excel pada metode From Collection dan From Query tidak memiliki header kolom.
Demikianlah artikel Tutorial Laravel 5.5 - Melakukan Export Data ke Excel dengan Laravel Excel ini. Semoga penjelasan-penjelasan saya dapat dipahami dan terima kasih.
Tutorial Laravel 5.5 - Melakukan Export Data ke Excel dengan Laravel Excel
Reviewed by Donny Winarto
on
October 14, 2018
Rating:
Makasih banyak gan (y)
ReplyDeletetapi ada gak gan tutorial buat importnya?
belum ada :). Ide yang bagus sih. Beberapa hari ke depan coba saya bikinkan artikelnya dulu. Saya juga butuh waktu sih buat mempelajari cara importnya :)
Deletesaya coba cara yang pertama bisa di download jadi file extensi .xlsx tapi pas dibuka oleh excel extensi file format nya not valid katanya. salah dimana kira kira ?
ReplyDeletehttps://github.com/Maatwebsite/Laravel-Excel/issues/1673 coba cara dari issue di sini. Keliatannya kasusnya sama sih
DeleteKalau untuk export data yang banyak bagaimana implementasinya ?
ReplyDeleteSeberapa banyak ya? Saya belum pernah coba untuk export data sampai ratusan ribu. Data yang diexport jumlahnya sesuai dengan hasil query yang digunakan
DeleteNik nya di excel jadi acak . Gimna ya solusinya ?
ReplyDeleteCoba pake column formating. Mungkin bisa dicoba cara di sini https://github.com/Maatwebsite/Laravel-Excel/issues/1725.
ReplyDeleteKemungkinan NIK nya diconvert jadi angka sama waktu export
maaf mau nanya, misalnya returnnya bukan model::query() ? apa bisa ?
ReplyDelete