我想用DELPHI新建一个word文档,代码如下:
wordapplication1.Documents.Open('d:\word1.doc','','','','','','','','',
'','');
但是,它运行出错,请各位高手指教,如何新建word文档?
还有那里可找到wordapplication1.ActiveDocument.Protect()过程的
详细参数?
同时各位高手如果有关于操作word文档的代码,请给小弟
一份。
给小弟解答问题的都有分加。
wordapplication1.Documents.Open('d:\word1.doc','','','','','','','','',
'','');
但是,它运行出错,请各位高手指教,如何新建word文档?
还有那里可找到wordapplication1.ActiveDocument.Protect()过程的
详细参数?
同时各位高手如果有关于操作word文档的代码,请给小弟
一份。
给小弟解答问题的都有分加。
解决方案 »
- POS打印字体:天天要改,我要挂掉了.高手救命.
- 关于广域网中三层数据库架构的安全问题
- 大虾:问一个项目中窗体的创建问题。用那一种方法最好?
- http://www.17delphi.org
- 新建的一个工程,为什么不好用?
- 在快速拖gdgrid滚动条时出现grid index out of range!
- 那位能帮我解释一下Inherited的语法?
- 在进行循环或递归时,如果手动终止,例如用一个“停止”按钮?
- 怎样在sql语句中查询bmp的图标,怎样赋值,存储?
- 请问那位大哥有DELPHI的ADO补丁
- 我想在form的click事件里触发一个button的click事件,参数该怎样写呢?
- spcomm怎么发送成功数据后,发送队列不为空啊?急问
procedure TForm1.Button1Click(Sender: TObject);
var
vWord,vDoc,vRange : Variant ;
sText,sReplace : string ;
lReturn : Boolean ;
begin
sText := 'ABCDEFG' ; //原文字串
sReplace := 'GFEDCBA' ; //新字串
vWord := CreateOleObject('Word.Application') ;//创建Word线程
try
//打开要操作的文件
vDoc := vWord.Documents.Open('C:\My Documents\AAAc.Doc');
vDoc.Select ; //选取中整个文档
vRange := vDoc.Range ; //替换范围
lReturn := True ;
while lReturn do
begin //找到并替代成功则返回 True 共11个参数
lReturn := vDoc.Range.Find.Execute(sText,,,,,,,,,sReplace,True) ;
end ;
finally
vDoc.Close(True) ; //关闭文并保存
vWord.Quit(False) ; //退出Word
end ;
end;
Delphi 3 下通过。
http://www.ksdev.com/vcl/index.html
http://vcl.vclxx.org/DELPHI/D32FREE/DATA2WRD.ZIP最近接触了一个用户的案例,用delphi控制word做一个合同管理程序。办公人员先根据业务需要,写好合同的文字,但在用户名称、产品名称等变化的位置填写指定的标记字符串,然后通过delphi把数据库中的实际数据替换掉word中的文字,最后让word打印出合同。 delphi自带了一个简单的word例题,但功能太简单。通过查找vba的说明,再对照delphi的vcl,编写了如下代码,实现了基本的公文管理功能。 启动word时用如下代码:
begin
try
wordapplication.connect;
except
messagedlg('word may not be installed', mterror, [mbok], 0);
abort;
end;
wordapplication.visible := true;
wordapplication.caption := 'delphi automation';
end; 关闭word用如下代码。如果想保存doc文件,请修改savechanges变量的内容:
var
savechanges, originalformat, routedocument: olevariant;
begin
savechanges := wddonotsavechanges;
originalformat := unassigned;
routedocument := unassigned;
try
wordapplication.quit(savechanges, originalformat, routedocument);
wordapplication.disconnect;
except
on e: exception do
begin
showmessage(e.message);
wordapplication.disconnect;
end;
end;
end; 让word打开一个指定的文件,需要先放置opendialog,然后调用wordapplication.documents.open:
var
itemindex :olevariant;
filename, confirmconversions, readonly, addtorecentfiles,
passworddocument, passwordtemplate, revert,
writepassworddocument, writepasswordtemplate, format: olevariant;
begin
if not dlgopen.execute then
exit; {open document}
filename := dlgopen.filename;
confirmconversions := false;
readonly := false;
addtorecentfiles := false;
passworddocument := '';
passwordtemplate := '';
revert := true;
writepassworddocument := '';
writepasswordtemplate := '';
format := wdopenformatdocument; wordapplication.documents.open( filename, confirmconversions,
readonly, addtorecentfiles, passworddocument, passwordtemplate,
revert, writepassworddocument, writepasswordtemplate, format ); {assign worddocument component}
itemindex := 1;
worddocument.connectto(wordapplication.documents.item(itemindex)); {turn spell checking of because it takes a long time if enabled and slows down winword}
wordapplication.options.checkspellingasyoutype := false;
wordapplication.options.checkgrammarasyoutype := false;
end; 让word替换标记字符串要使用worddocument.range.find.execute,这里用delphi替换了<#name>:
var
findtext, matchcase, matchwholeword, matchwildcards, matchsoundslike,
matchallwordforms, forward, wrap, format, replacewith, replace: olevariant;
begin
findtext := '<#name>';
matchcase := false;
matchwholeword := true;
matchwildcards := false;
matchsoundslike := false;
matchallwordforms := false;
forward := true;
wrap := wdfindcontinue;
format := false;
replacewith := 'delphi';
replace := true; worddocument.range.find.execute( findtext, matchcase, matchwholeword,
matchwildcards, matchsoundslike, matchallwordforms, forward,
wrap, format, replacewith, replace ); end; 上面这4段代码完成了公文管理的基本功能,再把它和数据库结合起来,就可以开发一个与lotus notes类似的产品了。
来自:yzhshi, 时间:2002-2-2 14:24:00, ID:902680
前面我就Delphi中调用Word写了一些,比较注重于具体实现,对于研究的方法则说的比较片面。
今天晚上,我静下心来,总结了一下怎样在Delphi中生成操作Word的代码。如果说前面我写的
是金子,那么下面这篇文章就是点石成金的手指(太自夸了,呵呵)。毕竟已经有半年多没有研
究这些了,只能零碎的写一些心得了。使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成,
但是我们充分的利用VBA代码就可以弥补这个功能。
Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档
的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。
下面就如何在Delphi里面利用Word的VBA代码进行一些总结。
1、 生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现
的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看
到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是
选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能,
此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择
“工具->宏->VisualBasic编辑器”,查看生成的宏代码。例如:我们要将文档中的“讨论”全部替换成“研讨”。
a. 点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公
用模板里面。
b. 点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。
c. 结束宏的录制,点击结束按钮。
d. 按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面
的模块里面的NewMacros模块。
以下是生成的宏代码:
Sub Macro1()
'
' Macro1 Macro
' 宏在 2002-2-1 由 yzhshi 录制
'
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、 精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要
做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光
标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的
VBA帮助来判断代码是否有用。如上例,精简下来,剩下以下代码。
Sub Macro1()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "讨论"
.Replacement.Text = "研讨"
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub3、 转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加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单元,那么直接使用常量wdReplaceAll就可以了;
二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值;
三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下:
Sub ShowValue()
MsgBox wdReplaceAll
End Sub最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在
?:\Program files\Microsoft Office\Office10\2052(XP)下,VBAWD10.CHM,其他版本路径基本类似。
word:variant;
begin
word:=createoleobject('word.application');
word.visible:=true;
word.documents.add();