Import Data dari File XLSX ke Database MySQL dengan Codeigniter 3
Import Data dari File XLSX ke Database MySQL dengan Codeigniter 3 [docs/kuhomi.id].

Import Data dari File XLSX ke Database MySQL dengan Codeigniter 3

Pada artikel kali ini, gua mau berbagi tutorial cara import data dari file spreaddsheet .xlsx ke database MySQL dengan menggunakan salah satu library package PHP dan Codeigniter 3.

Adapun library package PHP yang akan gua gunakan adalah PhpSpreadsheet. PhpSpreadsheet adalah library package PHP untuk membaca dan menulis (buat) file spreadsheet. Salah satu contoh nya adalah untuk membaca data pada file spreadsheet, lalu menyimpan data tersebut ke database MySQL. Proses tersebut sering disebut proses import data. 

Proses import data melalui codeigniter tentunya sangat membantu user, karena user tidak perlu melalukan insert data satu per satu dan juga tidak perlu membuat script tertentu setiap akan import data dan juga tidak perlu login ke dalam dashboard database MySQL seperti phpmyadmin. Sehingga dapat memperkecil resiko keamanan dan ketersediaan data.

Sebagai catatan, studi kasus dan data yang gua gunakan, hanya sebagai contoh ya..silahkan disesuaikan dengan studi kasus kalian.

Oke, langsung aja berikut caranya:

Download dan Install Codeigniter 3

Download dan install Codeigniter 3 (pada artikel ini, gua tidak menjelaskan mengenai konfigurasi dasar Codeigniter 3 hingga sampai siap digunakan ya..)

Install PhpSpreadsheet

Silahkan install package PhpSpreadsheet di dalam folder projek Codeigniter3 kalian ( [nama_projek_codeigniter]/ ) dengan command

composer require phpoffice/phpspreadsheet

Buat Database dan Table di MySQL

Selanjutnya adalah, silahkan buat database dan table pada MySQL. Pada artikel ini, gua mencoba buat database dengan nama “tutorial” dan table “buku”. Jalankan query MySQL dibawah ini untuk proses membuat table “buku”.
 

