Arsip mwmag[Files]  [Up]© 2002 PT Masterweb Media

Tutorial Perl Bagian 6:

OLE Automation dengan Perl

  1. Mengenal COM dan OLE
  2. Mengendalikan Word
  3. With dan In
  4. Mengendalikan Excel
  5. Memakai OLE Browser
  6. Membuat File Excel di Linux
  7. Penutup

Files

  1. excel1.pl
  2. excel2.pl
  3. word1.pl
  4. word2.pl

 

Yohanes Nugroho

OLE—dulu merupakan singkatan dari Object Linking dan Embedding, namun sekarang hanyalah sebuah nama—adalah istilah untuk teknologi integrasi komponen milik Microsoft. Secara keseluruhan OLE adalah suatu makhluk yang sangat rumit untuk dipelajari, namun ada bagian OLE yang menarik dan mudah dipelajari yaitu otomasi OLE Automation, atau cukup disebut Automation (dengan ‘A’ kapital).

[Program: Untuk mencoba menjalankan skrip-skrip Perl pada artikel ini, Anda membutuhkan interpreter Perl. Di Unix/Linux umumnya Perl sudah tersedia secara default di /usr/bin/perl. Di Windows, Anda bisa menginstal Activeperl yang juga sudah memiliki modul Win32::OLE. Activeperl bersama modul SpreadSheet::WriteExcel disertakan di CD.]

Secara sederhana dengan Automation kita dapat mengendalikan komponen COM (suatu objek otomasi) menggunakan skrip atau bahasa apa saja. OLE yang dimaksud dalam artikel ini adalah OLE2—padahal nantinya tidak akan ada OLE3 dan seterusnya, karena sifat OLE2 yang extensible. Artinya yang akan dibahas di sini hanya OLE berbasis COM, tidak berbasis DDE (dynamic data exchange).

Praktisnya, dengan OLE Automation kita bisa mengendalikan Microsoft Word, Microsoft Excel, atau aplikasi apapun yang mendukung OLE Automation. Tentunya Anda bisa melihat bahwa OLE Automation punya dua sisi, yaitu bagaimana membuat komponen yang bisa dikendalikan oleh program lain, dan bagaimana membuat program yang mengendalikan komponen tersebut. Kita hanya akan belajar yang bagian terakhir karena yang pertama tidak bisa dibuat dengan Perl (atau tepatnya, tidak dengan cara yang mudah).

Mengenal COM dan OLE

Sebelum masuk ke Perl, saya ingin memberikan dasar-dasar COM (Component Object Model), karena teknologi itulah yang dipakai di OLE untuk mengimplementasikan Automation. Ada beberapa istilah dalam COM yang perlu Anda tahu yaitu COM Object (Objek COM), object model, interface, dan COM Collection Ada banyak istilah lain yang tidak akan saya bahas di sini.

Untuk menyederhanakan, kita bisa memandang suatu Objek COM seperti Objek di bahasa pemrograman pada umumnya. Objek COM memiliki sifat seperti objek biasa di Perl, atau bahasa pemrograman mana pun. Objek COM terdiri dari Fungsi dan Data.

Fungsi (disebut metode) melakukan suatu aksi dan mungkin mengembalikan nilai. Data (disebut properti), menyimpan suatu nilai, properti bisa bersifat read write atau read only. Sebenarnya dalam COM properti juga diimplementasikan sebagai fungsi yang diakses dengan get_namaproperti() dan set_namaproperti() (yang kedua hanya jika property tersebut read write dan bukan read only).

COM Collection adalah objek COM khusus yang merepresentasikan suatu koleksi objek COM. Ini bisa dianalogikan dengan array yang setiap elemennya mengandung objek COM.

Setiap objek harus memiliki kelas. Di COM, kelas ini disebut dengan Object Model. Object model mendefinisikan fungsi (metode) dan variabel (data/properti) yang dimiliki sebuah objek COM. Setiap set fungsi dikelompokkan dan disebut sebagai interface. Sebuah objek COM bisa memiliki beberapa interface, interface ini memiliki IID yang unik, dan memiliki suatu nama kelas.

Sekarang setelah Anda cukup memiliki teori, kita bisa mulai praktik dengan mengendalikan Word.

Mengendalikan Word

Saya asumsikan setiap pembaca telah menginstal Microsoft Word di Windows, jadi saya akan memberikan contoh cara mengendalikan Microsoft Word dari Perl. Lihat contoh program kecil ini:

use Win32::OLE;
my $Word = Win32::OLE->new('Word.Application');
$Word->{'Visible'} = 1;
$Word->Documents->Add();
$Word->Selection->TypeText("hello ");
$Word->Selection->TypeText("World");
$Word->Selection->TypeParagraph();
$Word->ActiveDocument->SaveAs("hello.doc");
$Word->Quit();

