Tutorial Laravel 5.5 - Melakukan Import Data ke Excel dengan Laravel Excel


Pada beberapa artikel sebelumnya telah dijelaskan bagaimana caranya untuk melakukan export data ke file excel dengan menggunakan package Laravel Excel. Bagi yang belum dan ingin membaca artikel tersebut silahkan gunakan link berikut https://ozkadon.blogspot.com/2018/10/tutorial-laravel-55-melakukan-export-data-ke-excel-dengan-laravel-excel.html. Sesuai dengan judul artikel, kali ini saya akan membahas bagaimana cara untuk melakukan import file excel dan memproses datanya ke dalam database.


#INSTALASI

Cara instalasinya masih sama seperti penjelasan pada artikel export sebelumnya. yaitu dengan menambahkan package pada composer.json atau dengan cara mengetikkan perintah berikut pada command prompt direktori program yang anda buat.

composer require maatwebsite/excel

Setelah selesai mendownload package tersebut bukalah file app.php yang terdapat di dalam direktori config dan tambahkan baris berikut 

'providers' => [
    /*
     * Package Service Providers...
     */
    Maatwebsite\Excel\ExcelServiceProvider::class,
]

Tambahkah kode di atas pada bagian providers dan kemudian tambahkan kode di bawah ini pada bagian aliases

'aliases' => [
    ...
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]

Kode di atas yang pertama adalah untuk menambahkan ServiceProvider dan yang kedua adalah untuk menambahkan Facade yang sekali lagi semuanya terletak pada file config/app.php. Dan yang terakhir adalah jalankan perintah artisan berikut pada command prompt.

php artisan vendor:publish

Kode di atas akan menambahkan file config baru yaitu excel.php di dalam direktori config.


#CARA PENGGUNAAAN

Cara yang akan saya jelaskan ini yang pertama adalah cara di mana file excel tidak memiliki header. Untuk file excel yang memiliki header juga akan saya jelaskan juga dalam artikel ini.

#Form Input

Langkah pertama yang saya lakukan adalah membuat tampilan form input terlebih dahulu. Fungsi dari form ini adalah untuk melakukan upload file excel yang nantinya akan diproses di bagian controller. 


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Import Excel</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-xs-6">
                <form method = "POST" enctype="multipart/form-data">
                    {{ csrf_field() }}
                    <div class="form-group">
                        <label for="file">Upload file excel</label>
                        <input type="file" class="form-control-file" name="file" id="file" placeholder="">
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
        </div>
    </div>
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>    
</body>
</html>

Pada contoh di atas saya menggunakan bootstrap 4 untuk tampilannya. Tentu saja anda tidak perlu meniru persis apa yang saya gunakan, sesuaikan saja tampilan dan penamaan pada program yang anda buat. Isi dari file tampilan ini hanyalah sebuah form dengan tipe multipart/form-data yang diperlukan untuk melakukan upload file. Kemudian sebuah input type file dan sebuah button untuk submit. Tampilan yang sangat sederhana yang saya gunakan hanya sebagai contoh saja.


Route::get('import/excel','ExcelController@index');
Route::post('import/excel','ExcelController@import');

Kode di atas adalah route yang saya gunakan. Baris pertama digunakan sebagai form tampilan dan baris kedua digunakan untuk proses nya  Dan sekali lagi tentu saja penulisan route yang anda gunakan tidak harus persis seperti contoh yang saya pakai.

#Model

Hal penting lainnya yang perlu anda tahu adalah untuk melakukan import ini, kita perlu mendefinisikan dulu field-field apa saja yang diperbolehkan untuk dilakukan mass assignment


<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class Peserta extends Model
{
 protected $table = 'peserta';

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['created_at', 'updated_at'];
    
    protected $fillable = ['NIK','nama','bagian','hadiah','status'];
 
}

Kode di atas adalah source code dari model Peserta yang saya buat. Cara untuk mendefinisikan field-field untuk mass assignment adalah dengan menggunakan variabel $fillable. Isilah semua field yang akan anda insert saat melakukan import file excel pada variabel tersebut.

#To Collection

Langkah-langkah untuk melakukan import ini mirip dengan langkah-langkah pada saat melakukan export. Buatlah direktori Imports di dalam direktori app. Kemudian buatlah sebuah file (di sini saya menggunakan nama PesertaImportCollection.php) sesuai dengan nama model yang saya gunakan yaitu model Peserta. Berikut ini adalah isi dari file tersebut :

<?php

namespace App\Imports;

use App\Model\Peserta;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

class PesertaImportCollection implements ToCollection
{
    public function collection(Collection $rows)
    {
        foreach ($rows as $row) 
        {
            if ($row[4] == "Belum Verifikasi"){
                $status = 0;
            } else {
                $status = 1;
            }
            Peserta::create([
                'NIK'     => $row[1],
                'nama'    => $row[2],
                'bagian'    => $row[3],
                'hadiah'    => $row[0],
                'status'    => $status,
                'created_at'    => date('Y-m-d H:i:s'),
                'updated_at'    => date('Y-m-d H:i:s'),
            ]);
        }        
    }
}

