Diberdayakan oleh Blogger.
RSS

Mengeksport data dari Ms Excel ke MySQL Database menggunakan Delphi

Sebuah kenyataan bahwa saat ini pemrograman komputer tidak lagi sebatas mementingkan aplikasi berjalan melainkan sudah sampai kepada bagaimana aplikasi tersebut ‘berinteraksi’ dengan aplikasi lain misalkan dengan aplikasi database. Sehingga aplikasi dapat dipasang pada beberapa komputer dengan menggunakan database yang sama. Tidak hanya sebatas itu, sesuai dengan kebutuhan dan kemampuan pengguna, maka penyediaan data harus dapat mendukung banyak format. Salah satunya adalah apa yang telah saya alami.
Saat ini saya bersama teman-teman sedang mengembangkan web based application untuk pengolahan data akademik, termasuk salah satu didalamnya adalah pengolahan data nilai. Untuk memudahkan pengguna dalam memasukkan nilai dan juga demi keamanan, maka saya menyusun script PHP yang dapat menggenerate sebuah daftar yang terdiri dari NIM, Tahun Akademik, Semester, Kode Matakuliah, dan Nilai dalam format file Microsoft Excel Worksheet. Jadi, melalui interface web dan script PHP yang saya buat, petugas pengisi nilai terlebih dahulu mendownload berkas Excel sesuai dengan matakuliah yang akan diisi nilainya. Kemudian diisi dan selanjutnya diupload kembali untuk dimasukkan ke dalam server. Akan tetapi ada beberapa masalah yang muncul. Pertama, yang jelas adalah masalah keamanan.
Tetapi, pada tulisan ini saya tidak akan membahas lebih jauh mengenai script PHP dan seluk beluknya. Mungkin pada beberapa kesempatan yang lain, akan saya posting tutorial PHP untuk menggenerate file Excel dari database, saya menggunakan database MySQL.Tulisan ini dilatarbelakangi oleh keinginan saya untuk memasukkan data-data yang tersimpan di dalam file Excel ke dalam database MySQL. Saya memilih Excel karena aplikasi ini paling banyak digunakan untuk menyusun daftar dalam format tabel. OK langsung saja pada tujuan dari tutorial kali ini. Tutorial kali ini bertujuan membuat aplikasi yang digunakan untuk membaca data pada file excel kemudian ‘memasukannya’ kedalam database MySQL menggunakan Delphi. Tetapi, saya akan membahasnya secara umum. Harap menyesuaikan dengan kebutuhan.
Pertama, saya menyiapkan sebuah database dan sebuah tabel. Saya asumsikan di komputer Anda sudah terinstall MySQL. Misalkan saya membuat database dengan nama ‘DATAKU’. Saya membuatnya melalui Console MySQL. Anda dapat membuatnya melalui iterface yang lain.
C:\AppServ\MySQL\bin>mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 6.0.4-alpha-community-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE DATABASE DATAKU;
Query OK, 1 row affected (0.05 sec)

mysql> USE DATAKU;
Database changed
mysql> CREATE TABLE anggota (kode_anggota varchar(10) NOT NULL default '',
-> nama varchar(3) NOT NULL default '',
-> alamat varchar(100) NOT NULL default '',
-> PRIMARY KEY (kode_anggota));
Query OK, 0 rows affected (0.11 sec)
Selanjutnya menyiapkan file Excel yang berisi data-data yang akan dimasukkan ke dalam tabel anggota. Misalkan data-datanya seperti pada gambar berikut:
Image Hosted by UploadHouse.com
Kedua, membuat aplikasi Delphi. Disini saya menggunakan komponen-komponen sebagai berikut:
  1. Label, dengan caption ‘Excel File’
  2. Edit, dengan text ‘D:\Project\Excel_To_SQL\anggota.xls’
  3. Memo, untuk mencatat aktivitas
  4. StringGrid, sebagai ‘Perantara’. Oleh karena itu, set properti Visible-nya menjadi FALSE
  5. Button, dengan caption ‘InjectDB’
  6. StatusBar
  7. ADOConnection, untuk melakukan koneksi
  8. ADOQuery, untuk mengeksekusi SQL
