Press "Enter" to skip to content

Tutorial Lengkap Import Excel Laravel

fadli 1

Import Excel Laravel – Halo semuanya, setelah sebelumnya kita sudah mempelajari tentang bagaimana cara export data ke excel dari mysql, sekarang kita akan coba melakukan kebalikan nya, yaitu import data ke mysql via file excel..

Fitur ini kadang di perlukan oleh client ketika mereka baru saja melakukan migrasi sistem dan ingin memindahkan data-data yang lama kedalam sistem yang baru..

Biasanya digunakan untuk memasukkan berbagai macam master data seperti data karyawan, supplier, atau customer yang jumlah nya bisa mencapai ribuan..

Kemudian karena ga mungkin juga mereka memindahkan nya dengan cara menginput ulang datanya satu per satu, maka dibutuhkan modul importer seperti ini dengan ketentuan template excel yang sudah disediakan..

Okee, langsung saja kita mulai praktek nya yaa.. Ada beberapa hal yang perlu kita persiapkan, jadi kita mulai dari persiapan nya terlebih dahulu yaa..

Persiapan

Langkah awal yang perlu kamu lakukan yaitu:

Instalasi Laravel

Dalam kasus ini, versi laravel yang saya gunakan yaitu versi 8, untuk cara instalasi nya bisa kamu ikuti panduan yang ada di halaman resmi nya disini..

Instalasi Package nya

Untuk package nya, kita masih menggunakan package yang sama seperti pada tutorial sebelum nya, yaitu MaatWebsite Laravel/Excel versi 3..

Untuk cara instalasi nya bisa kamu lihat pada tutorial (Cara Export Excel Laravel)..

Database

Setelah instalasi Laravel dan Package nya selesai, sekarang kamu buat database nya terlebih dahulu, untuk nama database nya boleh apa saja sesuai dengan keinginan mu..

Setelah itu, silahkan hubungkan database nya dengan project laravel mu melalui file .env, seperti pada gambar berikut:

import excel laravel

Untuk username dan password nya, silahkan kalian sesuaikan sendiri dengan akun mysql kalian masing-masing.. Jika tanpa password, kolom DB_PASSWORD nya dikosongkan saja..

Membuat Table Siswa

Setelah database nya terhubung, sekarang kita coba buat table siswa terlebih dahulu..

Kenapa harus teble siswa? Karena pada studi kasus kali ini, kita akan mencoba mengimport data siswa kedalam database..

Kita buat table nya melalui migration, sekaligus kita buat juga model nya untuk mewakili table tersebut, silahkan di CMD/Terminal kalian jalankan perintah seperti berikut:

php artisan make:model Siswa -m

Perintah tersebut akan menciptakan 1 buah file Model dan juga 1 buah file Migration..

../app/Models/Siswa.php
../database/migrations/2021_08_27_135345_create_siswas_table.php

Modifikasi file model Siswa nya seperti berikut dengan menambahkan 2 buah property, yaitu property guarded dan timestamps..

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Siswa extends Model
{
    use HasFactory;

    protected $guarded = [];
    public $timestamps = false;
}
protected $guarded = []; artinya kita membolehkan semua kolom pada table tersebut untuk diisi..
public $timestamps = false; artinya didalam table tersebut tidak terdapat kolom created_at dan updated_at..

Pada file migration nya, kalian isi seperti berikut:

public function up()
{
    Schema::create('siswas', function (Blueprint $table) {
        $table->id();
        $table->string('nama')->nullable();
        $table->string('no_hp')->nullable();
        $table->string('email')->nullable();
        $table->text('alamat');
    });
}

Kemudian jalankan perintah:

php artisan migrate

Setelah itu akan ada beberapa file dan table yang termigrasi, salah satu nya adalah table siswas..

import excel laravel

Kalo kalian cek di database nya, maka seharusnya akan terbentuk table siswas dengan struktur seperti berikut ini:

import excel laravel

Tampilkan Dulu Data Siswa nya

Sekarang, setelah semua persiapan nya sudah selesai, kita akan buat modul list siswa nya terlebih dahulu..

