OLE自動化是Windows應用程序之間互相操縱的一種技巧。被操縱的一方稱為自動化服務器(也稱自動化對象),典型的自動化服務器有Microsoft Word、Excel和PowerPoint。操縱自動化服務器的一方稱為自動化控制器。在開發數據庫應有程序中,經常需要借助Microsoft Excel的強大報表功能,把數據庫中的數據輸出到Excel表格中。Delphi 5.0以前的版本雖然也可以編寫自動化控制器和自動化服務器,但編寫程序較為復雜,不易掌握。Delphi 5.0對於OLE提供了強大的支持,利用Delphi 5.0最新提供的Servers欄控件可以很容易開發OLE自動化控制器實現對OLE自動化服務器的調用,發揮Word、Excel、PowerPoint的強大功能。
下面給出一利用Delphi 5.0開發OLE自動化控制器操縱Excel的實例,希望對用Delphi開發OLE應用程序的編程人員有所幫助。
首先新建一Application, 然後在Form1上放置
Servers欄控件ExcelApplication1、 ExcelWorkbook1、
ExcelWorksheet1, 再放置控件Table1、 Datasource1、
Dbgrid1、 Button1、 Button2、 Button3、 Button4, 並設置
Table1.databasename:=dbdemos,
Table1.TableName:=Country.db,
Table1.active:=True, Button1.Caption:='
SaveToExcel',
Button2.caption:='PrintPrevIEw',
Button3.caption:='Print',
Button4.caption:='CloseExcel'。
代碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls,
Forms, Dialogs, Excel97, OleServer, Db, DBTables,
Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
ExcelApplication1: TExcelApplication;
ExcelWorkbook1: TExcelWorkbook;
ExcelWorksheet1: TExcelWorksheet;
Table1: TTable;
Table1Name: TStringFIEld;
Table1Capital: TStringFIEld;
Table1Continent: TStringFIEld;
Table1Area: TFloatFIEld;
Table1Population: TFloatFIEld;
button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.button1Click(Sender: TObject);
var
i,row,column:integer;
begin
Try
ExcelApplication1.Connect;
Except
MessageDlg('Excel may not be installed',
mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
ExcelApplication1.Workbooks.Add(Null,0);
ExcelWorkbook1.ConnectTo
(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo
(ExcelWorkbook1.Worksheets[1] as _Worksheet);
Table1.Open;
row:=1;
While Not(Table1.Eof) do
begin
column:=1;
for i:=1 to Table1.FIEldCount do
begin
ExcelWorksheet1.Cells.Item[row,column]:
=Table1.fIElds[i-1].AsString;
column:=column+1;
end;
Table1.Next;
row:=row+1;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ExcelWorksheet1.PrintPrevIEw;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ExcelWorksheet1.PrintOut;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
end;
end.
本程序在Delphi 5.0下調試通過。
讓Delphi與Office聯姻
由於微軟的Office系列的完善的功能;與Windows和IE的緊密集成以及強大的擴展能力,它實際上已經成為事實上的Windows下辦公軟件的標准,我們知道在VB中可以建立各種Office對象(Word、Excel)並控制這些對象編輯、打印、保存文檔以及控制執行Office中的很多操作。象這樣在VB中建立並控制Office對象是十分有用的,例如你可以將一個或者一批數據庫自動輸入到Word或者Excel中並保存,再通過OutLook將文檔分發給其它同仁。
過去,這只有通過VB才能實現的,但是現在Delphi5也提供了這樣強大的對象組。利用Delphi也可以利用Office資源了。
打開Delphi,滾動Compent Palette到Servers頁,就可以看到很多熟悉的控件圖標,這些就是Office組件的控件。Delphi 5中對應Office的組件包括了Word、Excel、Access、PowerPoint和Outlook可以說是十分的全面。不過要使用這些組件首先要保證你的系統中安裝了Office 97或以上的 版本。
下面首先來說以下Office組件的基本使用方法Delphi中對於Office中不同的組件,首先要建立一個Application對象,例如要控制Word,首先要建立TWordApplication對象,然後再將諸如TWordDocument等Word對象通過ConnectTo方法連接到TWordApplication對象上。對於其它的Excel、Outlook等也是如此。
下面我通過具體的范例來說明對Delphi中Office對象的控制,即如何將文字輸出到Word中進行簡單的排版並保存和打印輸出。
首先建立一個新的工程,在Form1中加入三個TButton對象、一個TMemo對象、一個TWordApplication對象、一個TWordDocument對象、一個TWordFont對象。下面是Form1的代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Word97, OleServer,CliPBrd;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
WordApplication1: TWordApplication;
WordDocument1: TWordDocument;
WordFont1: TWordFont;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := '插入到Word';
Button2.Caption := '打印';
Button3.Caption := '退出';
Button2.Enabled :=False;
Button3.Enabled :=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Template,NewTemplate,ItemIndex:OleVariant;
procedure setfont;
begin
WordFont1.ConnectTo(WordDocument1.Sentences.Get_Last.Font);
WordFont1.Bold := 1;
WordFont1.Italic := 1;
WordFont1.shadow := 1;
WordFont1.Size := 12;
end;
begin
try
Template := EmptyParam;
NewTemplate := True;
ItemIndex := 1;
try
Wordapplication1.Connect;
except
MessageDlg('無法連接,也許沒有安裝Word', mtError, [mbOk], 0);
Abort;
end;
Wordapplication1.Visible := False;
WordApplication1.Caption := 'Delphi Word';
file://建立一個新文檔
Template := EmptyParam;
NewTemplate := False;
WordApplication1.Documents.Add(Template, NewTemplate);
file://建立WordDocument連接
WordDocument1.ConnectTo(WordApplication1.Documents.Item(ItemIndex));
file://因為Word進行拼寫檢查需要很多時間,所以首先關閉檢查
WordApplication1.Options.CheckSpellingAsYouType := False;
WordApplication1.Options.CheckGrammarAsYouType := False;
file://將Memo1的內容拷貝到Word中
SetFont;
WordDocument1.Range.InsertAfter('Memo1的文本: ' + #13+Memo1.Text + #13);
Button2.Enabled :=True;
Button3.Enabled :=True;
Button1.Enabled :=False;
except
on E: Exception do
begin
ShowMessage(E.Message);
WordApplication1.Disconnect;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WordDocument1.PrintOut;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
SaveChanges,OriginalFormat,RouteDocument,SavePath: OleVariant;
begin
SaveChanges := WdDoNotSaveChanges;
OriginalFormat := UnAssigned;
RouteDocument := UnAssigned;
try
SavePath:='c:samp.doc';
WordDocument1.SaveAs(SavePath);
WordDocument1.Close;
WordDocument1.Disconnect;
WordApplication1.Quit(SaveChanges, OriginalFormat, RouteDocument);
WordApplication1.Disconnect;
close;
except
on E: Exception do
begin
Showmessage(E.Message);
WordApplication1.Disconnect;
end;
end;
end;
end.
運行程序,在Memo1中輸入一些文字,點擊“插入到Word”按鈕,然後點擊“打印”按鈕就可以將由Memo1輸入到Word中的文本打印出來。點擊“退出”按鈕就可以將文檔保存到 c:samp.doc 中然後關閉與Word的連接並退出。
由上面的范例可以看到,Delphi對於Office組件的編程同VB是有一些相似的,由於不知道什麼原因,Delphi並沒有提供Office組件的幫助文檔。上面的程序我是一點點摸索出來的,但是如果你掌握了Office組件的編程技巧,加上Delphi強大的功能,一定會使你的程序如虎添翼的。
以上程序在Windows98、Windows2000,Delphi5.0,Office2000下運行通過。