Susun form-nya sesuai selera, milik saya seperti ini:
Image Hosted by UploadHouse.com
Sebelum membuat action ketika tombol Inject DB di klik, terlebih dahulu deklarasikan beberapa fungsi dan prosedur dibagian private declaration
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    StatusBar1: TStatusBar;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure DisplayException(Sender: TObject; E: Exception);
    function GiveRowHeader(x : Integer) : String;
    procedure LoadFromXLFile(AFileName : String; ASheetNum: Integer;
    AStringGrid:TStringGrid; var OSheetName : String);
  public
  { public declarations }
end;
Jangan lupa untuk menambahkan unit ComObj dan Excel2000 pada bagian implementation
uses ComObj, Excel2000;
Kemudian di bagian impelementation, lengkapi fungsi-fungsi dan prosedur tersebut:
procedure TForm1.DisplayException(Sender: TObject; E: Exception);
begin
  StatusBar1.SimpleText := E.Message;
  MessageDlg(E.Message,mtError,[MBOK],0);
end;

function TForm1.GiveRowHeader(x: Integer) : String;
begin
  if (x > 26) then
    Result := GiveRowHeader(x div 26) + GiveRowHeader(x mod 26)
  else
    Result := Chr(Ord('A') + x - 1);
end;

procedure TForm1.LoadFromXLFile
  (AFileName : String; ASheetNum: Integer; AStringGrid:TStringGrid; var OSheetName : String);
var
  ARow,
  ACol,
  i,
  j        : Integer;
  XLApp,
  XLBook,
  XLSheet  : Variant;
begin
  XLApp := CreateOLEObject('Excel.Application');
  XLApp.Visible := False;
  XLApp.Workbooks.Open(AFileName,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,EmptyParam,
                        EmptyParam,0);
  XLBook := XLApp.ActiveWorkbook;
  XLSheet := XLBook.WorkSheets[ASheetNum];
  XLSheet.Activate;
  XLSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
  OSheetName := XLSheet.Name;
  ARow := XLApp.ActiveCell.Row;
  AStringGrid.RowCount := ARow + 1;
  ACol := XLApp.ActiveCell.Column;
  AStringGrid.ColCount := ACol + 1;
  for i := 1 to ARow do
  begin
    AStringGrid.Cells[0, i] := IntToStr(i);
    for j := 1 to ACol do
    begin
       AStringGrid.Cells[j, 0] := GiveRowHeader(j);
       AStringGrid.Cells[j, i] := XLSheet.Cells[i, j];
    end;
  end;

  if not VarIsEmpty(XLApp) then
  begin
     XLApp.DisplayAlerts := False;
     XLApp.Quit;
     XLApp := Unassigned;
     XLBook := Unassigned;
     XLSheet := Unassigned;
   end;
end;
Selanjutnya adalah proses menginject database. Double click tombol InjectDB, kemudian lengkapi procedure OnClick milik tombol tersebut:
procedure TForm1.Button1Click(Sender: TObject);
var
  server,
  user,
  password,
  db_name,
  SheetName : string;
  ConnStr,
  StrSQL     : WideString;
  ACol,
  ARow,
  NRows     : Integer;
begin
  ADOConnection1.Close;
  server := 'mysql_server';//Sesuaikan, bisa diisi IP Address Server MySQL
  user := 'mysql_username'; //Sesuaikan dengan username mysql Anda
  password := 'mysql_password'; //Sesuaikan dengan password mysql Anda
  db_name := 'DATAKU';
  ConnStr := 'Provider=MSDASQL;DRIVER={MySQL ODBC 3.51 Driver}; '
            +'SERVER='+server
            +'; UID='+user
            +'; PASSWORD='+password
            +'; DATABASE='+db_name;

  ADOConnection1.ConnectionString := ConnStr;
  try
    AdoConnection1.Open;
  except
  raise;
  end;
  if ADOConnection1.Connected then begin
    Memo1.Clear;
    Memo1.Lines.Add('Connection established to '+server+'. Logged as '
            +user+' at '+DateTimeToStr(now));
    StatusBar1.SimpleText := 'Connection established to '+server
            +'. Logged as '+user+' at '+DateTimeToStr(now);
    LoadFromXLFile(Edit1.Text,1,StringGrid1,SheetName);
    NRows := 0;
    for ARow := 2 to StringGrid1.RowCount-1 do begin
      StrSQL := 'INSERT INTO anggota (';
      for ACol := 1 to StringGrid1.ColCount-1 do
        StrSQL := StrSQL + LowerCase(StringGrid1.Cells[ACol,1])+',';
      StrSQL := copy(StrSQL,1,length(StrSQL)-1)+') VALUES (';
      for ACol := 1 to StringGrid1.ColCount-1 do
        StrSQL := StrSQL + QuotedStr(StringGrid1.Cells[ACol,ARow])+',';
      StrSQL := copy(StrSQL,1,length(StrSQL)-1)+');';
      Memo1.Lines.Add('QUERY : '+StrSQL);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(StrSQL);
      ADOQuery1.ExecSQL;
      NRows := NRows + 1;
    end;
    StatusBar1.SimpleText := 'Operation Complete. '+IntToStr(NRows)
                   +' rows inserted';
  end;
