Java : Membaca Data dari File Excel(XLS) dan Memasukkannya ke Database MySQL

Last Updated on 12 years by Mas Herdi

Pada database MySQL, sebenarnya sudah disediakan fitur tersendiri untuk mengimpor database dari file Excel(XLS). Namun fitur itu masih belum bisa menyesuaikan ke dalam struktur tabel yang lama, jadi apabila kita menggunakan fitur impor dari XLS yang biasa, nantinya fitur tersebut akan membuat tabel baru beserta nama-nama kolom yang baru. Dan perlu kerja manual untuk memindahkan dan menyesuaikan ke tabel yang lama. Benar-benar tidak dinamis.

Dan, ini cara yang dinamis. Well, sebenarnya juga tidak pure 100% dinamis (e.g. code ini bisa berjalan pada file excel dengan layout data apapun, dan database apapun), code ini masih perlu penyesuaian terhadap database dan file excel yang Anda buat. Yah, anggap saja sebagai pengetahuan 🙂

Pre-Requisites Posts :

Daftar postingan yang setidaknya sudah Anda mengerti sebelum lanjut ke tutorial ini :

Okay, saya mempunyai file Excel bernama pelanggan.xls dengan layout data seperti ini :

File Excel Data Pelanggan

Dan struktur tabel gangguan.pelanggan [namaDB.namaTabel] yang seperti ini, tabel ini tentu saja masih kosong

Struktur Tabel Pelanggan

So far, so good. Here’s the code. Tapi sebelumnya mari kita bahas logiknya dulu, code ini pertama akan melakukan test sambungan ke database gangguan punya saya, ketika connected, maka proses dilanjutkan dengan membaca data yang ada pada file excel. Perlu diperhatikan, pada proses ini saya merubah proses perulangan. Dimana pada baca excel default, kita looping dari baris dulu, setelah baris habis baru ganti kolom:

    • Kolom 1
      • Baris 1
      • Baris 2
      • Baris 3
      • Baris 4 [habis==TRUE]
    • Kolom 2
      • Baris 1
      • Baris 2
      • Baris 3
      • Baris 4 [habis == TRUE]
    • [End Loop].

Jika looping modifikasi yang sekarang, kita membaca kolom dulu, setelah kolum habis, baru ganti baris :

  • Baris 1
    • Kolom 1
    • Kolom 2
  • Baris 2
    • Kolom 1
    • Kolom 2
  • [dan seterusnya sampai baris ke N]
Kenapa? Karena data yang akan kita masukkan adalah data pada baris yang sama, bukan data pada kolom yang sama. Setelah proses baca excel selesai, maka proses insert akan dilakukan setelah program membaca kolom yang terakhir, dalam kasus ini berarti proses insert dilakukan setelah program membaca kolom kedua. Menggunakan java.sql.PreparedStatement yang saya rasa sesuai dan fleksibel untuk kasus ini.
File ReadExcelDB.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package readexceldb;

/**
*
*@authorHerdi Naufal
*/

import java.sql.PreparedStatement;
import java.io.IOException;
import jxl.Sheet;
import jxl.Cell;
import jxl.CellType;
import jxl.Workbook;
import java.io.File;
import java.sql.SQLException;
import java.util.Properties;
import java.sql.DriverManager;
import java.sql.Connection;
import static java.lang.System.*;

public class ReadExcelDB {
    public static void main(String[] args){
      //Memanggil program dengan menspesifikasikan url database, username dan password
      new DB().connectDBAndInsert("jdbc:mysql://localhost:3306/gangguan","root","");
      }
}

class DB{
        //Inner class untuk fungsi Reader

        public class Reader{
            //nomer index baris
            int editNum = 1;
            //fungsi Read
            public void ngeRead(String path,String db_url, String db_username, String db_password) throws IOException, SQLException
            {
                File fileExcel = new File(path);
                Workbook w;
                //Membuat sambungan ke database
                Connection sambungan = null;
        try {

                        //instantiasi Driver
                        Class.forName("com.mysql.jdbc.Driver").newInstance();

                        //Connection Properties, menspesifikasikan username dan password
                        Properties connectionProps = new Properties();
                        connectionProps.put("user", db_username);
                        connectionProps.put("password", db_password);

                        //Menyambungkan aplikasi dengan database
                        sambungan = DriverManager.getConnection(db_url,connectionProps);

                        //Menggunakan Prepared Statement
    PreparedStatement ps=sambungan.prepareStatement("INSERT INTO pelanggan VALUES (?,?)");

                        if(!sambungan.isClosed())
                        {
                            out.println("Connected");
                        }

            //Workbook baru
            w = Workbook.getWorkbook(fileExcel);
            // Ambil sheet pertama, nomer 0 menandakan sheet ke 1
            Sheet sheet = w.getSheet(0);
            //Variabel penampung
            String id_pelanggan = null;
            String nama_pelanggan = null;

            // Looping sebanyak kolom dan baris yang ada
            for (int j = 0; j < sheet.getRows(); j++) {
                for (int i = 0; i < sheet.getColumns(); i++) {
                    Cell cell = sheet.getCell(i, j);

                                        //Jika baris adalah TABEL HEADER
                                        if((j==0 &amp;&amp; i==0) ||(j==0 &amp;&amp; i==1))
                                        {
                                          out.println("Isi tabel "
                                + cell.getContents());
                                            //out.println("xx");
                                        }
                                        else
                                        {
                                            if (cell.getType() == CellType.LABEL) {
                                                 out.println("Ini adalah Label "
                                                         + cell.getContents());
                                                 nama_pelanggan=cell.getContents();

                                                      //Proses Eksekusi dan Insert Data
                                                 ps.setString(1,id_pelanggan );
                                                 ps.setString(2,nama_pelanggan );
                                                 ps.execute();
                         out.println("DBG Memasukkan "+id_pelanggan+" "+nama_pelanggan);
                                            }

                                            if (cell.getType() == CellType.NUMBER) {
                            out.println("Ini adalah Nomor "+cell.getContents());
                            id_pelanggan=cell.getContents();
                                            }

                                        }

                }

            }
        } catch (Exception aoEX) {
            aoEX.printStackTrace();
        }
                finally
                {
                    //tutup sambungan
                    sambungan.close();
                }
            }
        }

        public void connectDBAndInsert(String db_url, String db_username, String db_password){
                try {

    String fileExcel = "D:/HafizhUIDver2/NetBeansProject/ReadExcel/src/readexcel/pelanggan.xls";

            //Memanggil kelas Reader, dengan melempar data fileExcel dan Connection Prop.
            //ke dalam method ngePrint
                    new Reader().ngeRead(fileExcel,db_url,db_username,db_password);

                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
     }
}

Dan, voila, inilah data yang sudah masuk ke database :

Database Pelanggan

Terminal Works

That’s all. Semoga berguna

PS : Fungsi pengecekan CellType berguna untuk memilah data supaya sesuai dengan tipe data yang ada di database, nggak lucu kan, kalau kita memasukkan VARCHAR ke dalam kolom yang bertipe data INT. 😉





Download aplikasi kami di Google Play Store


Tutorial Menarik Lainnya :

11 Comments
  1. Idham September 26, 2012
  2. indra November 10, 2012
  3. vivi April 22, 2014
    • Hafizh Herdi Naufal April 19, 2015
  4. Oki February 19, 2015
  5. Oki February 19, 2015
  6. joko dwi p April 16, 2015
    • Hafizh Herdi Naufal April 19, 2015

Leave a Reply

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

TWOH&Co.