Tutorial membuat import data csv (excel) pada CodeIgniter

Gambar ilustrasi

Sesuai dengan judul, tema yang akan kita bahas kali ini adalah bagaimana membuat fitur import dari dari file csv (comma separated value) pada CodeIgniter.

Fitur import akan memudahkan user dalam meng-inputkan data ke dalam sistem aplikasi secara massal. Bayangkan jika harus memasukkan data dalam jumlah yang banyak, pasti akan lama dan melelahkan.

Dengan adanya fitur import, proses input data akan menjadi lebih mudah dan cepat karena dengan sekali input maka semua data akan otomatis tersimpan ke dalam sistem.

Sebelum menginjak ke tutorial membuat import, pastikan kita sudah memiliki sebuah proyek CodeIgniter yang sudah dikonfigurasi sedemikian rupa termasuk database, base_url, autoload, routing dan sebagainya.

Baca juga Membuat base URL dinamis pada CodeIgniter

Oke sekarang kita lanjut ke tutorial membuat import data csv pada CodeIgniter.

1. Persiapan

Siapkan sebuah file csv yang berisi data dengan format di bawah ini dan simpan dengan nama pelanggan.csv.

Data pelanggan Contoh data pelanggan.csv

Jika sudah, buat sebuah table baru pada database dengan struktur seperti ini:

FieldTipe dataPanjang dataEkstra
idint5auto increment
namavarchar50
no_hpvarchar12
emailvarchar50
alamatvarchar255

Setelah selesai membuat table baru, silakan atur konfigurasi autoload.php seperti ini:

$autoload['libraries'] = array('database');
$autoload['helper'] = array('form', 'url');
$autoload['model'] = array('pelanggan');

2. Membuat controller

Setelah file pelanggan.csv dan table pelanggan sudah kita buat, saatnya kita membuat controller.

Buat controller baru bernama Import.php. Masukkan kode di bawah ini pada Import.php yang baru dibuat lalu simpan.

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

class Import extends CI_Controller {

	/**
	 * Menampilkan halaman import data.
	 *
	 */
	public function index()
	{
		// Action form.
		$data['action'] = site_url('import/process');

		$this->load->view('import', $data);
	}

	/**
	 * Memproses data yang di-import.
	 *
	 */
	public function process()
	{
		if ( isset($_POST['import'])) {

            $file = $_FILES['pelanggan']['tmp_name'];

			// Mendapatkan ekstensi file csv yang akan di-import.
			$ekstensi  = explode('.', $_FILES['pelanggan']['name']);

			// Tampilkan peringatan jika submit tanpa memilih menambahkan file.
			if (empty($file)) {
				echo 'File tidak boleh kosong!';
			} else {
				// Validasi apakah file yang di-upload benar-benar file csv.
				if (strtolower(end($ekstensi)) === 'csv' && $_FILES["pelanggan"]["size"] > 0) {

					$i = 0;
					$handle = fopen($file, "r");
					while (($row = fgetcsv($handle, 2048))) {
						$i++;
						if ($i == 1) continue;

						// Data yang akan disimpan ke dalam database
						$data = [
							'nama' => $row[1],
							'no_hp' => $row[2],
							'email' => $row[3],
							'alamat' => $row[4],
						];

						// Simpan data ke database.
						$this->pelanggan->save($data);
					}

					fclose($handle);
					redirect('data');

				} else {
					echo 'Format file tidak valid!';
				}
			}
        }
	}
}

Controller tersebut berfungsi untuk menampilkan halaman import serta memproses import data.

Next…

Buat lagi sebuah controller dan beri nama Data.php lalu isi dengan kode berikut ini:

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

class Data extends CI_Controller {

	/**
	 * Menampilkan data yang sudah di-import.
	 *
	 */
	public function index()
	{
		$data['pelanggan'] = $this->pelanggan->get_all();
		$this->load->view('data', $data);
	}
}

Controller Data.php berfungsi untuk menampilkan data yang telah ter-import.

3. Membuat model

Agar data yang akan kita import dapat disimpan ke dalam database, maka kita perlu membuat model.

Silakan buat model baru bernama Pelanggan.php lalu isi dengan di bawah ini:

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

class Pelanggan extends CI_Model {

    /**
     * Constructor.
     *
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Fungsi untuk insert data ke dalam database.
     *
     */
    public function save($data)
    {
        return $this->db->insert('pelanggan', $data);
    }

    /**
     * Fungsi untuk menampilkan data dari database.
     *
     */
    public function get_all()
    {
        return $this->db->get('pelanggan')->result_array();
    }
}

4. Membuat view

Untuk menampilkan form import dan juga data yang sudah ter-import, kita harus membuat view terlebih dahulu.

Silakan buat view bernama import.php dan isi dengan kode di bawah ini:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Import Data Pelanggan</title>
	</head>
	<body>
		<a href="<?php echo site_url('data'); ?>">Lihat Data</a>
		<br>
		<?php echo form_open_multipart($action); ?>
			<h2>Import Data Pelanggan</h2>
			<input type="file" name="pelanggan" accept="text/csv">
			<br>
			<br>
			<button type="submit" name="import">Import Data</button>
		<?php echo form_close(); ?>
	</body>
</html>

Hasilnya seperti ini:

Import form Tampilan form import

Kita sudah berhasil membuat view untuk menampilkan form import. Sekarang buat lagi sebuah view bernama data.php untuk menampilkan data yang sudah ter-import.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Data Hasil Import</title>
	</head>
	<style media="screen">
		table {
			border: 1px solid #ddd;
			border-collapse: collapse;
		}
		th {
			text-align: left;
		}
		th, td {
			border: 1px solid #ddd;
			padding: 10px;
		}
	</style>
	<body>
		<a href="<?php echo site_url('import'); ?>">Import Data</a>
		<br>
		<h2>Data Hasil Import</h2>
		<table>
			<thead>
				<tr>
					<th>No.</th>
					<th width="200px">Nama</th>
					<th width="140px">No. HP</th>
					<th width="180px">Email</th>
					<th width="250px">Alamat</th>
				</tr>
			</thead>
			<tbody>
				<?php if ( ! empty($pelanggan)) { ?>
					<?php
						$no = 0;
						foreach ($pelanggan as $data) {
						$no++;
					?>
						<tr>
							<td><?php echo $no; ?></td>
							<td><?php echo $data['nama']; ?></td>
							<td><?php echo $data['no_hp']; ?></td>
							<td><?php echo $data['email']; ?></td>
							<td><?php echo $data['alamat']; ?></td>
						</tr>
					<?php } ?>
				<?php } else {?>
					<tr>
						<td colspan="5">Tidak ada data!</td>
					</tr>
				<?php } ?>
			</tbody>
		</table>
	</body>
</html>

Hasilnya seperti ini:

Empty data Tampilan list data kosong

Karena data belum di-import, maka tampil pesan Tidak ada data!.

Sekarang silakan dicoba untuk import data, jika tidak ada error maka data akan tampil seperti ini:

Imported data Tampilan list data ter-import