Silahkan kalian buat route baru terlebih dahulu di file web.php, kemudian tambahkan route baru seperti berikut:

../routes/web.php
....
use App\Http\Controllers\SiswaController;
....

Route::get('siswa/list', [SiswaController::class, 'index']);

Route diatas memiliki spesifikasi seperti berikut:

  • Method Get
  • Url nya yaitu siswa/list
  • Controller nya SiswaController
  • function nya index..

Sekarang kalian buat SiswaController nya dengan menjalankan perintah:

php artisan make:controller SiswaController

Nanti posisi dari file SiswaController nya berada di ../app/Http/Controllers/SiswaController.php..

Dibuka aja dan tambahkan function index seperti berikut:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Siswa;

class SiswaController extends Controller
{
    public function index()
    {
        $data = Siswa::all();

        return view('siswa.index', compact('data'));
    }
}

Coba kamu perhatikan script diatas:

  • Pada baris ke-7 kita memanggil model Siswa nya..
  • Baris ke-11 kita membuat function index..
  • Didalam function index terdapat variable data untuk menampung seluruh data siswa nya..
  • Kemudian pada baris ke-15 kita mengarahkan nya ke view siswa/index dengan turut mempassing variable data nya..

Sekarang kita buat file view nya, kita letakkan didalam folder:

../resources/views/siswa/index.blade.php

Dan coba kalian isi seperti berikut:

<!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>List Siswa</title>

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        <table class="table">
            <thead>
                <tr>
                    <th>Nama</th>
                    <th>Email</th>
                    <th>No Hp</th>
                    <th>Alamat</th>
                </tr>
            </thead>
            <tbody>
                @foreach ($data as $dt)
                    <tr>
                        <td>{{ $dt->nama }}</td>
                        <td>{{ $dt->email }}</td>
                        <td>{{ $dt->no_hp }}</td>
                        <td>{{ $dt->alamat }}</td>
                    </tr>
                @endforeach
            </tbody>
        </table>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.min.js"></script>
</body>

</html>

Sekarang kalo kalian akses url nya

http://127.0.0.1:8000/siswa/list

Maka seharusnya akan tampil seperti berikut ini:

list siswa import excel laravel

Kalo kalian akses, halaman tersebut memang tidak ada isi nya, cuma header aja, karena memang di database nya juga masih kosong..

Nanti akan kita isi datanya via import excel..

Mulai Import Data nya

Nah sekarang akan kita mulai untuk modul import nya, nanti akan saya jelaskan dengan berbagai macam cara, kita mulai dari yang basic terlebih dahulu yaa..

Tapi sebelumnya pada halaman list siswa, kalian tambahkan dulu sebuah button untuk proses import data nya,

Basic Usage / Cara Dasar

Pertama yang perlu kita lakukan yaitu membuat format excel nya terlebih dahulu, silahkan kalian buat seperti pada gambar dibawah ini:

import excel laravel

 

Untuk header silahkan disamakan seperti pada gambar diatas (nama, no_hp, email, alamat).. tapi kalo untuk body silahkan kalian sesuaikan sendiri, datanya bebas boleh apa saja..

Kemudian selanjutnya kita tambahkan sebuah form untuk upload file excel nya di halaman list siswa, kalian buka file view index nya dan ubah seperti berikut ini:

../resources/views/siswa/index.blade.php
<!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>List Siswa</title>

    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css">
</head>

<body>
    <div class="container">

        <div style="margin-top: 15px;">

            <form role="form" method="post" action="{{ url('siswa/import') }}" enctype="multipart/form-data">
                {{ csrf_field() }}
                <div class="box-body">
                    <div class="form-group">
                        <label for="exampleInputFile">File input</label>
                        <input type="file" name="file" id="exampleInputFile">

                        <p class="help-block">Example block-level help text here.</p>
                    </div>
                </div>
                <!-- /.box-body -->

                <div class="box-footer">
                    <button type="submit" class="btn btn-success btn-md">Import</button>
                </div>
            </form>

        </div>

        <table class="table">
            <thead>
                <tr>
                    <th>Nama</th>
                    <th>Email</th>
                    <th>No Hp</th>
                    <th>Alamat</th>
                </tr>
            </thead>
            <tbody>
                @foreach ($data as $dt)
                    <tr>
                        <td>{{ $dt->nama }}</td>
                        <td>{{ $dt->email }}</td>
                        <td>{{ $dt->no_hp }}</td>
                        <td>{{ $dt->alamat }}</td>
                    </tr>
                @endforeach
            </tbody>
        </table>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.min.js"></script>
