1、可供选择的技术:
(1) 通过delphi的控件tolecontainer 将office嵌入,这是最简单的ole嵌入,能够直接将office文档调用,只需要使用tolecontainer.run就可以将office文档直接启动。且这样启动的office文档与delphi程序是一个整体(从界面上看),但是它存在不可克服的缺点,即不能通过delphi控制office文档,也就不能实现将灵活操纵office的目的。基本上排除这项技术。
(2) 使用delphi提供的servers控件调用office,使用office的属性,使用delphi的servers控件来操纵office,在编程时delphi能够实现代码提示,总体上看能够较好的实现delphi对office的控制,但是还有一些office的功能不能在delphi中调用(比如自己编写的vba宏代码)。且实现功能时本来在vba代码中可选择参数在delphi调用的时候必须添加,否则,连编译都不能通过。这种方式启动的office与delphi程序分属两个窗体。
(3) 使用createoleobject将启动office,然后以ole方式对office进行控制。这种办法是使用以createoleobjects方式调用office,实际上还是ole,相比(2)service控件的最大缺点就不支持代码code的自动生成,但是咱们充分的利用vba代码code就能够弥补那个功能,这种方式能够真正做到完全控制office文件,能够使用office的所有属性,包括自己编写的vba宏代码。与servers控件和com技术相比,本方法能够真正地使用office的各种属性,和在vba中编写自己的代码基本一样,可以缺省的代码也不需要使用。重点放在这种技术的使用上。
2、delphi使用createoleobject 技术操控office文档。
原理性描述:
1、 生成vba代码code。word本身具有很强的可扩展性,尤其是支持用户自定义功能,其呈现
的主要方法就经过vba代码code来呈现的。在“视图->宏->查看宏”(alt+f8) 里面就能够看
到具体的宏代码code,能够直接编辑。而且还能够应用录制宏的功能自动生成宏代码code。窍门是
选取“视图->宏->录制宏”,然后执行自己希望经过程式呈现的功能,如存盘、打印等功能,
此时word一边执行您要呈现功能,一边将您的操作录制生成了唯一宏,在呈现功能后,能够选取
“视图->宏->查看宏”(alt+f8),查看生成的宏代码code。
例如:咱们要将文档中的“研讨”全部替换成“研讨”。
a. 点击“视图->宏->录制宏”,直接点击确定,默认的宏保存到了normal.dot操作系统公
用模板里面。
b. 点击“编辑->查找”,呈现弹出对话框,输入查找和替换的字,点确定。停止替换。
c. 结束宏的录制,点击结束按钮。
d. “视图->宏->查看宏”(alt+f8)。缺省查看normal里面
的模块里面的newmacros模块。
以下是生成的宏代码code:
sub ething宏1()
'
' ething宏1 宏
' 替换
'
selection.find.clearformatting
selection.find.replacement.clearformatting
with selection.find
.text = "你"
.replacement.text = "您"
.forward = true
.wrap = wdfindcontinue
.format = false
.matchcase = false
.matchwholeword = false
.matchbyte = true
.matchwildcards = false
.matchsoundslike = false
.matchallwordforms = false
end with
selection.find.execute replace:=wdreplaceall
end sub
2、 精简宏代码code。通常,生成的宏代码code有很多语句对您要呈现的功能来说都是多余的。咱们要
做的就找到咱们需求的代码code。此时咱们查看具体的代码code,剔除明显没有用途的代码code,然后光
标停留在宏上面,按f5执行,看也许呈现功能,逐步精简,得到最小代码code。此步骤可参考word的
vba帮助来判断代码code也许有用。
如上例,精简下来,剩下以下代码code。
sub macro1()
selection.find.clearformatting
selection.find.replacement.clearformatting
with selection.find
.text = "你"
.replacement.text = "您"
end with
selection.find.execute replace:=wdreplaceall
end sub
3、 转换成delphi编程代码code。这一步其实很简单,对于vba代码code,只需求在前面添加word的句柄或者
文档的句柄或者文档的句柄.application就能够直接操作了。
例:逐句中英对译:(word_handle是word的句柄)
(vb) selection.find.clearformatting
(delphi编程) word_handle.selection.find.clearformatting;
(vb) selection.find.replacement.clearformatting
(delphi编程) word_handle.selection.find.replacement.clearformatting;
以上两句简单添加上word的句柄就能够了。
(vb) with selection.find
text = "研讨"
replacement.text = "研讨"
end with
(delphi编程) word_handle.selection.find.text := '研讨';
word_handle.selection.find.replacement.text := '研讨';
以上几句由于delphi编程不支持variant的with框架,所以分开写。同时转换成delphi编程语句语言规则。
(vb) selection.find.execute replace:=wdreplaceall
(delphi编程) word_handle.selection.find.execute(replace:=2);
上面一句存在唯一小窍门,找到常量wdreplaceall的数值为2?
那里有几个办法,
一:直接use word2000或者word97单元(可以通过加入tserver中的word,查看uses,决定word2000 还是wordxp),那么直接应用常量wdreplaceall就能够了;
二:到word2000.pas或者word97.pas里面查找wdreplaceall的数值;
三:直接应用vba代码code见wdreplaceall的数值呈现出来。办法是写唯一小过程,然后执行,如下:
sub showvalue()
msgbox wdreplaceall
end sub
最后补充一下,很多涉及word的资料能够从word的vba帮助里面获得。具体文档在
?:"program files"microsoft office"office10"2052(xp)下,vbawd10.chm,更多有联系版本路径基本类似。
例子:
使用createoleobject将启动office,然后以ole方式对office进行控制。以excel表格为例(表格的格式可以是事先设定好的,也可以是自己自由定义的,这里以事先设定好表格的格式为例),进行说明:
(1) 在uses中添加comobj类;
(2) 申请一个全局变量:fvexcel ,类型为variant; 表示是excel对象
(3) 定义一个函数用来启动excel,如定义function openexcel(strfilename : string) : boolean;
function tform1. openexcel(strfilename : string) : boolean;
begin
result := true;
try
fvexcel := createoleobject('excel.application');
except
application.messagebox('打开excel失败',pchar(application.title),mb_iconerror);
result := false;
end;
fvexcel.visible := true;
fvexcel.caption := '';
fvexcel.workbooks.open(strfilename); //打开工作簿
fvexcel.worksheets[1].activate;//设置第1个工作表为活动工作表
end;
(4) 向fvexcel中插入数据
fvexcel.cells[row,col].value:=’中国’;//row表示行,col表示列;
(5) 设置格式
fvexcel.rows[row].font.color:=clred; //设置某一行数据的颜色
fvexcel.activesheet.pagesetup.leftmargin:=1;//设置左页边距
fvexcel.activesheet.pagesetup. rightmargin:=1;//设置右页边距
fvexcel.activesheet.pagesetup.zoom:=100;//设置显示比例
fvexcel.activesheet.pagesetup.papersize:= xlpapera4;//设置打印纸张大小