This post is also available in:
English
Export Excel sering kita buat ketika kita membuat aplikasi, karena biasanya client ingin data sesuai dengan yang tersimpan di aplikasi.
Tujuan nya adalah agar data-data yang ada di system, dapat mereka olah kembali secara manual di Microsoft Excel..
Atau agar data tersebut dapat disimpan dan dikirim ke pihak lain.
Itulah mengapa pada setiap report sebetulnya wajib ada fitur untuk export data nya kedalam excel.
Kali ini saya hanya akan memberikan beberapa cara untuk membruat report menggunakan laravel.
Instalasi Package MaatWebsite Laravel Excel
composer require maatwebsite/excel
Setelah itu, kita perlu melakukan sedikit konfigurasi pada file “../config/app.php”
'providers' => [
/*
* Package Service Providers...
*/
Maatwebsite\Excel\ExcelServiceProvider::class,
]
'aliases' => [
...
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
php artisan make:export SiswaExport --model=TblSiswa
<?php
namespace App\Exports;
use App\Models\TblSiswa;
use Maatwebsite\Excel\Concerns\FromCollection;
class SiswaExport implements FromCollection
{
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return TblSiswa::all();
}
}
Sekarang kita buatkan dulu file Controller nya, jalankan perintah:
php artisan make:controller ExportController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Exports\SiswaExport;
use Maatwebsite\Excel\Facades\Excel;
class ExportController extends Controller
{
public function index()
{
return Excel::download(new SiswaExport, 'users.xlsx');
}
}
Kalian buka file web.php, dan buat route baru seperti berikut:
....
Route::get('export-data', [ExportController::class, 'index']);
....
Filter Data Export Dengan Kondisi Where
Terkadang kita gak ingin semua data nya ter export, tapi hanya ingin beberapa data saja dengan kondisi tertentu.
Nah kita juga bisa menambahkan beberapa query sebelum melakukan proses export data nya, agar data yang ketarik bisa kita sesuaikan sesuai dengan kebutuhan.
Pertama kita modifikasi dulu pada file SiswaExport nya hingga menjadi seperti berikut.
<?php
namespace App\Exports;
use App\Models\TblSiswa;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\FromQuery;
class SiswaExport implements FromQuery
{
/**
* @return \Illuminate\Support\Collection
*/
public function __construct(string $keyword)
{
$this->nama = $keyword;
}
public function query()
{
return TblSiswa::query()->where('nama', 'like', '%' . $this->nama . '%');
}
}
Kemudian pada file ExportController nya kalian rubah juga seperti berikut:
public function index()
{
return Excel::download(new SiswaExport('putri'), 'siswas.xls');
}
Export Data From View
Dari tadi kita melakukan export data belum ada Header nya, padahal Header ini sangat penting bagi user agar bisa dengan mudah membaca jenis kolom nya.
Untuk bisa memberikan header, kita perlu metode untuk export data berdasarkan file view, nanti dari view tersebut kita juga bisa mengubah urutan kolom nya.
Misalkan sebagai contoh kita ingin menghilangkan kolom ID, menggeser kolom nama menjadi paling sebelah kiri dan kolom alamat menjadi paling sebelah kanan.
Kita ubah file SiswaExport nya terlebih dahulu menjadi seperti berikut:
<?php
namespace App\Exports;
use App\Models\TblSiswa;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromView;
class SiswaExport implements FromView
{
/**
* @return \Illuminate\Support\Collection
*/
public function __construct(string $keyword)
{
$this->nama = $keyword;
}
public function view(): View
{
return view('siswas.export', [
'data' => TblSiswa::where('nama', 'like', '%' . $this->nama . '%')->get()
]);
}
}
Sekarang berarti selanjutnya kamu buat view baru dengan nama export.blade.php dengan struktur seperti berikut:
<table>
<thead>
<tr>
<th>Nama</th>
<th>No HP</th>
<th>Email</th>
<th>Alamat</th>
</tr>
</thead>
<tbody>
@foreach ($data as $dt)
<tr>
<td>{{ $dt->nama }}</td>
<td>{{ $dt->no_hp }}</td>
<td>{{ $dt->email }}</td>
<td>{{ $dt->alamat }}</td>
</tr>
@endforeach
</tbody>
</table>
Export Data dengan Multiple Sheet
Sebagai contoh, kita akan membuat 2 buah sheet dalam 1 file, dimana sheet pertama untuk menampung nama siswa aja, dan sheet kedua untuk menampung no hp nya si siswa aja..
Kita perlu membuat folder baru bernama Sheets didalam “/app/Exports”, kemudian didalam nya buat 2 file baru yaitu SheetNama.php dan SheetNoHp.php.
../app/Exports/Sheets/SheetNama.php
../app/Exports/Sheets/SheetNoHp.php
SheetNama.php:
<?php
namespace App\Exports\Sheets;
use App\Models\TblSiswa;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithTitle;
class SheetNama implements FromQuery, WithTitle
{
/**
* @return \Illuminate\Support\Collection
*/
private $nama;
public function __construct(string $nama)
{
$this->nama = $nama;
}
/**
* @return Builder
*/
public function query()
{
return TblSiswa
::query()
->where('nama', 'like', '%' . $this->nama . '%')->select('nama');
}
/**
* @return string
*/
public function title(): string
{
return 'Nama';
}
}
SheetNoHp.php:
<?php
namespace App\Exports\Sheets;
use App\Models\TblSiswa;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithTitle;
class SheetNoHp implements FromQuery, WithTitle
{
/**
* @return \Illuminate\Support\Collection
*/
private $nama;
public function __construct(string $nama)
{
$this->nama = $nama;
}
/**
* @return Builder
*/
public function query()
{
return TblSiswa
::query()
->where('nama', 'like', '%' . $this->nama . '%')->select('no_hp');
}
/**
* @return string
*/
public function title(): string
{
return 'No HP';
}
}
Kemudian file SiswaExport.php nya juga perlu kamu rubah seperti berikut:
../app/Exports/SiswaExport.php
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use App\Exports\Sheets\SheetNama;
use App\Exports\Sheets\SheetNoHp;
class SiswaExport implements WithMultipleSheets
{
/**
* @return \Illuminate\Support\Collection
*/
public function __construct(string $keyword)
{
$this->nama = $keyword;
}
public function sheets(): array
{
$sheets = [];
$sheets[] = new SheetNama($this->nama);
$sheets[] = new SheetNoHp($this->nama);
return $sheets;
}
}
Sekiar tutorial yang bisa saya sampaikan, semoga bermanfaat. Terimakasih