Membuat Fitur Import dan Export Data CSV di Laravel 8

Membuat Fitur Import dan Export Data CSV di Laravel 8

Admin
Admin・ 4 Oktober 2021
13 min read ・ 7588 views

Import Export CSV di Laravel - Hi Coderrs, di artikel ini saya akan share tutorial cara import data dari file CSV ke database dan export data ke format csv dengan laravel-excel package di laravel 8. Sebelumnya saya juga sudah pernah membagikan artikel tutorial cara import data dari file excel ke database di laravel.

Baca Juga:

Apa itu CSV ?

CSV atau Comma-Separated Values merupakan file teks yang dibatasi dengan menggunakan koma untuk memisahkan nilai, tetapi terkadang juga menggunakan karakter lain seperti titik koma. Setiap record terdiri dari satu atau lebih field yang dipisahkan dengan koma. Penggunaan koma sebagai pemisah (field) merupakan sumber nama untuk format file ini.  File CSV biasanya menyimpan data tabular (angka dan teks) dalam teks biasa, dalam hal ini setiap baris akan memiliki jumlah field yang sama.

Bagaimana Cara Import-Export CSV di Laravel 8 ?

Di laravel 8, untuk membuat fitur import data dari file dengan format CSV ke database atau export data dengan format CSV, kita bisa menggunakan laravel-excel package. Cara-cara implementasinya akan dibahas di bawah ini.

Membuat Import CSV

Ok, fitur pertama yang kita buat yaitu fitur untuk import data dari file dengan format CSV ke table users di database. Langkah-langkah untuk membuat fitur import CSV di laravel 8 bisa disimak seperti di bawah ini.

Step 1: Install Laravel

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

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

Pada langkah yang pertama ini, kita perlu menginstall laravel versi terbaru (saat ini versi 8) yang akan kita coba untuk implementasi membuat fitur import dan export CSV di laravel 8. Untuk installasi laravel bisa menggunakan laravel installer atau menggunakan composer seperti contoh di atas.

Silahkan memilih salah satu cara yang ingin digunakan untuk installasi laravel. Dari kedua contoh perintah installasi laravel di atas, akan sama-sama menghasilkan atau generate laravel project dengan nama laravel-csv.

Tunggu hingga proses installasi selesai dan jika sudah selesai, jangan lupa untuk masuk ke direktori project menggunakan perintah cd laravel-csv.

Step 2: Setup Database

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

Selanjutnya, buat database baru untuk menyimpan data-data sample yang akan kita gunakan pada percobaan ini. Jika kamu menggunakan xampp sebagai local development, silahkan buat database baru di localhost/phpmyadmin. Disini saya beri contoh, saya membuat database baru dengan nama laravel_csv. Kemudian jangan lupa juga untuk menyesuaikan DB_DATABASE pada file .env seperti pada contoh di atas. Dan kemudian jalankan perintah php artisan migrate, untuk 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 buka file yang baru saja digenerate tersebut atau di App/Http/Imports/UsersImport.php dan ubah kode yang ada menjadi seperti kode di atas. Dengan kode di atas, terdapat function startRow yang berfungsi untuk mengatur agar data yang dimasukkan ke table users hanya data yang dimulai dari baris kedua. Jadi baris pertama yang biasanya berisi heading akan diskip.

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

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');
});

Selanjutnya, ubah route yang telah disediakan default laravel dan tambahkan route post untuk import file atau data users dalam format csv. Sehingga untuk saat ini, kode di routes/web.php akan menjadi seperti 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 CSV in Laravel 8</title>
  </head>
  <body>
   <div class="container my-5">
       <h1 class="fs-5 fw-bold text-center">Import & Export CSV 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>

Kemudian, buka file welcome.blade.php dan ubah kode yang ada menjadi seperti kode di atas. Di file welcome.blade.php ini, kita akan menggunakan bootstrap 5 dan menambahkan component table dan dua button yaitu export dan import.

Step 7: Testing Import CSV

Oke, setelah melalui proses-proses mulai dari install laravel, install laravel excel package, generate file UsersImport.php, dan setup view, sekarang waktunya kita untuk menguji fitur import CSV yang telah kita buat. Silahkan download sample file CSV di bawah ini 👇 untuk digunakan dalam pengujian import CSV di laravel 8 ini. 

📁 Sample File CSV

Import CSV File Laravel 8

Kemudian, jalankan laravel project dengan menjalankan perintah php artisan serve. Buka laravel project di browser dengan URL seperti 127.0.0.1:8000 atau laravel-csv.test. Klik button Import Data, kemudian pilih file CSV dan klik submit. Maka data dari file CSV akan masuk ke database atau table users dan data akan ditampilkan di view seperti gambar di atas.

Bagaimana jika ingin menyimpan file CSV 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 CSV (di storage) saat import data dari file dengan format CSV ke database, kita bisa menambahkan kode seperti di atas. Dengan kode tersebut, file CSV yang kita import akan tersimpan di direktori storage/app/public/reports.

Membuat Export CSV

Kemudian, fitur kedua yang akan kita buat yaitu fitur untuk export data dari table users ke dalam format CSV. Bagaimana caranya ? Silahkan simak penjelasan singkat di bawah ini.

Step 1: Buat Export File

php artisan make:export UsersExport --model=User

Pertama, kita generate file export terlebih dahulu menggunakan perintah artisan seperti di atas. Dengan perintah tersebut, akan membuatkan file dengan nama UsersExport.php yang terletak di 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();
    }
} 

Kemudian buka file UsersExport.php yang telah berhasil digenerate tersebut dan ubah atau sesuaikan kodenya menjadi seperti kode di atas. Dengan kode seperti di atas, kita menggunakan delimeter atau pembatas data di file CSV dengan karakter titik koma (;). Kemudian kita juga menambahkan heading di file CSV (output atau hasil export) dengan dua teks yaitu Name dan Email. Dan kita pilih data-data yang diexport ke file CSV, merupakan data-data yang ada di dalam field name dan email.

'enclosure'  => '"',

Selanjutnya buka file config yang terletak di direktori config/excel.php. Kemudian cari kode exclousure seperti di atas, lalu ubah menjadi seperti di bawah ini.

 'enclosure' => '',

Step 2: Tambah Route

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

Selanjutnya, kita tambahkan route export csv untuk download file csv dari file UsersExport dengan nama file output users.csv. Route ini nanti akan kita panggil di view atau lebih tepatnya di button Export Data.

Step 3: Setup View

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

Nah, sekarang buka file welcome.blade.php. Cari kode button Export Data seperti kode di atas, lalu ubah menjadi seperti kode di bawah ini.

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

Disini kita hanya mengubah atau menambahkan link ke route export-csv.

Step 4: Testing Export CSV

Oke, sekarang waktunya pengujian kedua atau menguji fitur export CSV yang telah kita buat di laravel 8. Untuk menguji fitur export CSV, pastikan table users sudah terisi data, atau sudah melakukan import data csv di langkah sebelumnya. Jika table users terisi data, kita bisa langsung coba klik button Export Data.

Selesai.

Kesimpulan

Di artikel ini, kita telah sama-sama belajar bagaimana cara membuat fitur export atau import data dengan format CSV di laravel 8. Dengan menggunakan laravel-excel package, kita bisa dengan mudah membuat fitur export atau import csv di laravel. Tidak hanya CSV, dengan laravel-excel package kita juga bisa menggunakan format-format file lainnya seperti xlsx, tsv, pdf dan lain-lainnya. Kita bisa explore package tersebut di website resminya dengan link di bawah ini.

 

📓 Full Documentation: Laravel Excel

Tinggalkan Komentar
Loading Comments