Sabtu, 10 Desember 2016

Cara Membuat Import Data Excel dengan PHP dan MySQL


Catatan kali ini akan membahas mengenai cara membuat import data dari file excel dengan menggunakan PHP dan database MySQL. Pada catatan ini, kita akan menggunakan sebuah librari yaitu PHPExcel. Librari ini yang nantinya akan kita gunakan untuk mebaca isi dari file excel yang akan kita import ke database. Ikuti langkah-langkahnya berikut ini.
Berikut adalah fitur-fitur yang akan kita buat:
  1. View Data dari Database.
  2. Form untuk Import Data.
  3. Preview Data yang akan diimport sebelum di simpan ke database.
  4. Validasi terhadap file yang dipilih oleh User pada form import. Hanya file Microsoft Office 2007 (.xlsx) yang diperbolehkan.
  5. Validasi terhadap input data. Jika ada data yang kosong / belum diisi, sistem akan memberitahu jumlah data yang kosong dan data mana saja.

DEMOSebelum masuk ke tutorialnya. Mungkin ada yang mau lihat demonya terlebih dahulu. Silahkan klik link berikut untuk melihat demonya : Lihat Demo.

STEP 1 – PERSIAPAN

Berikut ini adalah hal-hal yang harus dipersiapkan :

  1. Download Bootstrap, Klik link berikut : Download.
  2. Download Jquery, Klik link berikut : Download.
  3. Download librari PHPExcel nya, klik link berikut ini : Download.
  4. Download format import data excel, klik link berikut : Download. File ini berfungsi sebagai format excel yang digunakan untuk import data.
  5. Buat sebuah folder dengan nama import_php, lalu simpan pada folder xampp/htdocs/.
  6. Buat sebuah folder dengan nama tmp, lalu simpan pada folder xampp/htdocs/import_php/.
  7. Buat sebuah folder dengan nama css, lalu simpan pada folder xampp/htdocs/import_php/.
  8. Buat sebuah folder dengan nama js, lalu simpan pada folder xampp/htdocs/import_php/.
  9. Esktrak file bootstrap.7z yang telah didownload tadi.
  10. Copy and paste folder fonts dari folder bootstrap yang telah diekstrak tadi ke folder xampp/htdocs/import_php/.
  11. Copy and paste file bootstrap.min.css dari folder bootstrap/css/ yang telah diekstrak tadi ke folder xampp/htdocs/import_php/css/.
  12. Rename file JQUERY yang telah di downlaod tadi menjadi jquery.min.js, lalu copy and paste pada folder xampp/htdocs/import_php/js/.
  13. Ekstrak file librari PHPExcel.7z yang telah didownload tadi.
  14. Copy and paste folder PHPExcel hasil ekstrak file tadi ke folder xampp/htdocs/import_php/.
  15. Copy and paste file Format.xlsx yang telah didownload ke folder xampp/htdocs/import_php/.

STEP 2 – DATABASE