Cara kerja dari mode To Collection ini adalah dengan membaca file excel yang diupload sebagai keseluruhan baris yang disimpan dalam variabel $rows. Variabel ini kemudian dibaca baris per baris dengan menggunakan perintah foreach dan kemudian melakukan insert data dengan menggunakan model Peserta. Variabel $row[0] akan mengambil data pada kolom pertama dan seterusnya. Anda juga dapat memodifikasi data terlebih dahulu seperti yang saya lakukan pada field status. Untuk menggunakan mode To Collection ini kita perlu menggunakan use Maatwebsite\Excel\Concerns\ToCollection; dan juga implements ToCollection.

#To Model

Cara kedua ini adalah cara yang biasanya saya gunakan. Sama dengan cara pertama tadi. anda juga perlu membuat satu file import di dalam direktori app/Imports. Dalam contoh ini saya membuat file dengan nama PesertaImport.php untuk membedakan dengan cara yang pertama tadi.


<?php

namespace App\Imports;

use App\Model\Peserta;
use Maatwebsite\Excel\Concerns\ToModel;

class PesertaImport implements ToModel
{
    public function model(array $row)
    {
        if ($row[4] == "Belum Verifikasi"){
            $status = 0;
        } else {
            $status = 1;
        }

        return new Peserta([
            'NIK'     => $row[1],
            'nama'    => $row[2],
            'bagian'    => $row[3],
            'hadiah'    => $row[0],
            'status'    => $status,
            'created_at'    => date('Y-m-d H:i:s'),
            'updated_at'    => date('Y-m-d H:i:s'),
        ]);
    }
}

Kode di atas adalah isi dari file PesertaImport.php. Yang membedakan dengan mode To Collection adalah dengan cara ini file excel akan dibaca langsung secara perbaris, jadi kita tidak perlu melakukan proses foreach terlebih dahulu. Ketentuan lainnya masih sama yaitu index 0 untuk membaca kolom pertama dan seterusnya.

#To Model dengan Header

Cara ini digunakan jika file excel yang anda upload memiliki header. Sebenarnya anda bisa saja menghapus secara manual header tersebut baru melakukan upload. Namun jika anda tidak mau melakukan hal tersebut maka anda dapat menggunakan cara ini. 


<?php

namespace App\Imports;

use App\Model\Peserta;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class PesertaImportHeader implements ToModel, WithHeadingRow
{
    public function model(array $row)
    {
        if ($row['status'] == "Belum Verifikasi"){
            $status = 0;
        } else {
            $status = 1;
        }

        return new Peserta([
            'NIK'     => $row['nik'],
            'nama'    => $row['nama'],
            'bagian'    => $row['bagian'],
            'hadiah'    => $row['hadiah'],
            'status'    => $status,
            'created_at'    => date('Y-m-d H:i:s'),
            'updated_at'    => date('Y-m-d H:i:s'),
        ]);
    }
}

Caranya masih mirip dengan cara-cara sebelumnya. Jangan lupa untuk menambahkan use Maatwebsite\Excel\Concerns\WithHeadingRow; dan juga implements WithHeadingRow. Dengan cara ini index yang digunakan pada variabel $row adalah nama kolom header pada file excel yang anda upload. Dan jangan lupa untuk menggunakan huruf kecil semua pada saat melakukan penulisan index walaupun header pada file excel menggunakan huruf besar. Saya tidak tahu apakah ada setting atau pengaturan yang perlu dilakukan untuk mengatasi hal tersebut.

#Controller

Bagian terakhr yang perlu kita buat adalah proses yang dilakukan di dalam file Controller. 


<?php 
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers;

use App\Imports\PesertaImportCollection;
use App\Imports\PesertaImport;
use App\Imports\PesertaImportHeader;

use Excel;

class ExcelController extends Controller {

    public function import(Request $request)
    {
        if ($request->hasFile('file')) {
            $file = $request->file('file');

            // Excel::import(new PesertaImportCollection, $file);
            // Excel::import(new PesertaImport, $file);
            Excel::import(new PesertaImportHeader, $file);


            return redirect('import/excel');
        }        
    }
}

Yang pertama jangan lupa untuk menggunakan use file import yang anda buat dan juga use Excel. Cara melakukan import dapat anda baca pada baris kode di dalam function import. Di atas saya menuliskan 3 baris import hanya untuk membedakan dan mengetes apakah ketiga cara yang saya gunakan berjalan dengan baik. Di dalam praktek sesungguhnya, anda hanya perlu menggunakan 1 baris import saja sesuai dengan mode yang anda pilih.

Demikianlah penjelasan saya pada artikel Tutorial Laravel 5.5 - Melakukan Import Data ke Excel dengan Laravel Excel. Terima kasih dan selamat mencoba.
Tutorial Laravel 5.5 - Melakukan Import Data ke Excel dengan Laravel Excel Tutorial Laravel 5.5 - Melakukan Import Data ke Excel dengan Laravel Excel Reviewed by Donny Winarto on November 04, 2018 Rating: 5

2 comments:

  1. Gmn kalau data kolum d Excel nya ada tanggal lahir dengan format dd/mm/yyyy.
    Nah pas mau insert ke DB via laravel nya gmn?

    Thank You

    ReplyDelete
  2. $data->created_at = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4]);

    Saya pakai kode tersebut. Cuma klo dalam kasus anda keliatannya perlu di format dulu jadi yyyy-mm-dd mungkin seperti ini

    $data->created_at = date('Y-m-d',\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row[4]);)

    ReplyDelete

Powered by Blogger.