程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi開發OLE自動化控制器操縱Excel

Delphi開發OLE自動化控制器操縱Excel

編輯:Delphi

 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下運行通過。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved