Cara Export Ke Excel di Laravel Dari Query Builder
Okay di kesempatan kali ini aku mau berbagi pengalaman gimana caranya export data yang ada di laravel entah itu dari array atau dari custom query ke database yang nantinya menjadi file excel, dengan itu teman - teman bisa membuka melalui program lain seperti di microsoft office excel, wps office spreadsheet dan libreoffice calc atau bahkan oleh google spreadsheets untuk tujuannya diteruskan untuk dikelola data nya atau buat di print sebagai arsip.
Langsung saja untuk melakukan export atau generate data di laravel ke file excel kita perlu menginstal sebuah library Laravel excel bernama maatwebsite maatwebsite/excel
. yang nantinya untuk menginstall dengan mengetikkan perintah composer require maatwebsite/excel
di di CMD atau terminal pastikan terbuka dari folder project yang sudah terinstal Laravel hingga nantinya dari tutorial ini bertujuan bisa melakukan save file extension .xlsx
atau .xls
.
jika belum meng install Laravel bisa ikuti cara install Laravel di posting saya sebelumnya Cara Install Laravel di Windows atau bisa mengikuti membuat rest api di Laravel pada posting Membuat REST API CRUD dengan Laravel serta JWT agar mudah untuk mengikuti tutorial ini.
di tutorial ini saya menggunakan studi kasus menggunakan database sakila mysql jika ingin mengikuti kalian bisa download dump backup database sakila di sini atau kunjungi link berikut https://dev.mysql.com/doc/index-other.html kemudian pilih download sakila database versi file zip, kemudian ektrak dan import databse-nya bisa ikuti tutorial di import databse mysql. di database Sakila berisikan data dummy sistem penyewaan rental film disana terdapat table film, actor, data pelanggan dan sebagainya.
Persiapan database Sakila di Laravel
disini saya menggunakan database sakila dari mysql sebagai dummy, karena database nya berbeda maka kita buat koneksinya terpisah dari database primary milik laravel.
'connections' => [
...
'mysql-sakila' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE_SAKILA', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
...
]
setelah membuat konfigurasi database laravel kita buat model di laravel untuk table film
, dengan membuat file Film.php
di dalam folder src\Models
seperti berikut :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Film extends Model
{
use HasFactory;
protected $connection = "mysql-sakila";
protected $table = "film";
}
Penjelasan :
protected $connection = "mysql-sakila";
: memilih koneksi yang telah kita buat di filedatabse.php
yang sudah kita buat sebelumnya.protected $table = "film";
: memilih table yang digunakan modelFilm
.
Cara instal library Laravel excel maatwebsite
- ketikkan perintah berikut ini:
composer require maatwebsite/excel
perintah diatas untuk melakukan install library excel maatwebsite di laravel melalui composer
- kemudian tambahkan service provider di
config/app.php:
baris kode seperti dibawah ini:
'providers' => [
/*
* Package Service Providers...
*/
Maatwebsite\Excel\ExcelServiceProvider::class,
]
Penjelasan:
- tambahkan di dalam array
providers
yang berada di dalam kurung siku.
- selanjutnya tambahkan aliases di
config/app.php
beberapa baris :
'aliases' => [
...
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
Penjelasan:
- tambahkan baris kode di dalam array
aliases
yang berada di dalam kurung siku.
- langkah terakhir menjalankan publish vendor dengan perintah di bawah ini :
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
Export data Laravel ke excel
- membuat class untuk Excel untuk proses export yang bisa digunakan secara dinamis, simpan baris kode di dibawah ini dalam file dan folder
app\Exports\ExcelExport.php
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithTitle;
class ExcelExport implements FromArray, WithHeadings, ShouldAutoSize, WithTitle
{
private $setData;
private $setHeadings;
private $setSheetTitle;
public function __construct($data = [], $headings = [], $title = null)
{
$this->setData = $data;
$this->setHeadings = $headings;
$this->setSheetTitle = $title;
}
public function array(): array
{
return $this->setData;
}
public function headings(): array
{
return $this->setHeadings;
}
public function title(): string
{
return is_null($this->setSheetTitle) ? 'Main' : $this->setSheetTitle;
}
}
Penjelasan :
- baris kode di atas bertujuan untuk export secara dinamis yang dimana kita bisa menset header sesuka kita tanpa berpatokan ke databse key
- export data dari array ikuti langkah - langkah berikut
- berikut ini contoh untuk export menggunakan array
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\ExcelExport;
$this->setHeadingsExportExcel = [
'name',
'phone',
'address',
];
$this->sheetNameExportExcel = "test-title-sheet";
$data = [
[
'name' => 'Sigit N'
'phone' => '0891313131'
'address' => 'Banjar'
],
[
'name' => 'Hanafi S'
'phone' => '0892424242'
'address' => 'Langen'
],
[
'name' => 'Hanhan N'
'phone' => '08925252525'
'address' => 'Jabar'
],
];
$filename = 'file-export.xlsx';
Excel::store(new ExcelExport($data, $this->setHeadingsExportExcel, $this->sheetNameExportExcel), $filename, 'public');
Penjelasan :
- file akan disimpan di
public
- data semua nya berbentuk array sehingga bisa dinamis
- export data dari query builder eloquent laravel ikuti langkah - langkah berikut :
- menambahkan baris kode di
api.php
berikut ini:
use App\Http\Controllers\ExportController;
/* toExcelFilm */
Route::get('/export/film', [ExportController::class, 'toExcelFilm']);
- lalu buat file controller baru saya gunakan dengan nama file
ExportController.php
adan isi file kode seperti berikut :
<?php
namespace App\Http\Controllers;
use App\Exports\ExcelExport;
use App\Models\Film;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Http\Response;
class ExportController extends Controller
{
public function toExcelFilm(){
$data = Film::all()->toArray();
$dataHeader = array_keys($data[0]);
$filename = 'data-film-export.xlsx';
try {
Excel::store(new ExcelExport($data, $dataHeader, 'main'), $filename, 'public');
return response()->download(storage_path('app\public\\' . $filename));
} catch (\Exception $e) {
return $e;
}
}
}
Penjelasan
- isi kode php controller di atas berisikan perintah untuk melakukan export dan bisa melakukan download.
Excel::store(new ExcelExport($data, $dataHeader, 'main'), $filename, 'public');
proses ekport memanggil classExcelExport
dan menyimpan di folder publicreturn response()->download(storage_path('app\public\\' . $filename));
melakukan perintah download ketika kita mengakses secara get dengan url dihttp://localhost:8000/api/export/film
Kesimpulan
dari tulisan di atas kita bisa melakukan export secara dinamis berbentuk array atau dari query builder laravel yang berbentuk array. \