中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
Delphi开发OLE自动化控制器操纵Excel
作者:dang  时间:2006-10-05 13:04 出处:ccidnet.com 责编:月夜寒箫
              摘要:Delphi开发OLE自动化控制器操纵Excel

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下运行通过。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有