end;
Terakhir, menghubungkan koneksi Query. Double click area kosong form1, ketikkan script berikut:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Clear;
  ADOQuery1.Connection := ADOConnection1;
  Application.OnException := DisplayException;
end;
Dan selesai sudah. Jika, tidak ada masalah berarti, ketika dijalankan kemudian klik ‘InjectDB’, hasinya seperti ini:
Image Hosted by UploadHouse.com
Untuk memastikan bahwa data-data tersebut berhasil disimpan ke MySQL, kita cek saja lewat console tadi (belum di tutup kan?)
mysql> SELECT * FROM anggota;
+--------------+-----------------+----------------------------------------------
-+
| kode_anggota | nama            | alamat
 |
+--------------+-----------------+----------------------------------------------
-+
| 20060001     | Rokayah         | Kp. Pabuaran Pengadegan Pasar Kemis Tangerang
 |
| 20060002     | Ade Ubaidillah  | Jl. Kali Maya Blok M/16 Komp. Permata Serang
 |
| 20060003     | Maratusholihat  | Kp. Gore Jaya Grogol Cilegon
 |
| 20060004     | Enong Hifdiawat | Kp. Sedatani Kubang Baros Cinangka Serang
 |
| 20060005     | Umyati          | Jl. Keramatwatu Waringin Kurung Serang
 |
| 20060006     | Tati Haryanti   | Jl. Karya Bakti 2B Komp. KPKN Ciceri Serang
 |
| 20060009     | Nurhanifah      | Jl. Carenal Kp. Laes Nambo Kibin Serang
 |
| 20060011     | Maryam          | Jl.KH.Samu'un Ramanuju no.12 Citangkil
 |
| 20060012     | Rena Annisa Feb | Jl.Labuan Km 17 Sodong Saketi Pandeglang
 |
| 20060015     | Rudi Hasanuidin | Kp Puyuh Koneng Ds Kencana Harapan Pontang
 |
| 20060016     | Ida Rosida      | Kp. Winong Ds./Kec. Walantaka Kab. Serang
 |
+--------------+-----------------+----------------------------------------------
-+
11 rows in set (0.00 sec)

mysql> quit
Bye
Karena saya menggunakan ADO untuk mengkoneksikan Delphi dengan MySQL, maka kita membutuhkan driver tambahan yaitu MySQL ODBC Driver yang dapat diunduh disini. Aplikasi yang saya buat tidak menggunakan ADO, melainkan menggunakan Zeos sehingga tidak membutuhkan driver tambahan. Saya menggunaka ADO karena komponen tersebut sudah ada, tidak seperti ZEOS yang harus menginstall komponen-nya terlebih dahulu. Akan tetapi, koneksi menggunakan Zeos jauh lebih cepat dan tidak membutuhkan tambahan driver apapun.
Lalu, mungkin ada yang bertanya-tanya, apa gunanya deklarasi prosedur DisplayException? Salah satu contohnya, setelah melakukan InjectDB, silahkan klik Inject DB kembali. Lihat pada StatusBar.
Demikian. Semoga bermanfaat. Jika membutuhkan source code-nya, silahkan mengunduh di sini.

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 komentar:

Posting Komentar