Membuat Export dan Import Excel di Laravel

Hallo selamat malam para sobat indonesia, kali ini saya akan share bagaimana cara membuat fitur export dan import Excel di laravel. Ok langsung saja sobat, fitur pertama yang kita buat yaitu fitur untuk import data dari file dengan format excel ke table users di database laravel. Langkah-langkah untuk membuat fitur import excel di laravel 8 bisa sobat lihat di bawah ini.

Membuat Import Excel

Step 1: Install Laravel

//via Laravel Installer
composer global require laravel/installer
laravel new laravel-excel

//via Composer
composer create-project laravel/laravel laravel-excel

Pada langkah yang pertama, sobat perlu menginstall laravel yang akan kita coba untuk implementasi membuat  import dan export excel di laravel. Untuk installasi laravel sobat bisa menggunakan laravel installer atau menggunakan composer, sobat bisa lakukan dengan cara diatas.

Silahkan sobat memilih salah satu cara yang ingin digunakan dalam installasi laravel. Dari kedua contoh perintah di atas, akan sama-sama menghasilkan laravel project dengan nama laravel-excel.

Step 2: Setup Database

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_excel
DB_USERNAME=root
DB_PASSWORD=

Selanjutnya seperti biasa, sobat buat database baru untuk menyimpan data-data contoh yang akan kita gunakan pada percobaan kali ini. Jika sobat menggunakan xampp sebagai localhost, silahkan sobat buat database baru di localhost/phpmyadmin. Pada contoh kali ini, saya akan membuat database baru dengan nama laravel_excel. Kemudian jangan lupa sobat juga untuk menyesuaikan DB_DATABASE pada file .env seperti yang sidah di contoh kan di atas. Dan kemudian jalankan perintah php artisan migrate, untuk melakukan memigrasi semua file migration ke database.

Step 3: Install Laravel Excel Package

composer require maatwebsite/excel

Install Laravel excel package dengan menjalankan perintah composer seperti di atas.

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

Untuk publish config file, jalankan perintah vendor publish seperti di atas. Dengan menjalankan perintah tersebut, akan membuat file config baru dengan nama dan terletak di direktori config/excel.php.

Step 4: Buat Import File

php artisan make:import UsersImport --model=User

Pertama, kita akan membuat fitur import data csv ke table users terlebih dahulu. Untuk itu, mari kita siapkan file import tersebut. Silahkan jalankan perintah artisan seperti di atas untuk generate file UsersImport.php. Jika perintah artisan sudah dijalankan, maka file UsersImport.php akan terletak di direktori App/Imports.

<?php

namespace App\Imports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;

class UsersImport implements ToModel, WithStartRow, WithCustomCsvSettings{
    public function startRow(): int{
      return 2;
    }

    public function getCsvSettings(): array{
      return [
        'delimiter' => ';'
      ];
    }
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
   public function model(array $row){
    return new User([
      'name' => $row[0],
      'email' => $row[1],
      'password' => \Hash::make($row[2]),
    ]);
   }
}

Kemudian sobat buka file yang baru saja digenerate tersebut atau di App/Http/Imports/UsersImport.php lalu sobat ubah kode seperti kode di atas. Pada kode di atas, terdapat function startRow yang berfungsi agar data yang dimasukkan ke table users dimulai dari baris kedua. Jadi baris pertama tidak akan ikut masuk ke database.

Kemudian pada function model, sobat perlu atur data dari row 0 akan dimasukkan ke dalam field name, data dari row 1 akan dimasukkan ke dalam field email dan nilai pada row 2 akan dimasukkan ke dalam field password dengan hash format.

Step 5: Buat Route & Logic

<?php

  use Illuminate\Support\Facades\Route;
  use Maatwebsite\Excel\Facades\Excel;
  use App\Imports\UsersImport;

  Route::get('/', function () {
     return view('welcome',[
      'users' => App\Models\User::all()
     ]);
  });

  Route::post('import', function () {
    Excel::import(new UsersImport, request()->file('file'));
    return redirect()->back()->with('success','Data Imported Successfully');
  });

Oke selanjutnya, silahkan sobat ubah route yang telah disediakan default laravel kemudian tambahkan route post untuk melakukan import file atau data users dalam format excel. Sehingga kode di routes/web.php akan menjadi seperti contoh kode di atas.

Step 6: Setup View

<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