Pada step ini, kita akan membuat databasenya. ikuti langkah-langkah berikut ini :
  1. Buat sebuah database dengan nama mynotescode.
  2. Buat sebuah tabel dengan nama siswa. Struktur tabelnya sebagai berikut :
    1. CREATE TABLE IF NOT EXISTS `siswa` (
    2. `nis` varchar(11) NOT NULL,
    3. `nama` varchar(50) NOT NULL,
    4. `jenis_kelamin` varchar(10) NOT NULL,
    5. `telp` varchar(15) NOT NULL,
    6. `alamat` text NOT NULL,
    7. PRIMARY KEY (`nis`)
    8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


STEP 3 – KONEKSI DATABASE

Pada step ini, kita akan membuat file php yang berfungsi untuk menghubungkan dengan database MySQL. Silahkan buat file koneksi.php, lalu simpan di folder xampp/htdocs/import_php/. Berikut ini kodenya :
  1. <?php
  2. $host = 'localhost'; // Nama hostnya
  3. $username = 'root'; // Username
  4. $password = ''; // Password (Isi jika menggunakan password)
  5. $database = 'mynotescode'; // Nama databasenya
  6. // Koneksi ke MySQL dengan PDO
  7. $pdo = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
  8. ?>

STEP 4 – VIEW DATASelanjutnya kita akan membuat sebuah file php yang berfungsi untuk menampilkan data hasil import data dari database. Buat sebuah file baru dengan nama index.php, lalu simpan pada folder xampp/htdocs/import_php/. Berikut ini tampilan dan kodenya :
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Import Data dengan PHP</title>
  8. <!-- Load File bootstrap.min.css yang ada difolder css -->
  9. <link href="css/bootstrap.min.css" rel="stylesheet">
  10. <!-- Style untuk Loading -->
  11. <style>
  12. #loading{
  13. background: whitesmoke;
  14. position: absolute;
  15. top: 140px;
  16. left: 82px;
  17. padding: 5px 10px;
  18. border: 1px solid #ccc;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <!-- Membuat Menu Header / Navbar -->
  24. <nav class="navbar navbar-inverse" role="navigation">
  25. <div class="container-fluid">
  26. <div class="navbar-header">
  27. <a class="navbar-brand" href="#" style="color: white;"><b>Import Data dengan PHP</b></a>
  28. </div>
  29. <p class="navbar-text navbar-right hidden-xs" style="color: white;padding-right: 10px;">
  30. FOLLOW US ON
  31. <a target="_blank" style="background: #3b5998; padding: 0 5px; border-radius: 4px; color: #f7f7f7; text-decoration: none;" href="https://www.facebook.com/mynotescode">Facebook</a>
  32. <a target="_blank" style="background: #00aced; padding: 0 5px; border-radius: 4px; color: #ffffff; text-decoration: none;" href="https://twitter.com/code_notes">Twitter</a>
  33. <a target="_blank" style="background: #d34836; padding: 0 5px; border-radius: 4px; color: #ffffff; text-decoration: none;" href="https://plus.google.com/118319575543333993544">Google+</a>
  34. </p>
  35. </div>
  36. </nav>
  37. <!-- Content -->
  38. <div style="padding: 0 15px;">
  39. <!--
  40. -- Buat sebuah tombol untuk mengarahkan ke form import data
  41. -- Tambahkan class btn agar terlihat seperti tombol
  42. -- Tambahkan class btn-success untuk tombol warna hijau
  43. -- class pull-right agar posisi link berada di sebelah kanan
  44. -->
  45. <a href="form.php" class="btn btn-success pull-right">
  46. <span class="glyphicon glyphicon-upload"></span> Import Data
  47. </a>
  48. <h3>Data Hasil Import</h3>
  49. <hr>
  50. <!-- Buat sebuah div dan beri class table-responsive agar tabel jadi responsive -->
  51. <div class="table-responsive">
  52. <table class="table table-bordered">
  53. <tr>
  54. <th>No</th>
  55. <th>NIS</th>
  56. <th>Nama</th>
  57. <th>Jenis Kelamin</th>
  58. <th>Telepon</th>
  59. <th>Alamat</th>
  60. </tr>
  61. <?php
  62. // Load file koneksi.php
  63. include "koneksi.php";
  64. // Buat query untuk menampilkan semua data siswa
  65. $sql = $pdo->prepare("SELECT * FROM siswa");
  66. $sql->execute(); // Eksekusi querynya
  67. $no = 1; // Untuk penomoran tabel, di awal set dengan 1
  68. while($data = $sql->fetch()){ // Ambil semua data dari hasil eksekusi $sql
  69. echo "<tr>";
  70. echo "<td>".$no."</td>";
  71. echo "<td>".$data['nis']."</td>";
  72. echo "<td>".$data['nama']."</td>";
  73. echo "<td>".$data['jenis_kelamin']."</td>";
  74. echo "<td>".$data['telp']."</td>";
  75. echo "<td>".$data['alamat']."</td>";
  76. echo "</tr>";
  77. $no++; // Tambah 1 setiap kali looping
  78. }
  79. ?>
  80. </table>
  81. </div>
  82. </div>
  83. </body>
  84. </html>
Saya akan coba jelaskan sedikit mengenai kode diatas.
include “koneksi.php”;
Kode tersebut berfungsi untuk me-load file koneksi.php.
$sql = $pdo->prepare(“SELECT * FROM siswa”);
$sql->execute();
Kode tersebut berfungsi untuk melakukan query ke database dan mengeksekusinya. Pada cotoh diatas, kita akan melakukan query untuk menampilkan semua data dari tabel siswa.
$data = $sql->fetch()
Kode tersebut berfungsi untuk mengambil semua data hasil query dan menampung data-data tersebut di dalam sebuah array lalu menyimpannya ke dalam variabel $data. Kode tersebut saya simpan di dalam sebuah kode while(….) yang berfungsi untuk melakukan proses perulangan sampai data terkahir dengan tujuan agar kita bisa menampilkan datanya satu per satu.
  1. echo "<tr>";
  2. echo "<td>".$no."</td>";
  3. echo "<td>".$data['nis']."</td>";
  4. echo "<td>".$data['nama']."</td>";
  5. echo "<td>".$data['jenis_kelamin']."</td>";
  6. echo "<td>".$data['telp']."</td>";
  7. echo "<td>".$data['alamat']."</td>";
  8. echo "</tr>";
Pada kode diatas terdapat variabel $data digunakan untuk mengambil isi dari field-field yang ada pada tabel siswa di database mynotescode. Pada kode diatas juga ada kode yang berada pada tanda [‘……’], kode tersebut harus sama dengan nama field yang ada pada tabel siswa.

STEP 5 – FORM DAN PREVIEWL

angkah selanjutnya kita akan membuat sebuah form untuk import data excelnya. Buat sebuah file baru dengan nama form.php, lalu simpan pada folder xampp/htdocs/import_php/. Berikut tampilan dan kodenya :
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Import Data Excel dengan PHP</title>
  8. <!-- Load File bootstrap.min.css yang ada difolder css -->
  9. <link href="css/bootstrap.min.css" rel="stylesheet">
  10. <!-- Style untuk Loading -->
  11. <style>
  12. #loading{
  13. background: whitesmoke;
  14. position: absolute;
  15. top: 140px;
  16. left: 82px;
  17. padding: 5px 10px;
  18. border: 1px solid #ccc;
  19. }
  20. </style>
  21. <!-- Load File jquery.min.js yang ada difolder js -->
  22. <script src="js/jquery.min.js"></script>
  23. <script>
  24. $(document).ready(function(){
  25. // Sembunyikan alert validasi kosong
  26. $("#kosong").hide();
  27. });
  28. </script>
  29. </head>
  30. <body>
  31. <!-- Membuat Menu Header / Navbar -->
  32. <nav class="navbar navbar-inverse" role="navigation">
  33. <div class="container-fluid">
  34. <div class="navbar-header">
  35. <a class="navbar-brand" href="#" style="color: white;"><b>Import Data Excel dengan PHP</b></a>
  36. </div>
  37. <p class="navbar-text navbar-right hidden-xs" style="color: white;padding-right: 10px;">
  38. FOLLOW US ON
  39. <a target="_blank" style="background: #3b5998; padding: 0 5px; border-radius: 4px; color: #f7f7f7; text-decoration: none;" href="https://www.facebook.com/mynotescode">Facebook</a>
  40. <a target="_blank" style="background: #00aced; padding: 0 5px; border-radius: 4px; color: #ffffff; text-decoration: none;" href="https://twitter.com/code_notes">Twitter</a>
  41. <a target="_blank" style="background: #d34836; padding: 0 5px; border-radius: 4px; color: #ffffff; text-decoration: none;" href="https://plus.google.com/118319575543333993544">Google+</a>
  42. </p>
  43. </div>
  44. </nav>
  45. <!-- Content -->
  46. <div style="padding: 0 15px;">
  47. <!-- Buat sebuah tombol Cancel untuk kemabli ke halaman awal / view data -->
  48. <a href="index.php" class="btn btn-danger pull-right">
  49. <span class="glyphicon glyphicon-remove"></span> Cancel
  50. </a>
  51. <h3>Form Import Data</h3>
  52. <hr>
  53. <!-- Buat sebuah tag form dan arahkan action nya ke file ini lagi -->
  54. <form method="post" action="" enctype="multipart/form-data">
  55. <a href="Format.xlsx" class="btn btn-default">
  56. <span class="glyphicon glyphicon-download"></span>
  57. Download Format
  58. </a><br><br>
  59. <!--
  60. -- Buat sebuah input type file
  61. -- class pull-left berfungsi agar file input berada di sebelah kiri
  62. -->
  63. <input type="file" name="file" class="pull-left">
  64. <button type="submit" name="preview" class="btn btn-success btn-sm">
  65. <span class="glyphicon glyphicon-eye-open"></span> Preview
  66. </button>
  67. </form>
  68. <hr>
  69. <!-- Buat Preview Data -->
  70. <?php
  71. // Jika user telah mengklik tombol Preview
  72. if(isset($_POST['preview'])){
  73. //$ip = ; // Ambil IP Address dari User
  74. $nama_file_baru = 'data.xlsx';
  75. // Cek apakah terdapat file data.xlsx pada folder tmp
  76. if(is_file('tmp/'.$nama_file_baru)) // Jika file tersebut ada
  77. unlink('tmp/'.$nama_file_baru); // Hapus file tersebut
  78. $tipe_file = $_FILES['file']['type']; // Ambil tipe file yang akan diupload
  79. $tmp_file = $_FILES['file']['tmp_name'];
  80. // Cek apakah file yang diupload adalah file Excel 2007 (.xlsx)
  81. if($tipe_file == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"){
  82. // Upload file yang dipilih ke folder tmp
  83. // dan rename file tersebut menjadi data{ip_address}.xlsx
  84. // {ip_address} diganti jadi ip address user yang ada di variabel $ip
  85. // Contoh nama file setelah di rename : data127.0.0.1.xlsx
  86. move_uploaded_file($tmp_file, 'tmp/'.$nama_file_baru);
  87. // Load librari PHPExcel nya
  88. require_once 'PHPExcel/PHPExcel.php';
  89. $excelreader = new PHPExcel_Reader_Excel2007();
  90. $loadexcel = $excelreader->load('tmp/'.$nama_file_baru); // Load file yang tadi diupload ke folder tmp
  91. $sheet = $loadexcel->getActiveSheet()->toArray(null, true, true ,true);
  92. // Buat sebuah tag form untuk proses import data ke database
  93. echo "<form method='post' action='import.php'>";
  94. // Buat sebuah div untuk alert validasi kosong
  95. echo "<div class='alert alert-danger' id='kosong'>
  96. Semua data belum diisi, Ada <span id='jumlah_kosong'></span> data yang belum diisi.
  97. </div>";
  98. echo "<table class='table table-bordered'>
  99. <tr>
  100. <th colspan='5' class='text-center'>Preview Data</th>
  101. </tr>
  102. <tr>
  103. <th>NIS</th>
  104. <th>Nama</th>
  105. <th>Jenis Kelamin</th>
  106. <th>Telepon</th>
  107. <th>Alamat</th>
  108. </tr>";
  109. $numrow = 1;
  110. $kosong = 0;
  111. foreach($sheet as $row){ // Lakukan perulangan dari data yang ada di excel
  112. // Ambil data pada excel sesuai Kolom
  113. $nis = $row['A']; // Ambil data NIS
  114. $nama = $row['B']; // Ambil data nama
  115. $jenis_kelamin = $row['C']; // Ambil data jenis kelamin
  116. $telp = $row['D']; // Ambil data telepon
  117. $alamat = $row['E']; // Ambil data alamat
  118. // Cek jika semua data tidak diisi
  119. if(empty($nis) && empty($nama) && empty($jenis_kelamin) && empty($telp) && empty($alamat))
  120. continue; // Lewat data pada baris ini (masuk ke looping selanjutnya / baris selanjutnya)
  121. // Cek $numrow apakah lebih dari 1
  122. // Artinya karena baris pertama adalah nama-nama kolom
  123. // Jadi dilewat saja, tidak usah diimport
  124. if($numrow > 1){
  125. // Validasi apakah semua data telah diisi
  126. $nis_td = ( ! empty($nis))? "" : " style='background: #E07171;'"; // Jika NIS kosong, beri warna merah
  127. $nama_td = ( ! empty($nama))? "" : " style='background: #E07171;'"; // Jika Nama kosong, beri warna merah
  128. $jk_td = ( ! empty($jenis_kelamin))? "" : " style='background: #E07171;'"; // Jika Jenis Kelamin kosong, beri warna merah
  129. $telp_td = ( ! empty($telp))? "" : " style='background: #E07171;'"; // Jika Telepon kosong, beri warna merah
  130. $alamat_td = ( ! empty($alamat))? "" : " style='background: #E07171;'"; // Jika Alamat kosong, beri warna merah
  131. // Jika salah satu data ada yang kosong
  132. if(empty($nis) or empty($nama) or empty($jenis_kelamin) or empty($telp) or empty($alamat)){
  133. $kosong++; // Tambah 1 variabel $kosong
  134. }
  135. echo "<tr>";
  136. echo "<td".$nis_td.">".$nis."</td>";
  137. echo "<td".$nama_td.">".$nama."</td>";
  138. echo "<td".$jk_td.">".$jenis_kelamin."</td>";
  139. echo "<td".$telp_td.">".$telp."</td>";
  140. echo "<td".$alamat_td.">".$alamat."</td>";
  141. echo "</tr>";
  142. }
  143. $numrow++; // Tambah 1 setiap kali looping
  144. }
  145. echo "</table>";
  146. // Cek apakah variabel kosong lebih dari 1
  147. // Jika lebih dari 1, berarti ada data yang masih kosong
  148. if($kosong > 1){
  149. ?>
  150. <script>
  151. $(document).ready(function(){
  152. // Ubah isi dari tag span dengan id jumlah_kosong dengan isi dari variabel kosong
  153. $("#jumlah_kosong").html('<?php echo $kosong; ?>');
  154. $("#kosong").show(); // Munculkan alert validasi kosong
  155. });
  156. </script>
  157. <?php
  158. }else{ // Jika semua data sudah diisi
  159. echo "<hr>";
  160. // Buat sebuah tombol untuk mengimport data ke database
  161. echo "<button type='submit' name='import' class='btn btn-primary'><span class='glyphicon glyphicon-upload'></span> Import</button>";
  162. }
  163. echo "</form>";
  164. }else{ // Jika file yang diupload bukan File Excel 2007 (.xlsx)
  165. // Munculkan pesan validasi
  166. echo "<div class='alert alert-danger'>
  167. Hanya File Excel 2007 (.xlsx) yang diperbolehkan
  168. </div>";
  169. }
  170. }
  171. ?>
  172. </div>
  173. </body>
  174. </html>