Baris pertama menyatakan bahwa kita ingin menggunakan modul OLE. Sebenarnya nama yang lebih tepat bagi Win32::OLE mungkin adalah Win32::COM, tapi mungkin user akan mengira itu adalah modul untuk mengakses port serial (COM port).

Lalu kita perlu mendapatkan objek COM Microsoft Word dengan cara membuat instans baru:

my $Word = Win32::OLE->new('Word.Application');

Word.Application adalah nama kelas interface COM Microsoft Word. Cara tersebut hanyalah salah satu cara untuk mendapatkan objek Microsoft Word. Jika Objek COM tidak dapat memiliki beberapa instans (multiple instance), Anda harus mendapatkan objek COM dengan menggunakan GetActiveObject().Sebagai catatan, dalam COM, nama fungsi tidak case sensitive. Word, Excel, dan IE semuanya mendukung multiple instance, sehingga Anda tidak harus memakai GetActiveObject. Tapi jika Anda ingin menghemat pemakaian memori, Anda bisa memakai GetActiveObject():

$Word = Win32::OLE->GetActiveObject("Word.Application");

Ingat, GetActiveObject() bisa gagal jika Objek tersebut belum ada, dalam kasus ini, jika Anda belum menjalankan Word maka cara tersebut akan gagal. Sebaiknya Anda memakai cara ini:

my $Word;
my $Class = "Word.Application";
if (! ($Word = Win32::OLE->GetActiveObject($Class))) {
$Word = Win32::OLE->new( $Class ) ||
die "Nggak bisa bikin $Class\n";
}

Selanjutnya, perhatikan baris:

$Word->{'Visible'} = 1;

Ini menyatakan bahwa kita ingin objek tersebut diperlihatkan di layar ketika kita sedang mengendalikan Word. Set nilai tersebut menjadi 0, dan Anda tidak akan melihat window MS Word ditampilkan di layar ketika program tersebut berjalan. Anda bisa menambahkan baris:

<STDIN>;

di antara baris-baris kode program, untuk melihat efek perintah di Word jika Anda set properti visible-nya menjadi 1. Anda perlu menekan Enter agar perintah selanjutnya dieksekusi.

Properti sebenarnya adalah fungsi, jadi

$Word->{'Visible'}

sama dengan

$Word->Visible()

untuk mengeset properti bisa juga dengan memanggil fungsi. Jadi

$Word->{'Visible'}=1;

sama saja dengan

$Word->Visible(1);

Ingat, Anda harus mematikan (close) objek COM yang Anda instansiasi dan tidak Anda pakai lagi. Andaikan Anda mengeset properti Visible menjadi 0, dan Anda tidak memanggil $Word->Quit() pada contoh di atas, Word akan tetap berjalan di latar belakang (lihat dengan Task Manager, proses yang bernama WinWord.exe).

Beberapa dokumen yang disimpan oleh aplikasi merupakan serialisasi dari objek COM. Artinya, dokumen ini selain mengandung informasi mengenai isi, juga informasi mengenai state dari objek COM yang mewakili dokumen tersebut.

Dengan menggunakan file (dokumen) serialisasi dari objek COM, kita bisa menginstansiasi objek COM tersebut. Contoh serialisasi dari suatu dokumen adalah file .doc milik Word, .xls milik Excel, atau .PSD milik Photoshop. Umumnya file serialisasi adalah file natif aplikasi tersebut.

File-file seperti .html, .gif, .jpg, hanya berisi data, tapi tidak berisi informasi mengenai state dari objek COM yang membuatnya (Andaikan file tersebut dibuat oleh objek COM), sehingga tidak bisa diinstansiasi.

Lihat contoh berikut yang menginstansiasi Word dari suatu dokumen dan menambahkan teks “Salam Sayang, Nita” di akhir dokumen (setelah memberikan dua buah Enter), lalu menyimpan kembali dokumen tersebut.

use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
my $Document = Win32::OLE->GetObject( "c:\\hello.doc" );
$Document->ActiveWindow->Selection->EndKey({unit=>wdStory});
$Document->ActiveWindow->Selection->TypeParagraph();
$Document->ActiveWindow->Selection->TypeParagraph();
$Document->ActiveWindow->Selection->TypeText("Salam Sayang, Nita");
$Document->SaveAs("c:\\hello.doc");
$Document->Close();

Perhatikan bahwa yang diinstansiasi dalam kasus ini adalah objek Document, bukan objek Word.Application, sehingga cara menambahkan teks berbeda dengan contoh sebelumnya. Perhatikan baris:

$Document->ActiveWindow->Selection->EndKey({unit=>wdStory});