<title>Import & Export Excel in Laravel 8</title>
</head>
<body>
<div class="container my-5">
<h1 class="fs-5 fw-bold text-center">Import & Export Excel in Laravel 8</h1>
<div class="row">
<div class="d-flex my-2">
<a href="" class="btn btn-primary me-1">Export Data</a>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#exampleModal">
Import Data
</button>
</div>
@if (session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
{{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Email</th>
</tr>
</thead>
<tbody>
@foreach ($users as $key => $item)
<tr>
<th scope="row">{{ ++$key }}</th>
<td>{{ $item->name }}</td>
<td>{{ $item->email }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Import CSV</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="import" method="POST" enctype="multipart/form-data">
@csrf
<div class="input-group mb-3">
<input type="file" name="file" class="form-control">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</form>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>

</body>
</html>

Selanjutnya, buka file welcome.blade.php lalu ubah kode yang ada menjadi seperti kode di atas. Pada file welcome.blade.php tersebut, kita akan mencoba menggunakan bootstrap 5 dan menambahkan component table dan dua button yaitu export dan import.

Step 7: Testing Import Excel

Oke sobat, setelah melalui proses diatas mulai dari install laravel, install laravel excel package, generate file UsersImport.php, dan setup view, sekarang saatnya sobat untuk menguji fitur import Excel yang telah kita buat.

Jalankan laravel project dengan menggunakan perintah php artisan serve. Selanjutnya buka laravel project di browser dengan URL seperti 127.0.0.1:8000 atau laravel-csv.test. Silahkan sobat klik button Import Data, kemudian pilih file Excel lalu klik submit. Maka data dari file Excel akan masuk ke database atau table users kemudian data akan ditampilkan di view seperti gambar di atas.

Bagaimana jika ingin menyimpan file Excel di storage ?

Route::post('import', function () {
    $fileName = time().'_'.request()->file->getClientOriginalName();
    request()->file('file')->storeAs('reports', $fileName, 'public');

    Excel::import(new UsersImport, request()->file('file'));
    return redirect()->back()->with('success','Data Imported Successfully');
});

Untuk menyimpan file Excel (di storage) saat import data dari file dengan format Excel ke dalam database, sobat bisa menambahkan kode seperti contoh di atas. Dengan kode diatas, file Excel yang kita import akan tersimpan pada direktori storage/app/public/reports.

Membuat Export Excel

Selanjuntnya, fitur kedua yang akan kita coba buat yaitu fitur untuk export data dari database table users ke dalam format Excel. Lalu bagaimana caranya ? Silahkan sobat simak langkah-langkahnya di bawah ini.

Step 1: Buat Export File

php artisan make:export UsersExport --model=User

Pertama, silahkan sobat generate file export terlebih dahulu untuk menggunakan perintah artisan sobat bisa ikuti contoh seperti di atas. Dengan perintah tersebut, maka akan membuatkan file dengan nama UsersExport.php yang terletak pada direktori app/Exports.

<?php

namespace App\Exports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithCustomCsvSettings;
use Maatwebsite\Excel\Concerns\WithHeadings;

class UsersExport implements FromCollection, WithCustomCsvSettings, WithHeadings
{
public function getCsvSettings(): array
{
return [
'delimiter' => ';'
];
}

public function headings(): array
{
return ["Name", "Email"];
}

/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
return User::select('name','email')->get();
}
}

Selanjutnya silahkan sobat buka file UsersExport.php yang telah berhasil digenerate kemudian ubah lalu sesuaikan kodenya menjadi seperti contoh kode di atas. Dengan kode seperti di atas, sobat telah menggunakan delimeter atau pembatas data pada file Excel dengan karakter titik koma (;).Jangan lupa sobat juga perlu menambahkan heading di file Excel (output atau hasil export) dengan dua teks yaitu Name dan Email. Selanjutnya sobat pilih data-data yang akan diexport ke file Excel.

'enclosure' => '"',

Selanjutnya sobat buka file config yang terapat pada direktori config/excel.php. Kemudian sobat cari kode exclousure seperti di atas, kemudina ubah menjadi seperti di bawah ini.

'enclosure' => '',

Step 2: Tambah Route

Route::get('export-csv', function () {
     return Excel::download(new UsersExport, 'users.xls');
});

Selanjutnya, sobat bisa tambahkan route export excel untuk download file excel dari file UsersExport dengan nama file output users.xls. Route ini akan kita panggil pada view atau di button Export Data.

Step 3: Setup View

<a href="" class="btn btn-primary me-1">Export Data</a>

Selanjutnya, sekarang sobat buka file welcome.blade.php. Lalu cari kode button Export Data seperti kode di atas, kemudian ubah menjadi seperti kode di bawah ini.

<a href="export-csv" target="_blank" class="btn btn-primary me-1">Export Data</a>

Disini sobat hanya perlu mengubah atau menambahkan link ke route export-excel.

Step 4: Testing Export CSV

Terakhir, sekarang sobat bisa melakukan pengujian kedua atau menguji fitur export Excel yang telah sobat buat di laravel. Untuk menguji fitur export Excel tersebut, pastikan table users sudah ada isinya atau sudah melakukan import data excel di langkah sebelumnya. Jika table users sudah terisi data, sobat bisa langsung coba klik button Export Data.

Sekian tutorial dari saya, semoga bermanfaat. Terima kasih..

Leave a Reply

Your email address will not be published.