Delphi编程如何控制生成Office文档?有关于Office的api吗?(100分)

  • 主题发起人 主题发起人 windyson
  • 开始时间 开始时间
ole 调用word以后要怎么把它关闭?delphi4好像很难做到....
 
I have an EX of Excel,Hope it can help!!!
var
ExcelApp,MyWorkBook,mysheet:Variant;
i :byte;
s: string;
begin
try
ExcelApp:=CreateOleObject('Excel.Application');
MyWorkBook:=CreateOleobject('Excel.Sheet');
//Build
MyWorkBook:=ExcelApp.workbooks.open('C:/Book1.xls');//Open
except
on Exceptiondo
raise exception.Create('无法打开Xls文件,请确认已 经安装EXCEL')
end;
ExcelApp.Visible := true;
mysheet:=MyWorkBook.WorkSheets[1].name;
end;
 
有讨论的给我一封!
 
怎样才能关闭在后台运行的Word程序,调用Close,或是Quit方法好想都无法关闭....
 
OLE自动化技术
OLE自动化的技术可使得使用者能控制在其他应用程序或DLL中的对象。有两种主要类型的自动化:
自动化服务器
自动化客户
自动化服务器提供了能让自动化客户使用的功能。换言之。提供对象的应用程序或DLL叫作服务器,而使用它的应用程序或DLL叫作客户。
典型的OLE自动化服务器的例子有Word 和Excel。。这两个应用程序能由DELPHI应用程序和其他自动化客户控制。
有两种类型的OLE自动化服务器:
进程内部服务器
区域服务器
进程内部服务器实际上是装载到用户程序地址空间上的DLL。区域服务器实际上是包含自动化服务器的独立的可执行程序。
OLE自动化对象在本质上是一种实现IDispatch接口的COM对象。因此,现在OLE自动化也叫COM自动化。在System单元中,IDispatch接口是这样声明的:
IDispatch = interface(IUnknown)
['{00020400-0000-0000-C000-000000000046}']
function GetTypeInfoCount(out Count: Integer): HResult;
stdcall;
function GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID;
Names: Pointer;
NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult;
stdcall;
function Invoke(DispID: Integer;
const IID: TGUID;
LocaleID: Integer;
Flags: Word;
var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
end;
IDispatch接口最重要的方法是Invoke()。当客户获取一个OLE自动化服务器的IDispatch接口指针后,它就可以调用Invoke()方法来执行服务器的一个方法。DispID参数由于指定一个要执行的方法的识别号。IID参数目前未使用。LocaleID参数包含了语言信息。Flags参数用于指定方法的类型(一般的方法、特性的读访问方法、特性的写访问方法)。Params特性是一个数组,用于指定要传递给方法的参数。VarResult参数是一个指向OLEVariant的指针,用于返回所调用方法的返回值。ExcepInfo是一个指向TexcepInfo记录的指针,如果Invoke()返回DISP_E_EXCEPTION,则这个记录包含了错误信息。如果Invoke()返回DISP_E_TYPEMISMATCH或DISP_E_PARAMNOTFOUND,ArgErr参数是指向一个整数的指针,该整数表示Params数组中哪个参数导致了错误。
IDispatch接口的GetIDsOfNames()方法用于根据名称来获取方法的识别号。这个方法的IID参数目前未用。Names参数用于给出一个或几个方法的名称。NameCount参数用于指定Names参数中实际的方法名称数。LocaleID参数包含了语言信息。DispID参数是一个整数数组,返回每个方法的识别号。
GetTypeInfo()方法用于获取OLE自动化对象的类型信息。Index参数通常为0。LocaleID参数包含了语言信息。如果方法调用成功,TypeInfo参数就是一个ITypeInfo指针,返回OLE自动化对象的类型信息。
GetTypeInfoCount方法()用于检查OLE自动化对象是否支持类型信息。Count参数只能有两个值:0表示OLE自动化对象不支持类型信息,1代表OLE自动化对象支持类型信息。
OLE自动化的过程
下面是DELPHI控制WORD 的简单例子。
Uses
Comobj;
Procedure tform1.Button1Click(Sender:Tobject);
Var
V:Variant;
begin
V:=CreatOleobject(‘Word.Application’);
V.Visible:=True;
end;
其中最为重要的是CreateOleObject函数,其在Comobj单元中的声明如下:
CreateOleObject(const ClassName: string): IDispatch;
调用CreatOleobject是为来检索一个名为ClassName的OLE自动化对象,当检索到后,它调用大量系统内部的OLE函数,这一系列调用的最终结果是这些函数把一个COM对象作为返回值。在此,当调用CreatOleobject时,程序在注册表HKEY_CLASSES_ROOT/CLSID中查找VersionIndependentProgID的数据为Word.Application的对象。我的注册表中其在下
HKEY_CLASSES_ROOT/CLSID/{000209FF-0000-0000-C000-000000000046}
然后调用存在于Word内部的称为Application的对象,CreatOleobject在Idispatch接口中得到该对象的一个实例,这个接口封装在称为V的Variant内。这个Variant很有价值。Variant的名称是来源于它们能根据环境提供大量不同的功能。例如,它们能包含一个字符串、一个整数或一个COM对象。换句话说,Variant具有变量类型因不同情况而异的功能,这就是它们被称为Variant的原因。
V.Visible:=True;是使对象可视,但它不同于标准的DELPHI语句:Form1.Visible:=True,表面上两者相同,具体来说,如果你调用DELPHI窗体对象的Visible属性,属性几乎立即就改变了。而调用OLE自动化对象的Variant类型变量V的Visible属性会引来一系列内部事件,导致Word内部Application对象的Visible属性的改变。但这一过程中发生了多步变化。首先,调用Comobj单元的VarDispInVoke方法,在调用GetIDsOfNames方法,最后转到IDispatch接口。实际上,DELPHI通过IDispatch接口来调用Word内部的对象和方法。
IDispatch调用一个方法通常是分两步进行。首先,调用Idispatch..GetIDsOfName以获得所调用的方法的ID或代码。然后,用GetIDsOfName返回的ID值传递给Idispatch..Invoke,Idispatch..Invoke根据ID调用OLE自动化对象的相应的方法。
Word的对象模型
前面我们知道了DELPHI中OLE自动化的过程,通过OLE自动化, DELPHI几乎可以完全控制Word的所有功能,但我们只是了解了DELPHI是通过什么控制Word的,其具体的方法却来自Word内部对象的方法,只了解OLE自动化的过程是不够的,更应该了解Word内部的对象和方法。Word内部的对象层次较复杂,下面只介绍用到的几个对象:
Application对象,代表 Word 应用程序。
Documents集合,由 Word 当前打开的所有do
cument 对象所组成的集合。
Document对象, 代表一篇文档。Document 对象是do
cuments 集合中的一个元素。 do
cuments 集合包含 Word 当前打开的所有do
cument 对象。
Selection 对象,代表一个窗格中的选定内容。该选定内容可以包括文档中的一个区域,也可以仅包括插入点。 每个窗格中只能有一个 Selection 对象,而且只能激活一个 Selection 对象。
Tables集合,由代表选定内容、范围或文档中的表格的 Table 对象所组成的集合。
代表一张表格。Table 对象是 Tables 集合的一个成员。Tables 集合包含了指定的选定内容、范围或文档中所有表格。
Range 对象,该对象代表文档中的一个范围。每一个 Range 对象由一起始和一终止字符位置定义。和文档中书签的使用方法类似, Range 对象可识别文档的指定部分。然而,其区别在于 Range 对象只在已定义对象的过程正在运行时,才存在。 Range 对象和选定内容相互独立。也就是说,可定义和复制一个范围而不需改变选定内容。还可在文档中定义多个范围,但每一窗格中只能有一个选定内容。
Cells 集合,是由表格列、表格行、选定内容或区域中的 Cell 对象组成的集合。
Cell 对象,代表单个表格单元格。Cell 对象是 Cells 集合中的元素。Cells 集合代表指定对象中所有的单元格。
ParagraphFormat 对象,代表段落的所有格式。
Font 对象,该对象包含了各种字体属性(字体名称、字体大小、颜色,等等)。
Columns 集合,由 Column 对象所组成的集合,该集合中的对象代表表格中的列。
Column 对象,代表单个表格列。Column 对象是 Columns 集合的一个元素。Columns 集合包括某一表格、选定内容或区域中的所有列。
Borders 集合,由 Border 对象所组成的集合,该集合代表某一对象的边框。Border 对象,代表一个对象的边框。Border 对象是 Borders 集合中的元素。
DELPHI中OLE自动化WORD自动化的方式
1、较早的方式:
V:=CreateOleObject('word.basic');
这是利用word5.0和word6.0中的word.basic,该对象包含了在 Word 6.0 和 Word for Windows 95 中。
2、DELPHI 4.0的方式:
V:=CreatOleobject(‘Word.Application’);
这是利用word97中的VBA(Visual Basic for application)。
以上这两中方式,在设计时,不能显示出对象的属性、方法和函数,并且,在编译时,对错误的属性、方法和函数,并不报告错误,直到运行时,才能提示错误。因此,给设计者带来很大困难。
3、 DELPHI 5.0的新方式:
在DELPHI 5.0,新增加了Servers页,包含32个控件,这些是DELPHI 5.0把Microsoft Word 、Excel等的对象封装在内的控件,但其实质并没有变化,只是为编程者在设计时提供了方便。如WordApplication控件对应的是Word中的Application对象。
 
我也向请教一下怎么把褒贬转化为word文档!
 
Delphi5中可以通过OLE Automation接口连接Word
 
接受答案了.
 

Similar threads

D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
809
DelphiTeacher的专栏
D
后退
顶部