Baris tersebut berguna untuk memindahkan kursor ke akhir dokumen (sama dengan menekan Ctrl-End di Word). Nilai untuk parameter unit adalah wdStory sebuah konstanta yang dimiliki Objek COM. Di COM kita bisa mendapatkan nilai konstanta dengan menggunakan type library. Dalam Type Library tersimpan berbagai attribut mengenai suatu objek COM (di antaranya adalah nama metode, nama tipe, dan konstanta). Dengan Win32::OLE::Const kita bisa mengimpor nilai konstanta tersebut, seperti baris ini:

use Win32::OLE::Const 'Microsoft Word';

Seperti pada contoh di atas (parameter unit), parameter untuk metode kadang-kadang bersifat opsional, untuk parameter yang sifatnya opsional, Anda bisa memakai notasi {param=>value, param2=>value2, ...} untuk parameternya.

Jika Anda tidak tahu objek dan metode mana saja di Word yang harus Anda pakai untuk melakukan suatu hal, lakukan perekaman makro di Word (melalui menu Tools > Macro > Record New Macro). Lakukan aksi yang ingin Anda ketahui metode dan objeknya. Lalu hentikan perekaman makro dengan menekan tombol Stop. Sekarang Anda sudah memiliki sebuah makro yang isinya adalah aksi yang baru saja Anda lakukan. Kemudian lihat isi makro tersebut dengan memilih menu Tools > Macro > Macros (atau tekan Alt-F8, jika Anda belum mengubah shortcut defaultnya). Pilih nama makro yang tadi Anda ketikkan, lalu klik Edit. Anda akan dapat melihat kode VBScript untuk aksi Anda tersebut. Anda bisa menggunakan Help untuk mengetahui lebih lanjut mengenai metode yang ada di makro tersebut.

With dan In

Win32::OLE mendukung With dan In seperti pada Visual Basic. Untuk memudahkan mengakses properti. Untuk dapat menggunakan fungsi in dan with, Anda harus mengimpornya dari Win32::OLE, seperti ini:

use Win32::OLE qw(in with);

Sekarang pernyataan semacam ini:

$Doc->{BuiltinDocumentProperties}->{Title} = “Artikel bagian 6”;
$Doc->{BuiltinDocumentProperties}->{Author} = “Yohanes Nugroho”;
$Doc->{BuiltinDocumentProperties}->{Subject} = “Ini Artikelnya”;

dapat disingkat menjadi:

with($Doc->{BuiltinDocumentProperties},
Title => “Artikel bagian 6”,
Author => “Yohanes Nugroho”,
Subject => “Ini Artikelnya”);

dan Koleksi Objek COM yang diakses seperti ini:

my $Doc = $Word->ActiveDocument;
my $Count = $Doc->BuiltinDocumentProperties->Count;
while( $Count ){
print $Doc->BuiltinDocumentProperties($Count)->{Value};
print "\n";
$Count--;
}

dapat disingkat menjadi

map {print "$_->{Value}\n";} (in($Docs->{BuiltinDocumentProperties}));

Fungsi map akan melakukan evaluasi terhadap suatu blok atau ekspresi untuk setiap elemen di list, untuk setiap elemen nilai $_ akan diset sesuai nilai elemen tersebut. Mungkin contoh ini lebih mudah dimengerti:

@tikus = qw (pinky brain);
map {print “$_*”} @tikus;

Yang akan menghasilkan:

pinky*brain*

Mengendalikan Excel

Mengendalikan Excel sebenarnya sama persis dengan mengendalikan Word. Tapi dalam banyak kasus, mengendalikan Excel lebih berguna dari mengendalikan Word. Saya akan memberikan contoh bagaimana cara membaca sel dalam file Excel. Dengan cara ini, Anda bisa mengubah program-program yang membaca file CSV di tutorial bagian sebelumnya untuk langsung membaca file Excel.

use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit');
my $Book = $Excel->Workbooks->Open("C:\\test.xls");
my $Sheet = $Book->Worksheets(1);
my $array = $Sheet->Range("A1:B10")->{'Value'};
$Book->Close;
foreach my $ref_array (@$array) {
foreach my $scalar (@$ref_array) {
print "$scalar\t";
}
print "\n";
}

Memakai OLE Browser

Jika Anda ingin tahu Objek COM apa saja yang bisa Anda gunakan, Anda bisa menggunakan Type Library Browser yang ada di paket ActivePerl. Cari di Start Menu ActiveState ActivePerl 5.6 > OLE Browser. Jika Anda beruntung, Anda bisa mendapatkan petunjuk di mana bisa mendapatkan help untuk komponen tersebut. Jika Anda memiliki Microsoft Visual C++ 6.0 (dan mungkin juga versi yang lain, saya tidak tahu, karena tidak punya selain versi itu), Anda juga bisa memakai Ole View (OLEVIEW.EXE) untuk melakukan hal yang sama, dengan tampilan yang lebih mudah dipakai.

Membuat File Excel di Linux

