我需要delphi 利用CREATEOLEOBJECT()方法操作word,向word插入文字,表格,在表格中添入数据的例子。 包括关闭保存word操作。

解决方案 »

  1.   

    http://www.bcynet.com/article/list.asp?id=292Microsoft Word 97是功能强大的文字处理软件。由于微软使用了自动化技术(即以前的OLE自动化),并且把Word中自动化
    对象的属性、方法等详细资料公布于众,这就使得Word表现出强大的可扩充性。用户或者第三方的开发人员可以使用Word提供的
    自动化服务来扩展Word的功能和控制Word。为了充分利用Word的自动化功能,微软将Visual Basic改造为Visual Basic for 
    Applications,并将其集成到Word中。因为VBA的引入,Word才有了"宏"。诚然,VBA有许多优势,如简单易学、与Word的结合紧
    密等,它的一个明显的限制便是它的运行必须在Word环境(Office环境)中。而某些时候,我们希望在Word环境之外来控制Word,
    比如,要把文字发送到Word中去,VBA就无能为力了。
    Word 97是一个自动化服务器程序,它是依靠微软的COM组件模型来实现的。COM组件模型是一种基于客户/服务器结构的技
    术规范,它使得软件部件与应用程序的交互成为可能。除了基本的COM服务外,微软对这项技术进行了如下扩充:Automation 
    servers,Automation controllers(即自动化对象的客户程序),ActiveX controls,Type libraries,Active Documents,
    Visual cross-process objects。COM的实现与编程语言无关。要使用Word 97的自动化,其实就是要编写自动化控制程序
    (即客户程序)。本文中笔者想以Delphi为例,谈谈如何有效地使用Word 97提供的自动化功能。读者也可根据本文的介绍,用其
    他的编程语言或者工具来实现。
    Delphi提供了variant类型的变量,我们可以用一个variant变量来指代一个自动化对象。通过variant变量,我们可以访问
    自动化对象的属性或者方法。由于自动化对象的方法调用和属性读写的合法性都是在程序运行时进行动态检查的,而编译期间并
    不检查它们的合法性,所以,我们不需要声明它们。但是如果某个自动化对象不提供某一个属性或者方法,而其他的程序却引用了
    它,那么就会引起运行期的错误。故而,在编写自动化服务器的客户程序之前,我们必须了解自动化对象的方法和属性。下面笔者
    简单地介绍一下Word 97中的自动化对象及其常用方法、属性。
    Word 97的自动化对象有两个:Word.Application和Word.Basic。
    Word 97提供了Application自动化对象(即Word.Application),该对象代表整个Word 97应用程序。Application 对象包
    括可返回最高一级对象的属性和方法。例如,ActiveDocument 属性可返回 Document 对象。Application对象包含有许多属性,
    如ActiveDocumnet(返回当前的活动文档), CapsLock(大写锁定键的当前状态), Caption(Word 97的标题);以及方法,如,
    Activate, CheckSpelling, CheckGrammar等。每个子对象下面又定义了属性、方法。如果你以前用VBA编写过Word 97宏命令
    的话,那么你对这些对象、属性及方法一定比较熟悉了。如果你还不具备这些信息的话,那也没什么关系,你可以在Office 97光盘
    中的Vbawrd8.hlp帮助文件中获取详细的资料。在本文中,笔者的重点放在如何编写客户程序上。
    为了使用Word 97的服务,首先我们需要创建一个Word.Application自动化对象。使用CreateOleObject函数我们可以创建
    一个自动化对象,此函数的原型为:  function CreateOleObject(const ClassName: string): IDispatch;
    当我们使用CreateOleObject时,它所进行的操作便是先启动一份Word 97拷贝(不管Word 97是不是正在运行),然后返回一
    个Word.Application。如果系统中已经有Word 97在运行,再启动一份显然是浪费内存!这种情况下,我们希望获取当前这份Word
    97的Word.Application对象。为了解决这个问题,笔者通过查阅Delphi Help 和Win32 OLE Help及自己的实践,找到了一种比
    较简便的方法:
      

  2.   

    一、Delphi程序启动Word
    采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:
    首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word二、Delphi程序新建Word文稿
    格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
    Template: 使用模板的名称,
    NewTemplate: 新建文档的类型,True表示为模板,False表示为文档
    DocumentType: 文档类型,默认为空白文档
    Visible: 打捞的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False);三、Delphi程序打开Word文稿
    格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
    PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,
    Format,Encoding,Visible)FileName: 文档名(包含路径)
    Confirmconversions: 是否显示文件转换对话框
    ReadOnly: 是否以只读方式打开文档
    AddToRecentFiles: 是否将文件添加到"文件"菜单底部的最近使用文件列表中
    PassWordDocument: 打开此文档时所需要的密码
    PasswordTemplate: 打开此模板时所需要的密码
    Revert: 如果文档已经,是否重新打开文档
    WritePasswordDocument: 保存对文档更改时所需要的密码
    WritePasswordTemplate: 保存对模板进行更改时所需要的密码
    Format: 打开文档时所需使用的文件转换器
    Encoding: 所使用的文档代码页
    Visible: 打开文档的窗口是否可见举例:
    Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
    AddToRecentFiles:=False);四、Delphi程序保存Word文稿
    格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,
    AddToRecentFiles, WritePassword, ReadOnlyRecommended, 
    EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, 
    SaveAsAOCELetter)FileName: 文件名。默认为当前文件夹和文件名。
    FileFormat 文档保存的格式。
    LockComments 如果为 True,则此文档只允许进行批注。
    Password 打开文档时的口令。
    AddToRecentFiles 如果为True,则将文档添至"文件"菜单中最近使用的文档列表中。
    WritePassword 保存对文档的修改所需的口令。
    ReadOnlyRecommended 如果为 True,在每次打开文档时,Word 将建议用户采用只读方式。
    EmbedTrueTypeFonts 如果为 True,则将文档与 TrueType 字体一起保存。
    SaveNativePictureFormat 如果为 True,则从其他系统平台(例如 Macintosh)导入的图形仅保存其 Windows 版本。
    SaveFormsData 如果为 True,则将窗体中用户输入的数据存为一条数据记录。
    SaveAsAOCELetter 如果文档包含一个附加,当此属性值为 True 时,将文档存为一篇 AOCE 信笺(同时保存邮件)。举例:
    Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,
    AddToRecentFiles=False);
      

  3.   

    function GetWordObject (const ClassName: string): IDispatch;
    var
    ClassID: TGUID;
    Unknown: IUnknown;
    begin
    ClassID := ProgIDToClassID (ClassName);
    if Succeeded (GetActiveObject (ClassID, nil, Unknown)) then
    OleCheck (Unknown.QueryInterface (IDispatch, Result))
    else
    Result := CreateOleObject (ClassName);
    end;
    许多自动化对象支持两种参数传递方式:按顺序或者按名字。综合以上的叙述,笔者用Delphi编写了一个比较简单的例子,它
    的功能是在Word 97中创建一个新文档,并且向这个文档中发送文字。程序如下:
    unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls,
    ComObj, ActiveX;
    {一定要包含ComObj和ActiveX两个单元}
    type
    TForm1 = class(TForm)
    Button1: TButton;
    SaveDialog1: TSaveDialog;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form1: TForm1;
    implementation
    {$R *.DFM}
    var Word97: Variant;
    function GetWordObject (const ClassName: string): IDispatch;
    {如果Word 97没有运行,则启动它,并返回一个自动化对象;
    如果Word 97已经启动,就返回正在运行的实例的自动化对象。}
    var
    ClassID: TGUID;
    Unknown: IUnknown;
    begin
    ClassID := ProgIDToClassID (ClassName);
    if Succeeded (GetActiveObject (ClassID, nil, Unknown)) then
    OleCheck (Unknown.QueryInterface (IDispatch, Result))
    else
    Result := CreateOleObject (ClassName);
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    {获取(创建)Word.Application 自动化对象,
    如果Word 97尚未运行,Word 97将会被启动}
    Word97 := GetWordObject (‘Word.Application');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
    NewDocument, TheRange: Variant;
    begin
    //让Word 97可见
    Word97.Visible := True;
    Word97.UserName:=‘刘明华';
    Word97.Caption:=‘Delphi is Great!';
    //增加一个新的Word文档对象
    NewDocument:=Word 97.Documents.Add;
    //设置第一段的内容、字体、字体粗细、字体的颜色及大小
    NewDocument.Paragraphs.Item(1).Range.Text:=‘Hello, My Fellow Chinese!';
    NewDocument.Paragraphs.Item(1).Range.Bold :=True;
    NewDocument.Paragraphs.Item(1).Range.Font.Size :=30;
    NewDocument.Paragraphs.Item(1).Range.Font.Name:=‘Comic Sans MS';
    NewDocument.Paragraphs.Item(1).Range.Font.ColorIndex:=6;//Red
    //增加一段
    NewDocument.Paragraphs.Add;
    {通过下面的赋值语句,使得Variant变量TheRange等同于
    NewDocument.Paragraphs.Item(2).Range对象}
    TheRange:=NewDocument.Paragraphs.Item(2).Range;
    //获取本份Word 97的合法用户名,并将此信息作为文档第二段的内容
    TheRange.Text:=String(‘This copy of Word 97 is licensed to '+Word97.Application.UserName);
    TheRange.Font.Name:=‘Times New Roman';
    TheRange.Font.Italic:=TRUE;
    TheRange.Font.Size:=18;
    TheRange.Font.ColorIndex:=4;
    //把Memo1中的内容插入文档
    NewDocument.Paragraphs.Add;
    TheRange:=NewDocument.Paragraphs.Item(3).Range;
    TheRange.Font.Italic:=False;
    TheRange.Font.Size:=16;
    TheRange.Text:=Memo1.Text;
    TheRange.Font.ColorIndex:=5;
    {
    //注释中的这段代码将提示用户保存这个新文档
    if SaveDialog1.Execute then
    NewDocument.SaveAs (
    FileName := WideString (SaveDialog1.Filename),
    FileFormat := 0,
    SaveNativePictureFormat := 1);
    //注意
    }
    end;
    end.
      

  4.   

    一些Word的事件Application事件中需要处理的有:DocumentBeforeClose,DocumentChange。Document_Close:事件在文档关闭时产生事件
    DocumentBeforeClose:在文档被关闭以前先于Word判断文档是否保存,给出相应提示并进行相应处理。
    DocumentChange:文档切换,在文档从自己修改的文稿和其他人修改的文稿之间切换产生事件,主要处理设置文档权限等