</body>

</html>

Di view tersebut, kita menambahkan sebuah form di atas table list siswa nya..

import excel laravel

 

Form tersebut mengarah ke url “/siswa/import” serta menggunakan method POST, yang mana nanti akan kita buatkan juga route nya di dalam file web.php..

Untuk jenis inputan nya yaitu type file, dan name nya juga file..

Kalo kalian refresh halaman list siswa nya, seharusnya akan tampil seperti berikut:

import excel laravel

Sekarang kita buat route baru untuk menangani proses import data nya, di file web.php silahkan tambahkan seperti berikut:

Route::post('siswa/import', [SiswaController::class, 'import_excel']);

Route tersebut memiliki spesifikasi seperti berikut:

  • Method POST
  • Url nya mengarah ke /siswa/import
  • Masih menggunakan controller yang sama yaitu SiswaController
  • Function nya mengarah ke import_excel..

Kemudian untuk dapat melakukan import data, kita perlu membuat sebuah file didalam folder “../app/Imports”.. Nanti didalam folder tersebut kita akan meletakkan berbagai macam Class untuk proses import data nya..

Kita bisa membuat nya dengan menjalankan perintah seperti berikut:

php artisan make:import SiswasImport --model=Siswa

Nah perintah tersebut akan menciptakan sebuah file import baru yang berada didalam folder

../app/Imports/SiswasImport.php

Dibuka aja file SiswasImport nya, dan ubah seperti berikut ini:

<?php

namespace App\Imports;

use App\Models\Siswa;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class SiswasImport implements ToCollection, WithHeadingRow
{
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function collection(Collection $rows)
    {
        foreach ($rows as $index => $row) {

            Siswa::create([
                'nama' => $row['nama'],
                'no_hp' => $row['no_hp'],
                'email' => $row['email'],
                'alamat' => $row['alamat'],
            ]);
        }
    }
}
  • Pada baris ke-5, kita panggil model Siswa nya..
  • Pada baris ke-19 kita foreach variabel rows nya, variable rows ini isinya adalah data-data yang ada di dalam file excel nya..
  • Kemudian karena di excel kita terdapat sebuah header, maka header ini tidak akan ter-insert ke dalam database nya, karena kita sudah memanggil Class WithHeadingRow┬ápada baris ke-8 dan sudah mengimplementasikan nya pada Class SiswasImport nya..
  • Baris ke-21 adalah proses insert data nya..

Sekarang buka file SiswaController nya, dan tambahkan function import_excel seperti berikut:

../app/Http/Controllers/SiswaController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Siswa;
use App\Imports\SiswasImport;
use Maatwebsite\Excel\Facades\Excel;

class SiswaController extends Controller
{
    public function index()
    {
        $data = Siswa::all();

        return view('siswa.index', compact('data'));
    }

    public function import_excel(Request $request)
    {
        Excel::import(new SiswasImport, $request->file('file'));

        return redirect()->back();
    }
}
  • Pada baris ke-8, kita panggil Class SiswasImport nya yang sebelumnya sudah kita buat..
  • Pada baris ke-9 kita panggil Class Excel nya..
  • Baris ke-20 kita buat sebuah function baru dengan nama import_excel, yang mana didalam nya terdapat proses import data nya..

Nah setelah itu, sekarang kalian coba jalankan importer nya, pada halaman list siswa, kalian pilih file excel nya, kemudian klik button Import..

Jika berhasil, maka kita akan diarahkan kembali ke halaman list siswa nya, dan akan tampil data-data yang baru saja kita import..

import excel laravel

Custom Posisi Header

Terkadang didalam fil excel kita, posisi header nya ga selalu di baris ke-1, terkadang di baris ke-2 atau dibaris ketiga..

