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.

Artikel Terkait:



0 Responses to "Mengeksport data dari Ms Excel ke MySQL Database menggunakan Delphi"

Posting Komentar

 
Return to top of pageCopyright © 2012 | Blog Koleksiku Saja Converted into Blogger Template by Gusmanto