Cara Export Ke Excel di Laravel Dari Query Builder

Cara Export Ke Excel di Laravel Dari Query Builder
Konten Halaman

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 file databse.php yang sudah kita buat sebelumnya.
  • protected $table = "film"; : memilih table yang digunakan model Film.

Cara instal library Laravel excel maatwebsite

  1. ketikkan perintah berikut ini:
composer require maatwebsite/excel

perintah diatas untuk melakukan install library excel maatwebsite di laravel melalui composer

  1. 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.
  1. 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.
  1. 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

  1. 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
  1. 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
  1. 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 class ExcelExport dan menyimpan di folder public
  • return response()->download(storage_path('app\public\\' . $filename)); melakukan perintah download ketika kita mengakses secara get dengan url di http://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. \