#36-Laravel Upload Import Data Excel

Tujuan

Seperti penggunaan Export Excel, pada umumnya saat ingin memulai pembuatan aplikasi, pengguna memiliki data yang cukup banyak sehingga akan memakan waktu jika diinput satu per satu melalui aplikasi.

Untuk mempersingkat waktu biasanya developer aplikasi menyediakan fitur Upload Data salah satunya menggunakan Excel.

Pada tutorial sebelumnya kita sudah bisa mengexport data ke Excel, sekarang kita akan membuat fitur File Upload Excel untuk memasukan data ke dalam database menggunakan library Laravel Excel.

Persiapan

  1. Installasi Project Laravel
  2. Konfigurasi Aplikasi & Database
  3. Install Library Laravel Export Laporan Excel

Untuk membuat model menggunakan php artisan, silahkan buka terminal atau cmd, kemudian masuk ke direktori project laravelnya, dan ketik perintah berikut.

php artisan make:model Student -m

-m adalah option perintah untuk sekaligus membuatkan file migration untuk table/model student.

app/Student.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    protected $fillable = ['fullname','address'];
}

Persiapan Migrate Database Table Students

Ubah file database/migrations/xxx_create_students_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->increments('id');
            $table->string('fullname');
            $table->text('address');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
}

Jalankan Migrate Database Table Students

Untuk membuat table students jalankan perintah berikut:

php artisan migrate

Seharusnya sudah ada table students di database anda, jika ada kendala baca kembali tutorial Laravel Migration

Membuat Class Import Dalam Format Excel Dengan Laravel

Untuk membuat import excel laravel dengan package laravel excel ini, yang harus kita lakukan adalah membuat import nya terlebih dulu. sama pada saat seperti kita membuat export pada tutorial export excel sebelumnya.

buka terminal atau command line nya.

php artisan make:import StudentImport --model=Student

Di sini, import yang akan kita buat kita beri nama StudentImport.php dan model yang kita gunakan adalah model Student.php

Pada saat kita jalankan perintah di atas, laravel akan membuatkan file SiswaImport.php dalam folder app/Imports

Buka file StudentImport.php tersebut.

app/Imports/StudentImport.php

<?php

namespace App\Imports;

use App\Student;
use Maatwebsite\Excel\Concerns\ToModel;

class StudentImport implements ToModel
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new Student([
            'fullname' => $row[1],
            'address' => $row[2], 
        ]);
    }
}

Di sini kita atur urutan data yang akan kita import dengan urutan kolum yang ada pada table siswa.

Di sini kita atur urutan data yang akan kita import dengan urutan kolum yang ada pada table siswa.

Index Kolom

Jadi untuk kolum fullname kita isi dengan kolom 0, kolum address kita isi dengan kolom 1.

Nantinya untuk proses import data excelnya, kita akan membuat sebuah tombol “IMPORT EXCEL”, dimana pada saat tombol tersebut diklik, kita akan memunculkan modal pop up. pada modal tersebut kita buatkan form input file excel.

Kemudian pada saat disubmit, maka data siswa yang ada dalam file excel tersebut semua kita simpan ke database. lebih tepatnya ke table siswa.

Buka file view student.blade.php yang sudah kita buat sebelumnya. karena kita akan menambahkan sebuah tombol untuk upload/import file excel.

resources/views/student.blade.php

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" content="{{ csrf_token() }}">
        <title>{{$title}}</title>
        <link rel="stylesheet" type="text/css" href="{{ asset('/css/app.css') }}">
    </head>
    <body>
      <div id="app">
        <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
            <a class="navbar-brand" href="#">Navbar</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
        </nav>
        <main class="py-4">
            <div class="container">
                <div class="card mt-5">
                    <div class="card-header text-center">
                        {{$title}}
                    </div>
                    <div class="card-body">
                        <button type="button" class="btn btn-primary m-2" data-toggle="modal" data-target="#importExcel">
                            IMPORT EXCEL
                        </button>
                        <table class="table table-bordered table-hover table-striped">
                            <thead>
                                <tr>
                                    <th>Nama</th>
                                    <th>Alamat</th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($list as $row)
                                <tr>
                                    <td>{{ $row->fullname }}</td>
                                    <td>{{ $row->address }}</td>
                                </tr>
                                @endforeach
                            </tbody>
                        </table>
                        <br/>
                        Halaman : {{ $list->currentPage() }} <br/>
                        Jumlah Data : {{ $list->total() }} <br/>
                        Data Per Halaman : {{ $list->perPage() }} <br/>
                    
                    
                        {{ $list->links() }}
                    </div>
                </div>
                <!-- Import Excel -->
                <div class="modal fade" id="importExcel" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
                    <div class="modal-dialog" role="document">
                        <form method="post" action="/student/import_excel" enctype="multipart/form-data">
                            <div class="modal-content">
                                <div class="modal-header">
                                    <h5 class="modal-title" id="exampleModalLabel">Import Excel</h5>
                                </div>
                                <div class="modal-body">

                                    {{ csrf_field() }}

                                    <label>Pilih file excel</label>
                                    <div class="form-group">
                                        <input type="file" name="file" required="required">
                                    </div>

                                </div>
                                <div class="modal-footer">
                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                                    <button type="submit" class="btn btn-primary">Import</button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </main>
        <footer class="container-fluid">
            <p>&copy; <a href="https://ombagoes.com">ombagoes.com</a>. 2019 - 2020</p>
        </footer>
      </div>
    </body>
    <script src="{{ asset('js/app.js') }}"></script>
</html>

Route

Tambahkan route berikut

Route::post('/student', 'StudentController@index');
Route::post('/student/import_excel', 'StudentController@doimport');

Controller

Buat Controller StudentController

php artisan make:controller StudentController

app/Http/Controllers/StudentController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Student;

use App\Imports\StudentImport;
use Maatwebsite\Excel\Facades\Excel;

class StudentController extends Controller
{
    public function index()
    {
        return view('student', ['title'=>'Students','list'=>Student::paginate(5)]);
    }
    public function import_excel(Request $request) 
	{
		$this->validate($request, [
			'file' => 'required|mimes:csv,xls,xlsx'
		]);
		$file = $request->file('file');
		$nama_file = rand().$file->getClientOriginalName();
		$file->move('file_student',$nama_file);
		Excel::import(new StudentImport, public_path('/file_student/'.$nama_file));
		return redirect('/student')->with('message','Data Siswa Berhasil Diimport!');
	}
}

Test Running

Jalankan project laravel kita menggunakan php artisan server, lalu buka web browser http://localhost:8000/student

Student
Form Upload
Setelah Upload

Leave a Reply

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

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>