Jika kalian menemukan kondisi tersebut, maka perlu melakukan sedikit modifikasi pada file SiswasImport nya..

<?php

namespace App\Imports;

use App\Models\Siswa;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class SiswasImport implements ToCollection, WithHeadingRow
{
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function collection(Collection $rows)
    {
        foreach ($rows as $index => $row) {

            Siswa::create([
                'nama' => $row['nama'],
                'no_hp' => $row['no_hp'],
                'email' => $row['email'],
                'alamat' => $row['alamat'],
            ]);
        }
    }

    public function headingRow(): int
    {
        return 2;
    }
}

Kalian tinggal tambahkan aja function headingRow dan return dengan sebuah angka yang mewakili letak baris dari posisi header nya..

Membatasi Import Data

Terkadang kita ingin membatasi jumlah data yang masuk kedalam database..

Misalkan sebagai contoh, kita memiliki ribuan data didalam file excel nya, tapi kita hanya ingin mengimport 100 data saja..

Untuk dapat melakukan nya, kita bisa mengimplementasikan Class WithBatchInserts di file SiswasImport nya seperti berikut ini:

<?php

namespace App\Imports;

use App\Models\Siswa;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithBatchInserts;

class SiswasImport implements ToCollection, WithHeadingRow, WithBatchInserts
{
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function collection(Collection $rows)
    {
        foreach ($rows as $index => $row) {

            Siswa::create([
                'nama' => $row['nama'],
                'no_hp' => $row['no_hp'],
                'email' => $row['email'],
                'alamat' => $row['alamat'],
            ]);
        }
    }

    public function batchSize(): int
    {
        return 1000;
    }
}
  • Pada baris ke-9 kita memanggil Class WithBatchInserts nya..
  • Di baris ke-11 kita mengimplementasikan Class nya
  • Pada baris ke-31 kita membuat sebuah function dengan nama batchSize() untuk menentukan berapa jumlah data yang ingin di import..

Chunk Reading

Ketika kita membaca sebuah file excel dengan ukuran yang sangat besar yang mungkin memiliki 1 juta baris data, maka pastinya akan berimbas kepada penggunaan memori server yang berlebih..

Bahkan jika server tidak mampu menangani nya akan memuncul error 500 Server TimeOut..

Untuk mengatasinya, kalian bisa menggunakan metode Chunk Reading..

Chunk ini akan membagi data yang besar menjadi beberapa bagian, misalkan sebagai contoh, kita memiliki 10 ribu data, kemudian kita membagi nya menjadi 10 bagian dengan masing-masing bagian memiliki 1 ribu data..

Maka dengan begitu, sistem tidak akan langsung get 10 ribu data nya, tapi hanya get data sebanyak 10 kali saja..

Untuk cara penggunaan nya, kalian perlu modifikasi kembali fie SiswasImport nya seperti berikut:

<?php

namespace App\Imports;

use App\Models\Siswa;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class SiswasImport implements ToCollection, WithHeadingRow, WithChunkReading
{
    /**
     * @param array $row
     *
     * @return \Illuminate\Database\Eloquent\Model|null
     */
    public function collection(Collection $rows)
    {
        foreach ($rows as $index => $row) {

            Siswa::create([
                'nama' => $row['nama'],
                'no_hp' => $row['no_hp'],
                'email' => $row['email'],
                'alamat' => $row['alamat'],
            ]);
        }
    }

    public function chunkSize(): int
    {
        return 3;
    }
}
  • Pada baris ke-9 kita memanggil class WithChunkReading nya..
  • Kemudian mengimplementasikan nya pada baris ke-11..
  • Dan pada baris ke-31 kita membuat sebuah function dengan nama chunkSize untuk menentukan jumlah data Chunk nya..

Akhir Kata

Terima kasih sudah mengikuti serial tutorial lengkap Import Excel Laravel..

Semoga bermanfaat.. dan jika dirasa ada yang kesulitan, silahkan berkomentar pada kolom dibawah ini yaa..

Terima kasih..

Support Us

Jika artikel ini bermanfaat untuk kamu, membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid

Terima kasih..

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: