Kontak erat antara Delphi dan Excel [Wang Anpeng ([email protected]) 2002/4/14] Sebagai RAD yang sangat baik, fungsi database Delphi yang kuat adalah salah satu fitur terpentingnya, tetapi kontrol QuickReport yang sulit dioperasikan seringkali tidak dapat dioperasikan memenuhi kebutuhan pelaporan Database. Jika laporan Anda sangat kompleks, atau memerlukan fleksibilitas dalam perubahan format, maka menggunakan Excel sebagai server laporan adalah pilihan yang baik. Komponen Excel yang disediakan Delphi mulai versi 5 sangat menyederhanakan penerapan teknologi otomasi OLE. Namun, file bantuan yang hilang selalu menjadi aspek Delphi yang paling dikritik, dan komponen baru ini tidak terkecuali. Model objek Excel adalah struktur hierarki seperti pohon. Akar adalah aplikasi itu sendiri. Buku Kerja adalah objek atribut dari objek akar. Lembar Kerja yang digunakan untuk pertukaran data yang terutama dibahas dalam artikel ini adalah objek atribut dari buku kerja detailnya, silakan merujuk ke file Bantuan MSOffice.Excel VBA. Untuk mengontrol Excel di Delphi, Anda harus terlebih dahulu membuat koneksi dengan program server, membuka buku kerja, kemudian bertukar data dengan lembar kerja target, dan terakhir memutuskan sambungan. Buka buku kerja Excel Contoh kita dimulai dengan formulir utama dengan TStringGrid (tentu saja beberapa data perlu diisi) dan dua tombol. Tarik kontrol aplikasi TExce dari tab Server di panel kontrol dan letakkan di formulir. Pertama, atur ConnectKind ke ckRunningOrNew, yang berarti jika instance Excel yang sedang berjalan dapat dideteksi, jalin kontak dengannya, jika tidak, jalankan Excel. Selain itu, jika Anda ingin program menjalin kontak dengan program server segera setelah dijalankan, Anda dapat mengatur properti AutoConnect ke True. Yang diperlukan untuk menjalin kontak dengan Excel hanyalah satu pernyataan: Excel Connect Mungkin Anda telah memperhatikan bahwa ada beberapa kontrol Excel lainnya di tab Server. Kontrol ini dapat dihubungkan ke Excel sebelumnya melalui metode ConnectTo: ExcelWorkbook1.ConnectTo( Excel .ActiveWorkbook); ExcelWorksheet1.ConnectTo(Excel .ActiveSheet sebagai _Worksheet2.ConnectTo(Excel .Worksheets.Item['Sheet2'] sebagai _Worksheet); Perlu dicatat bahwa buku kerja atau lembar kerja terkait harus dibuka sebelum menggunakan metode ConnectTo Selain itu, kontrol ini tidak akan memberikan kemudahan tambahan dalam banyak kasus, jadi yang terbaik adalah menggunakan hanya satu TExcelApplication. Setelah kontak terjalin dengan server Excel, buku kerja baru dapat dibuat: var wkBook : _WorkBooks; LCID : Integer; ... LCID := GetUserDefaultLCID(); function Parameter pertama digunakan untuk menentukan templat yang digunakan untuk buku kerja baru. Anda dapat menggunakan xlWBATChart, xlWBATExcel4IntlMacroSheet, konstanta xlWBATExcel4MacroSheet atau xlWBATWorksheet, atau bisa juga nama file xls yang sudah ada. KosongParam di sini adalah unit Varian dan variabel yang ditentukan, yang berarti menggunakan templat universal default untuk membuat buku kerja baru. Jika Anda membuka dokumen xls yang sudah ada, Anda harus meneruskan nama file yang akan dibuka sebagai parameter pertama ke fungsi Buka: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, BlankParam,EmptyParam,EmptyParam,EmptyParam , KosongParam,EmptyParam,EmptyParam,EmptyParam, KosongParam,EmptyParam,LCID); Anda harus tahu bahwa semua operasi data terutama untuk lembar kerja aktif. Pernyataan berikut menggunakan variabel _WorkSheet untuk mewakili sel aktif saat ini. Jika Anda mengetahui nama lembar kerja, nomor indeks dapat diganti dengan nama lembar kerja: wkSheet:=wkBook.Sheets[1] as _WorkSheet Setelah menyelesaikan pertukaran data, Anda perlu menyimpan buku kerja: Excel.ActiveWorkBook.SaveAs ('Output Saya', KosongParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, KosongParam, KosongParam, LCID); atau: Excel.ActiveWorkBook.Save(LCID); Terakhir, tutup buku kerja dan putuskan sambungan dari Excel: wkBook.Close(True, SaveAsName,EmptyParam, LCID); ; Metode Tutup di sini berisi fungsi penyimpanan. Parameter pertama menunjukkan apakah akan menyimpan modifikasi sebelum menutup buku kerja. Parameter kedua memberikan nama file yang akan disimpan. Parameter ketiga digunakan untuk beberapa penulis untuk memproses situasi dokumen. Baris kedua meminta untuk menghentikan Excel. Pertukaran data dengan lembar kerja Input data dilakukan pada sel atau rentang tertentu pada lembar kerja yang aktif. Rentang dan sel keduanya merupakan properti objek lembar kerja. Sel adalah kumpulan sel. Jika tidak ada lokasi spesifik yang ditentukan, sel dapat mewakili semua sel di seluruh lembar kerja. Namun, biasanya digunakan untuk merujuk ke sel tertentu. mewakili sel terbaru. Sel A1 di sudut kiri atas. Perhatikan bahwa Item adalah properti default Sel di VBA dan dapat dihilangkan, tetapi tidak ada kemudahan seperti itu di Delphi. Untuk memberikan nilai pada sel, Anda harus mengacu pada properti Value-nya. Sudah jelas bahwa properti ini adalah variabel Varian, misalnya: wkSheet.Cells.Item[1, 1].Value := 'Address Book'; Tentu saja, Anda juga dapat memberikan nilai pada sel. Tentukan rumusnya: var AFormula:String; …… AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula; Metode di atas sangat langsung dan sederhana, tetapi sangat lambat dan tidak cocok untuk laporan besar. Jadi apakah semua data bisa ditransfer ke Excel secara berurutan? Kita dapat menggunakan Range. Objek ini mewakili suatu area di lembar kerja. Saat kita menariknya dengan mouse, biasanya objek tersebut berbentuk persegi panjang. Berikan saja posisi sel pojok kiri atas dan pojok kanan bawah, seperti Range[ 'C3 ','J42']. Ada sedikit masalah disini, karena jika data melebihi 26 kolom (misalnya ada 100 kolom) atau jika rentang area target perlu ditentukan dengan cepat, akan lebih merepotkan jika menggunakan nama karakter untuk menandai sel. Ingatlah bahwa karena "C3" adalah label sel, tentu saja kita juga dapat menggunakan Sel, seperti Range[Cells.Item[1,1], Cells.Item[100,100]]. Bisa dibayangkan bahwa nilai Range harus berupa array, tetapi Anda tidak boleh menggunakan Array di Delphi untuk memberikan nilai padanya! Ingatlah bahwa di Delphi, nilai objek Excel selalu bertipe Varian. var Datas: Varian; Ir, ic: Integer; …… Datas:= varArrayCreate([1,ir,1,ic],varVariant); //Buat array dinamis 100*100 di sini… //Tetapkan nilai ke elemen array di sini dengan wkSheet melakukan Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; Perlu dicatat bahwa lembar kerja dan Range memiliki properti Cells. Untuk lebih jelasnya, pernyataan with digunakan di sini. Selain itu, Range bersifat terarah. Array satu dimensi yang dibuat dengan VarArrayCreate hanya dapat ditetapkan ke Range satu baris. Jika Anda ingin menentukan nilai untuk Range satu kolom, Anda harus menggunakan array dua dimensi contoh: Datas:=VarArrayCreate([1,100,1 ,1], varVariant); //Buat array dinamis 100*1. Omong-omong, Cells.Item[] sebenarnya mengembalikan objek Range. Pengambilan data dari worksheet pada dasarnya adalah proses kebalikan dari penulisan data. Yang perlu diperhatikan adalah cara menentukan range data dari worksheet: var ir, ic : Integer;…… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam; ).Aktifkan ; ir := Excel.ActiveCell.Row; Fungsi sel khusus SpecialCells secara cerdik digunakan di sini untuk mendapatkan sel terakhir yang berisi data. Pengeditan Data Di bawah ini adalah dua contoh pengeditan data. var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); Jika Anda meneruskan parameter kosong ke fungsi Salin, data di area ini akan disalin ke clipboard, dan dapat ditempelkan ke lokasi lain menggunakan metode Tempel nanti. var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //Menyalin data dalam lembar kerja ke clipboard WS := Excel.Activesheet sebagai _Worksheet; .Range['C1', 'D4'].Pilih; //Tempel konten clipboard ke lembar kerja baru. Pengaturan format Pilih Excel sebagai server laporan terutama karena kemampuan pemformatannya yang kuat. Pertama-tama kita menggabungkan sel dengan judul "Buku Alamat" dan menampilkannya di tengah, lalu mengubah font menjadi "skrip resmi" 18 poin yang dicetak tebal: dengan wkSheet.Range['A1','D1'],Font mulai Gabung(Benar ); //Gabungkan sel HorizontalAlignment:= xlCenter; Ukuran:=18; Nama:='skrip resmi'; Jika konten sel panjang, sebagian konten tidak akan ditampilkan. Pendekatan yang biasa dilakukan adalah dengan mengklik dua kali tepi kanan area yang dipilih sehingga lebar setiap kolom secara otomatis menyesuaikan dengan panjang konten. Di Delphi, lebar kolom adaptif dan tinggi baris juga dapat dicapai melalui metode AutoFit. Perlu dicatat bahwa metode ini hanya dapat digunakan untuk seluruh baris dan seluruh kolom, jika tidak, kesalahan penolakan metode OLE untuk mengeksekusi akan muncul: wkSheet.Columns.EntireColumn.AutoFit; Laporan gaya Cina biasanya memerlukan baris tabel dengan batas atas dan bawah, dan Anda dapat menggunakan properti koleksi Borders. Perlu dicatat bahwa objek koleksi di VBA biasanya memiliki properti Item default, yang tidak dapat dihilangkan di Delphi. Properti Weight digunakan untuk menentukan ketebalan garis tabel: dengan Aname.RefersToRange,Borders dimulai HorizontalAlignment:= xlRight; Item[xlEdgeBottom].Weight:=xlMedium Item[xlEdgeTop].Weight:=xlMedium Item[xlInsideHorizontal] .Berat: =xlTipis; item[xlInsideVertical].Weight:=xlThin; end; Pengaturan halaman dan pengaturan halaman cetak diatur melalui properti objek PageSetUp pada lembar kerja. Ada lebih dari 40 konstanta kertas yang telah disetel sebelumnya di Excel VBA. Perlu dicatat bahwa beberapa printer hanya mendukung beberapa jenis kertas. Atribut Orientation digunakan untuk mengontrol arah pencetakan, dan konstanta lanskap = 2 menunjukkan pencetakan horizontal. Properti Boolean CenterHorizontally dan CenterVertically digunakan untuk menentukan apakah konten cetakan dipusatkan secara horizontal dan vertikal. dengan wkSheet.PageSetUp mulai PaperSize:=xlPaperA4; //Jenis kertas A4 PRintTitleRows := 'A1:D1'; //Ulangi baris/halaman ini LeftMargin:=18; 0,25" akan bervariasi antar printer TopMargin:=36; //0.5" BottomMargin:=36; //0.5" CenterHorizontally:=True; Orientation:=1; //Pencetakan horizontal (lanskap)=2, potret=1 akhir; Untuk mencetak laporan, Anda dapat memanggil metode PrintOut pada lembar kerja. Metode yang ditentukan oleh VBA ini memiliki total 8 parameter opsional. , dua yang pertama digunakan untuk menentukan halaman awal dan akhir, dan jumlah salinan yang akan dicetak dalam format ketiga. Namun, di Delphi, parameter LCID ditambahkan di akhir, dan BlankParam tidak dapat digunakan untuk parameter ini. Demikian pula, metode pratinjau cetak PrintPreview tidak memiliki parameter di VBA, namun memerlukan dua parameter saat dipanggil di Delphi. // wkBook.PrintPreview(True,LCID); //untuk melihat pratinjau wkSheet.PrintOut(EmptyParam,EmptyParam,1,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,LCID); lebih kompleks, Pendekatan yang lebih baik adalah memberi nama rentang tabel tertentu dan kemudian mereferensikannya berdasarkan nama. Nama adalah properti objek koleksi Buku Kerja, yang memiliki metode Tambah yang bisa melakukan pekerjaan ini. Var Nama : Excel2000.Nama; …… Nama := wkBook.Names.Add('Buku Alamat','=Lembar1!$A$3:$D$7',EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, KosongParam,EmptyParam); Parameter pertama dari fungsi Tambah adalah nama yang ditentukan, dan parameter kedua adalah rentang sel yang diwakili oleh nama tersebut. Perlu dicatat bahwa tipe nama rentang harus menggunakan kualifikasi. Jika perpustakaan tipe (D4) digunakan, kualifikasinya adalah Excel_TLB. Selain itu, rentang bernama harus menggunakan referensi absolut, yaitu menambahkan simbol "$". Setelah Anda memberi nama suatu rentang, Anda dapat mereferensikannya dengan nama tersebut. Baris kode berikut membuat isi buku alamat muncul dalam huruf tebal: AName.RefersToRange.Font.Bold:=True; memodifikasi program makro Excel di Delphi! Kode berikut membuat makro untuk buku kerja kita yang mencatat waktu akses terakhir saat menutup buku kerja: var LineNo: integer; CM: CodeModule:String mulai CM := WkBook.VBProject.VBComponents.Item( 'ThisWorkbook'). Modul Kode; Nomor Baris := CM.CreateEventProc('SebelumTutup', 'Buku Kerja'); SDate:='Tanggal akses terakhir:'+DateToStr(Date()); CM.InsertLines(LineNo + 1, ' Range("B2").Value = "'+sDate+''"'); makro Tambahkan unit ke bagian penggunaan sebelumnya: VBIDE2000. Jika perpustakaan tipe digunakan, unit yang sesuai adalah VBIDE_TLB. Kunci dari kode ini adalah objek CodeModule. Sayangnya, tidak ada jejak objek ini di dokumen bantuan Excel VBA, jadi kami hanya dapat mencari di MSDN. Delphi4 dan versi sebelumnya Delphi4 tidak menyediakan objek TExcelApplication, dan perpustakaan tipe perlu diperkenalkan untuk menggunakan teknologi otomatisasi OLE. Perpustakaan tipe Excel97 adalah Excel8.olb. Perbedaan utama antara kedua metode ini adalah metode pembuatan koneksi dengan program server. Berikut ini adalah kerangka program untuk mengendalikan Excel melalui tipe perpustakaan: menggunakan Windows, ComObj, ActiveX, Excel_TLB; ; Tidak Diketahui:ITidak Diketahui; Hasil : HHasil; mulai LCID := LOCALE_USER_DEFAULT; Hasil := GetActiveObject(CLASS_Application, nihil, Unknown); //Coba ambil instance program yang sedang berjalan if (Result = MK_E_UNAVAILABLE) lalu Excel := CoApplication.Create //Mulai instance program baru yang lain mulai {Periksa kesalahan selama pemanggilan metode GetActiveObject} OleCheck(Hasil); (Tidak Diketahui.QueryInterface(_Application, Excel)); end; //Lakukan pemrosesan data Excel.Visible[LCID] := Benar; // Excel.DisplayAlerts[LCID] := False; //Menampilkan kotak dialog prompt Excel.Quit Struktur try...kecuali yang biasa tidak digunakan di sini karena mekanisme penanganan pengecualian memerlukan pemeriksaan OLE yang kompleks, yang mengurangi biaya Kecepatan eksekusi bagian kecuali. Perlu dicatat bahwa fungsi CoApplication yang menyertainya dan beberapa nama konstan yang dihasilkan oleh versi Delphi yang berbeda mungkin berbeda, jadi Anda harus memeriksa perpustakaan tipe yang sesuai. Sebelum memanggil metode Keluar, pastikan untuk melepaskan semua variabel buku kerja dan lembar kerja yang dibuat dalam program, jika tidak, Excel mungkin berada di memori dan dijalankan (Anda dapat menekan Ctrl+Alt+Del untuk melihatnya). Ada masalah kecil saat memanggil GetActiveObject untuk menangkap contoh program. Jika Excel dalam keadaan berjalan yang diperkecil, hanya bingkai utama program yang dapat ditampilkan dan area pengguna tidak terlihat. Selain itu, jika Anda tidak ingin memperkenalkan pustaka tipe, Anda juga dapat menggunakan pengikatan lagging, namun jauh lebih lambat. Contoh berikut mendeklarasikan variabel Varian untuk mewakili aplikasi Excel: var Excel: Variant; ... coba Excel := GetActiveOleObject('Excel.Application'); kecuali Excel := CreateOleObject('Excel.Application'); .Terlihat := Benar; Saat menggunakan pengikatan lagging, kompiler tidak memeriksa metode objek Excel yang dipanggil, tetapi menyerahkan tugas ini ke program server untuk diselesaikan selama eksekusi. Dengan cara ini, sejumlah besar parameter default yang ditetapkan oleh VBA (seringkali lebih dari selusin) adalah digunakan sebagaimana mestinya, jadi metode ini memiliki manfaat yang tidak terduga - kodenya ringkas: var WBk, WS, SheetName: OleVariant ..... WBk := Excel.WorkBooks.Open('C:/Test.xls; ') ;WS := WBk.Worksheets.Item['SheetName']; WS.Activate; ...... WBk.Close(SaveChanges := True); Selain berjalan lambat, jika Anda ingin menggunakan konstanta yang ditentukan di perpustakaan tipe , hanya Anda hanya dapat melakukannya sendiri: const xlWBATWorksheet = -4167; …… XLApp.Workbooks.Add(xlWBatWorkSheet); Terakhir, jangan lupa untuk melepaskan variabel setelah menutup Excel: Excel := Unassigned Berikut ini adalah kode sumber yang digunakan dalam contoh artikel ini, yang dikirimkan pada Delphi6+MSOffice2000. unit Unit1; antarmuka menggunakan Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir, Dialog, OleServer, Excel2000, Grids, StdCtrls ketik TForm1 = kelas(TForm) Button1: TButton1: TStringGrid; prosedur FormActivate(Pengirim: TObject); Button1Click(Pengirim: TObject); private { Deklarasi pribadi } prosedur Write2Xls; prosedur OpenExl; prosedur CloseExl; prosedur AddFormula; prosedur NameSheet; prosedur AddMacro; ; implementasi {$R *.dfm} menggunakan VBIDE2000; wkSheet:_WorkSheet; LCID:Bilangan Bulat; Baris[1].CommaText:='Zhang San, laki-laki, 25.010-33775566'; Baris[2].CommaText:='Li Si, laki-laki, 47.012-6574906'; ,18,061-7557381'; Baris[4].CommaText:='Sun Tao, perempuan, 31,3324559'; akhir; akhir; prosedur TForm1.OpenExl; dimulai dengan Excel, mulai Connect; , LCID); wkSheet:=wkBook.Sheets[1] sebagai akhir prosedur; TForm1.Write2Xls; var Data:Varian; i,j:Integer; mulai ir:=StringGrid1.RowCount; ic:=StringGrid1.ColCount; :=1 yang harus saya lakukan untuk j:=1 yang harus saya lakukan Datas[i,j]:=StringGrid1.Cells[j-1,i-1]; dengan wkSheet mulai Activate(LCID); Cells.Item[1,1].Value:='Address Book'; .Item[3,1],sel.Item[ir+2,ic]].Nilai:=Data akhir; // Excel.Visible[LCID]:=Benar; Data:=Tidak ditetapkan; akhir; prosedur TForm1.Retrieve; var Datas:Variant; i,j:Integer; dimulai dengan wkSheet mulai Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate; =Excel.ActiveCell.Kolom; Datas:=Range[Cells.Item[1,1],Cells.Item[ir,ic]].Value; dengan StringGrid1 mulai ColCount:=ic; RowCount:=ir; ke ir-1 lakukan untuk j:=0 hingga ic-1 lakukan Cells[j,i]:=Datas[i+1,j+1]; Data:=Tidak Ditugaskan; akhir; prosedur TForm1.CloseExl; const SaveAsName='test.xls'; mulai wkBook.Close(True,SaveAsName,EmptyParam,LCID); Lembar Nama; AName:=wkBook.Names.Add('Address Book','=Sheet1!$A$3:$D$7',EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam end; .AddFormula; var AFormula:String; AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Nilai:=AFormula; akhir; prosedur TForm1.Formats; Font mulai Gabung(Benar); //Gabungkan sel HorizontalAlignment:= xlCenter Ukuran:=18; FontStyle:=Bold; akhir; wkSheet.Columns.EntireColumn.AutoFit; dengan Aname.RefersToRange,Borders dimulai HorizontalAlignment:= xlRight; Item[xlEdgeBottom].Weight:=xlMedium; Item[xlInsideHorizontal].Berat:=xlThin; item[xlInsideVertical].Berat:=xlThin; akhir; prosedur TFOrm1.AddMacro; VBComponents.Item('Buku Kerja Ini').Codemodule; := CM.CreateEventProc('BeforeClose', 'Workbook'); SDate:='Tanggal akses terakhir:'+DateToStr(Date()); "'+sDate+'"'); akhir; prosedur TForm1.Printit; dimulai dengan wkSheet.PageSetUp dimulai PaperSize:=xlPaperA4; //Jenis kertas A4 PrintTitleRows := 'A1:D1'; //Ulangi baris/halaman ini LeftMargin:=18; //0.25" Left Margin RightMargin:=18; //0.25" akan bervariasi antar printer Margin Atas:=36; //0,5" Margin Bawah:=36; //0,5" TengahHorizontal:=Benar; Orientasi:=1; //Lanskap=2, potret=1 ujung; ; mulai coba OpenExl; NameSheet Format; PrintIt; AddMacro; ReTrieve; akhirnya CloseExl; salah satu fitur terpentingnya, namun kontrol QuickReport yang sulit dioperasikan sering kali tidak dapat memenuhi kebutuhan laporan database. Jika laporan Anda sangat kompleks, atau memerlukan fleksibilitas dalam perubahan format, maka menggunakan Excel sebagai server laporan adalah pilihan yang baik. Komponen Excel yang disediakan Delphi mulai versi 5 sangat menyederhanakan penerapan teknologi otomasi OLE. Namun, file bantuan yang hilang selalu menjadi aspek Delphi yang paling dikritik, dan komponen baru ini tidak terkecuali. Model objek Excel adalah struktur hierarki seperti pohon. Akar adalah aplikasi itu sendiri. Buku Kerja adalah objek atribut dari objek akar. Lembar Kerja yang digunakan untuk pertukaran data yang terutama dibahas dalam artikel ini adalah objek atribut dari buku kerja detailnya, silakan merujuk ke file Bantuan MSOffice.Excel VBA. Untuk mengontrol Excel di Delphi, Anda harus terlebih dahulu membuat koneksi dengan program server, membuka buku kerja, kemudian bertukar data dengan lembar kerja target, dan terakhir memutuskan sambungan. Buka buku kerja Excel Contoh kita dimulai dengan formulir utama dengan TStringGrid (tentu saja beberapa data perlu diisi) dan dua tombol. Tarik kontrol TExcelApplication dari tab Server di panel kontrol dan letakkan di formulir. Pertama, atur ConnectKind ke ckRunningOrNew, yang berarti jika instance Excel yang sedang berjalan dapat dideteksi, jalin kontak dengannya, jika tidak, jalankan Excel. Selain itu, jika Anda ingin program menjalin kontak dengan program server segera setelah dijalankan, Anda dapat mengatur properti AutoConnect ke True. Yang diperlukan untuk menjalin kontak dengan Excel hanyalah satu pernyataan: Excel Connect Mungkin Anda telah memperhatikan bahwa ada beberapa kontrol Excel lainnya di tab Server. Kontrol ini dapat dihubungkan ke Excel sebelumnya melalui metode ConnectTo: ExcelWorkbook1.ConnectTo( Excel .ActiveWorkbook); ExcelWorksheet1.ConnectTo(Excel .ActiveSheet sebagai _Worksheet2.ConnectTo(Excel .Worksheets.Item['Sheet2'] sebagai _Worksheet); Perlu dicatat bahwa buku kerja atau lembar kerja terkait harus dibuka sebelum menggunakan metode ConnectTo Selain itu, kontrol ini tidak akan memberikan kemudahan tambahan dalam banyak kasus, jadi yang terbaik adalah menggunakan hanya satu TExcelApplication. Setelah kontak terjalin dengan server Excel, buku kerja baru dapat dibuat: var wkBook : _WorkBooks; LCID : Integer; ... LCID := GetUserDefaultLCID(); function Parameter pertama digunakan untuk menentukan templat yang digunakan untuk buku kerja baru. Anda dapat menggunakan xlWBATChart, xlWBATExcel4IntlMacroSheet, konstanta xlWBATExcel4MacroSheet atau xlWBATWorksheet, atau bisa juga nama file xls yang sudah ada. KosongParam di sini adalah unit Varian dan variabel yang ditentukan, yang berarti menggunakan templat universal default untuk membuat buku kerja baru. Jika Anda membuka dokumen xls yang sudah ada, Anda harus meneruskan nama file yang akan dibuka sebagai parameter pertama ke fungsi Buka: wkBook:=Excel.WorkBooks.Open(edtDesFile.text,EmptyParam,EmptyParam, BlankParam,EmptyParam,EmptyParam,EmptyParam , KosongParam,EmptyParam,EmptyParam,EmptyParam, KosongParam,EmptyParam,LCID); Anda harus tahu bahwa semua operasi data terutama untuk lembar kerja aktif. Pernyataan berikut menggunakan variabel _WorkSheet untuk mewakili sel aktif saat ini. Jika Anda mengetahui nama lembar kerja, nomor indeks dapat diganti dengan nama lembar kerja: wkSheet:=wkBook.Sheets[1] as _WorkSheet Setelah menyelesaikan pertukaran data, Anda perlu menyimpan buku kerja: Excel.ActiveWorkBook.SaveAs ('Output Saya', KosongParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, KosongParam, KosongParam, LCID); atau: Excel.ActiveWorkBook.Save(LCID); Terakhir, tutup buku kerja dan putuskan sambungan dari Excel: wkBook.Close(True, SaveAsName,EmptyParam, LCID); ; Metode Tutup di sini berisi fungsi simpan. Parameter pertama menunjukkan apakah akan menyimpan modifikasi sebelum menutup buku kerja. Parameter kedua memberikan nama file yang akan disimpan. Parameter ketiga digunakan untuk beberapa penulis untuk memproses situasi dokumen. Baris kedua meminta untuk menghentikan Excel. Pertukaran data dengan lembar kerja Input data dilakukan pada sel atau rentang tertentu pada lembar kerja yang aktif. Rentang dan sel keduanya merupakan properti objek lembar kerja. Sel adalah kumpulan sel. Jika tidak ada lokasi spesifik yang ditentukan, sel dapat mewakili semua sel di seluruh lembar kerja. Namun, biasanya digunakan untuk merujuk ke sel tertentu. mewakili sel terbaru. Sel A1 di sudut kiri atas. Perhatikan bahwa Item adalah properti default Sel di VBA dan dapat dihilangkan, tetapi tidak ada kemudahan seperti itu di Delphi. Untuk memberikan nilai pada sel, Anda harus mengacu pada properti Value-nya. Sudah jelas bahwa properti ini adalah variabel Varian, misalnya: wkSheet.Cells.Item[1, 1].Value := 'Address Book'; Tentu saja, Anda juga dapat memberikan nilai pada sel. Tentukan rumusnya: var AFormula:String; …… AFormula:='=Rand()'; wkSheet.Range['F3','G6'].Value:=AFormula; Metode di atas sangat langsung dan sederhana, tetapi sangat lambat dan tidak cocok untuk laporan besar. Jadi apakah semua data bisa ditransfer ke Excel secara berurutan? Kita dapat menggunakan Range. Objek ini mewakili suatu area di lembar kerja. Saat kita menariknya dengan mouse, biasanya objek ini berbentuk persegi panjang. Berikan saja posisi sel pojok kiri atas dan pojok kanan bawah, seperti Range[ 'C3 ','J42']. Ada sedikit masalah disini, karena jika data melebihi 26 kolom (misalnya ada 100 kolom) atau jika rentang area target perlu ditentukan dengan cepat, akan lebih merepotkan jika menggunakan nama karakter untuk menandai sel. Ingatlah bahwa karena "C3" adalah label sel, tentu saja kita juga dapat menggunakan Sel, seperti Range[Cells.Item[1,1], Cells.Item[100,100]]. Bisa dibayangkan bahwa nilai Range harus berupa array, tetapi Anda tidak boleh menggunakan Array di Delphi untuk memberikan nilai padanya! Ingatlah bahwa di Delphi, nilai objek Excel selalu bertipe Varian. var Datas: Varian; Ir, ic: Integer; …… Datas:= varArrayCreate([1,ir,1,ic],varVariant); //Buat array dinamis 100*100 di sini… //Tetapkan nilai ke elemen array di sini dengan wkSheet melakukan Range[cells.Item[3,1],cells.Item[ir+2,ic]].Value:=Datas; Perlu dicatat bahwa lembar kerja dan Range memiliki properti Cells. Untuk lebih jelasnya, pernyataan with digunakan di sini. Selain itu, Range bersifat terarah. Array satu dimensi yang dibuat dengan VarArrayCreate hanya dapat ditetapkan ke Range satu baris. Jika Anda ingin menentukan nilai untuk Range satu kolom, Anda harus menggunakan array dua dimensi contoh: Datas:=VarArrayCreate([1,100,1 ,1], varVariant); //Buat array dinamis 100*1. Omong-omong, Cells.Item[] sebenarnya mengembalikan objek Range. Pengambilan data pada worksheet pada dasarnya adalah proses kebalikan dari penulisan data. Yang perlu diperhatikan adalah cara menentukan range data pada worksheet: var ir, ic : Integer;…… wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam; ).Aktifkan ; ir := Excel.ActiveCell.Row; Fungsi sel khusus SpecialCells secara cerdik digunakan di sini untuk mendapatkan sel terakhir yang berisi data. Pengeditan Data Di bawah ini adalah dua contoh pengeditan data. var DestRange: OleVariant; start DestRange := Excel.Range['C1', 'D4']; Excel.Range['A1', 'B4'].Copy(DestRange); Jika Anda meneruskan parameter kosong ke fungsi Salin, data di area ini akan disalin ke clipboard, dan dapat ditempelkan ke lokasi lain menggunakan metode Tempel nanti. var WS: _Worksheet; …… Excel.Range['A1', 'B4'].Copy(EmptyParam); //Menyalin data dalam lembar kerja ke clipboard WS := Excel.Activesheet sebagai _Worksheet; .Range['C1', 'D4'].Pilih; //Tempel konten clipboard ke lembar kerja baru. Pengaturan format Pilih Excel sebagai server laporan terutama karena kemampuan pemformatannya yang kuat. Pertama-tama kita menggabungkan sel dengan judul "Buku Alamat" dan menampilkannya di tengah, lalu mengubah font menjadi "skrip resmi" 18 poin yang dicetak tebal: dengan wkSheet.Range['A1','D1'],Font mulai Gabung(Benar ); //Gabungkan sel HorizontalAlignment:= xlCenter; Ukuran:=18; Nama:='skrip resmi'; Jika konten sel panjang, sebagian konten tidak akan ditampilkan. Pendekatan yang biasa dilakukan adalah dengan mengklik dua kali tepi kanan area yang dipilih sehingga lebar setiap kolom secara otomatis menyesuaikan dengan panjang konten. Di Delphi, lebar kolom adaptif dan tinggi baris juga dapat dicapai melalui metode AutoFit. Perlu dicatat bahwa metode ini hanya dapat digunakan untuk seluruh baris dan seluruh kolom, jika tidak, kesalahan penolakan metode OLE untuk mengeksekusi akan muncul: wkSheet.Columns.EntireColumn.AutoFit; Laporan gaya Cina biasanya memerlukan baris tabel dengan batas atas dan bawah, dan Anda dapat menggunakan properti koleksi Borders. Perlu dicatat bahwa objek koleksi di VBA biasanya memiliki properti Item default, yang tidak dapat dihilangkan di Delphi. Properti Weight digunakan untuk menentukan ketebalan garis tabel: dengan Aname.RefersToRange,Borders dimulai HorizontalAlignment:= xlRight; Item[xlEdgeBottom].Weight:=xlMedium Item[xlEdgeTop].Weight:=xlMedium Item[xlInsideHorizontal] .Berat: =xlTipis; item[xlInsideVertical].Weight:=xlThin; end; Pengaturan halaman dan pengaturan halaman cetak diatur melalui properti objek PageSetUp pada lembar kerja. Ada lebih dari 40 konstanta kertas yang telah disetel sebelumnya di Excel VBA. Perlu dicatat bahwa beberapa printer hanya mendukung beberapa jenis kertas. Atribut Orientation digunakan untuk mengontrol arah pencetakan, dan konstanta lanskap = 2 menunjukkan pencetakan horizontal. Properti Boolean CenterHorizontally dan CenterVertically digunakan untuk menentukan apakah konten cetakan dipusatkan secara horizontal dan vertikal. dengan wkSheet.PageSetUp mulai PaperSize:=xlPaperA4; //Jenis kertas A4 PrintTitleRows := 'A1:D1'; //Ulangi baris/halaman ini LeftMargin:=18; 0,25" akan bervariasi antar printer TopMargin:=36; //0.5" BottomMargin:=36; CenterHorizontally:=Benar; Orientasi:=1; //Pencetakan horizontal (lanskap)=2, potret=1 akhir; Untuk mencetak laporan, Anda dapat memanggil metode PrintOut pada lembar kerja ini parameter opsional, dua yang pertama Digunakan untuk menentukan halaman awal dan akhir, dan jumlah salinan yang dicetak dalam format ketiga. Namun, di Delphi, parameter LCID ditambahkan di akhir, dan BlankParam tidak dapat digunakan untuk parameter ini . Demikian pula, metode pratinjau cetak PrintPreview tidak memiliki parameter dalam VBA, tetapi membutuhkan dua parameter ketika dipanggil di Delphi. // wkbook.printpreview (true, lcid); Lebih kompleks, pendekatan yang lebih baik adalah untuk menyebutkan rentang tabel tertentu dan kemudian merujuknya dengan nama. Nama adalah properti objek koleksi dari Workbook, yang memiliki metode tambahan yang dapat melakukan pekerjaan ini. Var aname: excel2000.name; …… aname: = wkbook.names.add ('buku alamat', '= sheet1! $ A $ 3: $ d $ 7', emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, Emptyparam, emptyparam); Parameter pertama dari fungsi Add adalah nama yang ditentukan, dan parameter kedua adalah rentang sel yang diwakili oleh nama. Perlu dicatat bahwa jenis nama rentang harus menggunakan kualifikasi. Selain itu, rentang bernama harus menggunakan referensi absolut, yaitu, menambahkan simbol "$". Setelah Anda menyebutkan rentang, Anda dapat merujuknya dengan nama itu. Ubah program makro Excel di Delphi! Kode berikut membuat makro untuk buku kerja kami yang merekam waktu akses terakhir saat menutup buku kerja: var lineno: integer; Codemodule; SDate: 'Tanggal Akses Terakhir:'+DatetoStr (Date ()); Makro menambahkan unit ke bagian penggunaan sebelumnya: VBIDE2000. Kunci dari kode ini adalah objek codemodule. Delphi4 dan Versi sebelumnya Delphi4 tidak menyediakan objek TexcelApplication, dan pustaka jenis perlu diperkenalkan untuk menggunakan teknologi otomasi OLE. Perbedaan utama antara kedua metode ini adalah metode untuk membangun koneksi dengan program server ; Tidak Diketahui); (Unknown.QueryInterface (_Application, Excel)); True; biaya kecepatan eksekusi kecuali bagian. Perlu dicatat bahwa coapplication fungsi yang menyertainya dan beberapa nama konstan yang dihasilkan oleh versi Delphi yang berbeda mungkin berbeda, jadi Anda harus memeriksa pustaka tipe yang sesuai. Sebelum memanggil metode QUIT, pastikan untuk melepaskan semua buku kerja dan variabel lembar kerja yang dibuat dalam program, jika tidak, Excel dapat tinggal di memori dan menjalankan (Anda dapat menekan Ctrl+Alt+Del untuk melihat). Ada masalah kecil dengan memanggil GetActiveObject untuk menangkap instance program. Selain itu, jika Anda tidak ingin memperkenalkan perpustakaan jenis, Anda juga dapat menggunakan ikatan lagging, tetapi jauh lebih lambat. Contoh berikut menyatakan variabel varian untuk mewakili aplikasi Excel: var excel: varian; .Visible: = true; Saat menggunakan ikatan lagging, kompiler tidak memeriksa metode objek Excel yang disebut, tetapi meninggalkan tugas -tugas ini ke program server untuk diselesaikan selama eksekusi. digunakan seperti yang seharusnya. '); Ws : Wbk.worksheets.item ['sheetname']; , Anda hanya bisa melakukannya sendiri: const xlwbatworksheet = -4167; Akhirnya, jangan lupa untuk merilis variabel setelah menutup Excel: Excel: = tidak ditugaskan; unit unit1; Prosedur FormActivate (pengirim: TOBJEK); BUTTRICE (TOB TOB TOB); ; wksheet: _worksheet; Baris [1] .Commatext: = 'Zhang San, Pria, 25.010-33775566'; , 18.061-7557381 '; Baris [4] , LCID); Tform1.write2xls; : = 1 ke ir do untuk j: = 1 ke ic do Data [i, j]: = StringGrid1.cells [J-1, I-1]; .Item [3,1], cells.item [ir+2, ic]]. Nilai: = data; DataS: tidak ditetapkan; = Excel.activeCell.column; DataS: Range [cells.item [1,1], cells.item [ir, ic]]. Nilai dengan stringGrid1 Mulai colcount: = ic; ke IR-1 Do untuk J: = 0 ke IC-1 Do Cell [J, I]: = data [i+1, j+1]; DATAS: AKHIR; Namesheet; Aname: = wkbook.names.add ('Buku Alamat', '= Sheet1! $ A $ 3: $ D $ 7', emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, emptyparam, emptyparam); .Addformula; Var Aformula: String; Aformula: = '= rand ()'; Font Mulai Gabungan (Benar); FontStyle: = BOLD; Item [XLInsidhorizontal]. VbComponents.item ('Thisworkbook'). Codemodule; : = CM.CreateEventProc ('Beforeclose', 'Workbook'); "+SDate+'"); Papersize: = Xlpapera4; Topmargin: = 36; //0.5 "Bottommargin: = 36; //0.5" centerhorizontally: = true; Orientasi: = 1; Mulai coba OpenExl; Format Nameshet;