Membuat dan membaca file Excel di Windows tentunya bukan hal yang menarik. Tapi membuat file Excel di Linux tentunya lebih menarik. Sebenarnya informasi ini tidak hanya berlaku untuk Linux, tapi semua sistem operasi yang sepenuhnya mendukung Perl, seperti BSD, Solaris, dan juga Windows. Dengan modul SpreadSheet::WriteExcel, Anda bisa membuat file Excel dari Perl, tanpa perlu menginstal Excel. Anda cukup menginstal modul Perl ini. Cara menginstal modul sudah diberikan di tutorial bagian sebelumnya.

SpreadSheet::WriteExcel tidaklah berbasiskan COM, karena COM natifnya hanya berada di Windows. Melainkan, modul ini mengerti format file .xls dan menulis langsung file tersebut. Keuntungannya, Anda tidak membutuhkan aplikasi MS Excel dan bisa membuat file .xls di platform mana saja.

Anda bisa menemukan program sederhana yang menciptakan sebuah dokumen Excel dari file README modul Spreadsheet::WriteExcel. Berikut ini adalah contoh untuk mengubah file .csv menjadi file .xls:

use Spreadsheet::WriteExcel;
my $workbook = Spreadsheet::WriteExcel->new("output.xls");
$worksheet = $workbook->addworksheet();
open(F, "input.csv");
@all = <F>;
$row = 0;
foreach (@all) {
chomp;
$col = 0;
@line = split(/,/);
foreach $value (@line) {
$worksheet->write($row, $col, $value);
$col++;
}
$row++;
}

Nama file haruslah input.csv dan outputnya adalah output.xls. Anda tentunya bisa memodifikasinya sendiri dengan membaca nama file input dan output dari command line. Setiap baris dalam file tidak harus memiliki jumlah data yang sama. Jadi Anda bisa memiliki file dengan isi seperti ini:

Agatha,Christie
Mary,Clarissa,Miller
Mary,Westmacott

Dan konverter tersebut akan membuat 2 kolom untuk baris 1 dan 3, dan 3 kolom untuk baris 2.

Saya hanya membahas file Excel, karena pembuatan file ini secara “on the fly” sangat berguna untuk sebuah situs Web yang dibuat di OS non-Windows. Jika Anda menggunakan OS Windows untuk membuat situs Anda, saya sarankan Anda memakai OLE Automation karena cara tersebut lebih mudah, dan lebih terjamin kebenaran file hasilnya.

Untuk mendistribusikan file dokumen berisi teks di sebuah situs, Anda dapat membuat file .html yang dapat langsung dibuka Word, tapi jika Anda memakai file CSV untuk mendistribusikan data yang bentuknya tabel, Anda akan menemui kesulitan untuk mengajari pengguna bagaimana cara membuka file CSV tersebut, karena tidak semua versi Excel (dan tergantung konfigurasinya) akan otomatis memparsing file CSV sehingga datanya langsung terlihat per kolom. Lagi pula, dengan menggunakan file .xls langsung, pengguna tidak perlu direpotkan dengan konversi data.

Penutup

Artikel ini sudah membahas beberapa hal penting mengenai OLE Automation dengan Perl. Sebenarnya masih ada banyak hal yang perlu Anda ketahui tentang OLE, namun hal itu terlalu rumit untuk cakupan tutorial ini. Untuk mengetahui lebih banyak tentang OLE, Anda dapat membaca di MSDN (msdn.microsoft.com). Anda bisa melakukan pencarian dari situs MSDN terutama terhadap kata kunci “OLE Automation”. Saya tidak bisa memberikan URL tepatnya, karena tampaknya Microsoft selalu memindah-mindah lokasi dokumen mereka.

Semoga Anda bisa belajar beberapa hal baru dari tutorial edisi ini, seperti saya belajar hari ini, bahwa jika Anda menjadi admin sebaiknya Anda tidak membuat file dengan tulisan “Sama seperti yang kita lakukan setiap malam sebelumnya Pinky, berusaha menguasai dunia”, di homepage sebuah situs, terutama jika kalimat itu hanya satu-satunya teks di halaman tersebut, dan situs itu memiliki nama yang menyeramkan seperti baak.itb.ac.id, karena orang-orang akan menyangka bahwa seseorang telah menghack situs tersebut. Dan dapat mengundang thread panjang di milis admin.

Yohanes Nugroho mahasiswa S1 IF ITB yang baru-baru ini menempuh sidang akhirnya. Administrator Jaringan Teknik Informatika. Asisten di Teknik Informatika. Programmer Satgas Pengolah Data Institut ITB. Dapat dihubungi di yohanes@opensource.or.id.

mw

[Last-Modified: Fri Nov 29 14:47:34 2002]

Arsip mwmag[Files]  [Up]www.master.web.id/mwmag