CREATE TABLE `buku` (
  `id` int(11) NOT NULL,
  `judul` varchar(255) NOT NULL,
  `penulis` varchar(200) NOT NULL,
  `penerbit` varchar(200) NOT NULL,
  `tgl_terbit` date NOT NULL,
  `jml_halaman` int(11) DEFAULT NULL,
  `isbn` varchar(100) DEFAULT NULL,
  `tgl_ditambahkan` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Mulai Ngoding

Silahkan buka projek Codeigniter 3 kalian dengan editor kesayangan kalian..

Buat File Model

Silahkan buat file model dan ketikkan atau copy kode program seperti di bawah ini. Disini gua memberikan nama file modelnya adalah Manage_spreadsheet_model.php. Penamaan file ini tidak baku ya, jadi terserah kalian mau memberikan nama file apa, dengan syarat nama class nya sama dengan nama filenya ya..

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Manage_spreadsheet_model extends CI_Model{

  public function __construct() {
    parent::__construct();
    $this->table = 'buku';
    $this->db = $this->load->database('default',TRUE);
  }

  public function add($data) {
    $this->db->insert($this->table, $data);
    return $this->db->insert_id();
  }

  public function get($where = 0) {
    if($where) 
      $this->db->where($where);
    $query = $this->db->get($this->table);
    return $query->row();
  }

  public function add_batch($data) {
    return $this->db->insert_batch($this->table, $data);
  }
}

Buat File View

Silahkan buat file view dan  ketikkan atau copy kode program seperti di bawah ini. File view ini berfungsi untuk menampilkan antarmuka untuk proses upload file dan tombol submit untuk proses import data

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?><!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Import Data Buku</title>
        <style type="text/css">
        h1{
        text-align: center;
        }
        </style>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
        <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>
    </head>
    <body>
        
        <div class="col-md-6 offset-md-3 mt-5">
            <h1>Import Data Buku</h1>
            <?php $alert = $this->session->flashdata('alert'); ?>
            <?php if(!empty($alert)): ?>
            <div class="alert alert-<?=$alert['class']?>">
                <a href="#" class="close" id="btnclose-alert">&times;</a>
                <?=$alert['message']?>
            </div>
            <script type="text/javascript">
            $('#btnclose-alert').click(function(e){
            e.preventDefault();
            $(this).parent().fadeOut('slow');
            });
            </script>
            <?php endif; ?>
            <form action="/manage_spreadsheet/import" method="POST" enctype="multipart/form-data">
                <div class="form-group mt-3">
                    <label class="mr-2">Upload File XLSX:</label>
                    <input type="file" name="file">
                </div>
                <hr>
                <button type="submit" class="btn btn-primary">Submit</button>
            </form>
        </div>
    </body>
</html>

Buat File Controller

Silahkan buat file controller dan ketikkan atau copy kode program seperti di bawah ini. Untuk penjelasannya gua selipkan komentar di kode programnya. Disini gua memberikan nama file modelnya adalah Manage_spreadsheet.php. Penamaan file ini tidak baku ya, jadi terserah kalian mau memberikan nama file apa, dengan syarat nama class nya sama dengan nama filenya ya..

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
date_default_timezone_set('Asia/Jakarta');

//load package composer
require 'vendor/autoload.php';

//deklarasi package yang ingin digunakan
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

class Manage_spreadsheet extends CI_Controller {
	
	public function __construct() {
		parent::__construct();
		// Load file model yang akan digunakan
		$this->load->model('manage_spreadsheet_model');
	}
	
	public function index() {
		// Load view form upload
	    $this->load->view("manage_spreadsheet/index");
	}

	public function import() {
		// Path directory/folder untuk menyimpan file xls yang di upload
		$path 		= './assets/temp/files/';

		// Memanggil fungsi upload_config() untuk inisialisasi fungsi upload
		$this->upload_config($path);
		if (!$this->upload->do_upload('file')) {
			//jika proses upload gagal, set flash message error lalu redirect ke halaman form
			$this->session->set_flashdata('msg', $this->upload->display_errors());
			redirect('/manage_spreadsheet');
		} else {
			//get data file yang di upload
			$file_data 	= $this->upload->data();
			//get full path hingga ke filename
			$file_name 	= $path.$file_data['file_name'];
			//proses untuk get extension file
			$arr_file 	= explode('.', $file_name);
			$extension 	= end($arr_file);
			//cek dan validasi jika file yang di upload ber ekstensi xlsx
			if($extension == 'xlsx') {
				 // jika file xlsx, buat object reader xlsx.
				$reader 	= new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
			} else {
				// jika salah, set flash message error lalu redirect ke halaman form
				$this->session->set_flashdata('alert',array(
                        'class' => 'warning',
                        'message' => 'Tipe file yang diijinkan hanya .xlsx'
                    )
                );				
				redirect('/manage_spreadsheet');
			}
			//proses extrac data yang ada pada file xlsx
			$spreadsheet 	= $reader->load($file_name);
			$sheet_data 	= $spreadsheet->getActiveSheet()->toArray();
			$list 			= [];
			foreach($sheet_data as $key => $val) {
				if($key != 0) {
					// cek supaya tidak ada duplikasi data
					$result 	= $this->manage_spreadsheet_model->get(array("isbn" => $val[5]));
					if($result == FALSE || empty($result)) {
						$list [] = [
							'judul'				=> $val[0],
							'penulis'			=> $val[1],
							'penerbit'			=> $val[2],
							'tgl_terbit'		=> $val[3],
							'jml_halaman'		=> $val[4],
							'isbn'				=> $val[5],
							'tgl_ditambahkan' 	=> date("Y-m-d H:i:s")
						];
					} 
				}
			}
			if(file_exists($file_name))
				//hapus kembali file, supaya tidak memenuhi server
				unlink($file_name);
			
			if(count($list) > 0) {
				// proses insert batch data dari file xlsx ke mysql
				$result 	= $this->manage_spreadsheet_model->add_batch($list);
				if($result) {
					$this->session->set_flashdata('alert',array(
                        	'class' => 'success',
                        	'message' => 'Sukses Import Data'
                    	)
                	);	
					redirect('/manage_spreadsheet');
				} else {
					$this->session->set_flashdata('alert',array(
                        	'class' => 'danger',
                        	'message' => 'Maaf, Import Data Gagal'
                    	)
                	);
					redirect('/manage_spreadsheet');
				}
			} else {
				$this->session->set_flashdata('alert',array(
                        	'class' => 'warning',
                        	'message' => 'Data Sudah Ada di Database'
                    	)
                );
				redirect('/manage_spreadsheet');
			}
		}
		redirect('/manage_spreadsheet');
	}

	public function upload_config($path) {
		if (!is_dir($path)) 
			mkdir($path, 0755, TRUE);		
		$config['upload_path'] 		= './'.$path;		
		$config['allowed_types'] 	= 'xlsx|XLSX|xls|XLS';
		$config['max_filename']	 	= '255';
		$config['encrypt_name'] 	= TRUE;
		$config['max_size'] 		= 4096; 
		$this->load->library('upload', $config);
	}
}

Proses Uji Coba

Siapkan file .xlsx dan data dumyy, kurang lebih seperti capture di bawah ini. Sekali lagi, data yang gua gunakan adalah data dummy yang gua ambil dari Toko Buku Gramedia Online

Data dummy file excel untuk test import data ke MySQL

Yang perlu diperhatikan adalah format date nya ‘YYYY-mm-dd’, supaya pas insert ke database tidak berbeda.

Akses fungsi index controller Manage_spreadsheet.php melalui browser. Lakukan proses upload file tersebut dan import data, setelah itu cek ke phpmyadmin apakah data yang di import sudah masuk dan sesuai.

View Form Data untuk Upload FIle Excel
Untuk alternatif nya, kalian bisa juga cek tutorial Cara Import Data dari File CSV ke Database MySQL dengan Codeigniter 3

Artikel Terkait