Saya tidak akan menjelaskan soal skrip diatas, karena sudah saya jelaskan per masing-masing skrip (dengan komentar). Tapi saya akan jelaskan alur form import diatas. Pertama, User harus mendownload Format File Excel yang sudah kita buat sebelumnya. Kedua, User megisi data yang akan diimport pada file excel yang telah di download tadi. Ketiga, user memilih file excel yang akan diimport datanya lalu klik tombol preview. Keempat, Ketika user mengklik tombol preview, sistem akan melakukan:
  1. Validasi apakah file yang dipilih memiliki format microsoft excel 2007 (.xlsx) atau tidak
  2. Validasi apakah user telah mengisi semua data yang diperlukan pada file excel tersebut. Jika masih ada yang kosong / belum diisi, sistem akan memberi informasi berupa jumlah data yang masih kosong dan memberi tahu user data mana saja yang kosong dengan cara memberi background merah pada kolom / baris yang kosong (pada tabel preview)
  3. Apabila lolos dari kedua validasi yang saya sebutkan diatas, sistem akan memunculkan tombol Import untuk melakukan proses import data. Tapi apabila ternyata tidak lolos validasi, tombol import tidak akan muncul.

STEP 5 – PROSES IMPORT

Terakhir, kita akan membuat file php untuk memproses import data ke databasenya. Buat sebuah file baru dengan nama import.php, lalu simpan pada folder xampp/htdocs/import_php/. Berikut ini kodenya :
  1. <?php
  2. // Load file koneksi.php
  3. include "koneksi.php";
  4. if(isset($_POST['import'])){ // Jika user mengklik tombol Import
  5. $nama_file_baru = 'data.xlsx';
  6. // Load librari PHPExcel nya
  7. require_once 'PHPExcel/PHPExcel.php';
  8. $excelreader = new PHPExcel_Reader_Excel2007();
  9. $loadexcel = $excelreader->load('tmp/'.$nama_file_baru); // Load file excel yang tadi diupload ke folder tmp
  10. $sheet = $loadexcel->getActiveSheet()->toArray(null, true, true ,true);
  11. // Buat query Insert
  12. $sql = $pdo->prepare("INSERT INTO siswa VALUES(:nis,:nama,:jk,:telp,:alamat)");
  13. $numrow = 1;
  14. foreach($sheet as $row){
  15. // Ambil data pada excel sesuai Kolom
  16. $nis = $row['A']; // Ambil data NIS
  17. $nama = $row['B']; // Ambil data nama
  18. $jenis_kelamin = $row['C']; // Ambil data jenis kelamin
  19. $telp = $row['D']; // Ambil data telepon
  20. $alamat = $row['E']; // Ambil data alamat
  21. // Cek jika semua data tidak diisi
  22. if(empty($nis) && empty($nama) && empty($jenis_kelamin) && empty($telp) && empty($alamat))
  23. continue; // Lewat data pada baris ini (masuk ke looping selanjutnya / baris selanjutnya)
  24. // Cek $numrow apakah lebih dari 1
  25. // Artinya karena baris pertama adalah nama-nama kolom
  26. // Jadi dilewat saja, tidak usah diimport
  27. if($numrow > 1){
  28. // Proses simpan ke Database
  29. $sql->bindParam(':nis', $nis);
  30. $sql->bindParam(':nama', $nama);
  31. $sql->bindParam(':jk', $jenis_kelamin);
  32. $sql->bindParam(':telp', $telp);
  33. $sql->bindParam(':alamat', $alamat);
  34. $sql->execute(); // Eksekusi query insert
  35. }
  36. $numrow++; // Tambah 1 setiap kali looping
  37. }
  38. }
  39. header('location: index.php'); // Redirect ke halaman awal
  40. ?>
Sedikit tambahan penjelasan dari skrip diatas :
$nis = $row[‘A‘]; // Ambil data NIS
$nama = $row[‘B‘]; // Ambil data nama
$jenis_kelamin = $row[‘C‘]; // Ambil data jenis kelamin
$telp = $row[‘D‘]; // Ambil data telepon
$alamat = $row[‘E‘]; // Ambil data alamat

Yang saya beri warna merah pada skrip diatas harus sama dengan nama kolom yang ada d file excel yang akan diimport. Lihat gambar dibawah ini untuk lebih jelasnya :



Source CodeUntuk download source codenya, silahkan klik link berikut : Download.
Bingung cara downloadnya? klik disini untuk mengetahui caranya.
Sumber & Referensi
Dokumentasi Bootstrap : http://getbootstrap.com
Dokumentasi PHPExcel : https://github.com/PHPOffice/PHPExcel/wiki/User%20Documentation
Tutorial import data dari excel dengan php dan mysql, Tutorial import data dari excel dengan PHPExcel, Cara import data excel dengan php dan mysql, import data excel dengan PHPExcel, import data dari excel dengan php dan mysql