难,难,难,WORD问题(200分)

  • 主题发起人 主题发起人 putianren
  • 开始时间 开始时间
P

putianren

Unregistered / Unconfirmed
GUEST, unregistred user!
try
wordapplication1.connect;//第一次出现EXCEPTION
except
try
wordapplication1.connect;//第二次才打开WORD
except
messagedlg('可能未安装WORD!', mterror, [mbok], 0);
abort;
end;
end;
上述第一次出现EXCEPTION时,为什么会把应屏蔽的错误信息‘遇到一个MICROSOFT程序安装错误’弹到界面,而且程序不再运行。
等再执行上述代码时,才把WORD打开?

另:
从DELPHI打开WORD,人工关闭WORD后,又用DELPHI打开WORD,出现‘服务器出现意外情况’,如何解决?
 
第一个问题:没有遇到。打不开就是打不开。怎么多打一次就打开了?

第二个问题:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
SaveChanges: olevariant;
begin
SaveChanges := wdDoNotSaveChanges;
try
WordApp.Quit(SaveChanges);
WordApp.Disconnect;
except
end;
end;
 

第二个问题:
人工关闭WORD,但并没有关闭DELPHI窗体,并不会执行FormClose事件呀。
 
改成这样应该没问题了

try
wordapplication1.Disconnect;
wordapplication1.connect;
wordapplication1.Visible := True;
except
messagedlg('可能未安装WORD!', mterror, [mbok], 0);
abort;
end;
 
用wordapplication1.connect时系统中一定有已经打开了的Word文档。人工关闭WORD后,又用DELPHI打开WORD,肯定会出现‘服务器出现意外情况’了。
建议用下面的代码来打开你要打开的Word文档:
var
FileName: string;
vis: olevariant;
begin
...
FileName := 'c:/wordtest.doc';
vis := True;
WordApplication1.Visible := True;
WordApplication1.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, vis);
...

 
在Dephi 5中提供了一组Servers组件,实现了与Office的无缝结合,但有关这一方面的资料却很少,最近笔者接触了一个用户案例,要求最终将数据库中的结果总结成一份Word文档,Word文档中对于标题、正文的字体、字号,文档的纸张大小都有一定的要求,而且还要求以表格的形式体现一部分数据库中的数据。
  笔者通过查找VBA的说明,再对照Dephi的VCL,终于实现了全部功能,现将有关的内容总结如下:
  1、在当前程序目录下建立以标题字段命名的Word文件
  exepath:=application.ExeName;
  for index:=1 to length(exepath) do
  if exepath[index]='/' then
  i:=index;
  exepath:=copy(exepath,1,i);
  doc_file:=exepath+mc+'.doc';
  以标题字段“mc”命名Word文件
  try
  Wordapplication1.connect;
  except
  messagedlg('没有安装Word',mterror,[mbok],0);
  abort;
  end;
  Wordapplication1.Caption := 'XX计划书';
  Wordapplication1.visible := true;
  Worddocument1.activate;
  2、设置纸张大小
  Wordapplication1.ActiveDocument.PageSetup.PageWidth:=XXX;
  Wordapplication1.ActiveDocument.PageSetup.PageHeight:=XXX;
  Wordapplication1.ActiveDocument.PageSetup.LeftMargin := XX;
  //设置左边距
  Wordapplication1.ActiveDocument.PageSetup.rightMargin := XX; 
  //设置右边距
  3、插入页码
  var fpage,pagea:olevariant;
  fpage:=true;
  pagea:=wdAlignPageNumberCenter;
  Wordapplication1.activedocument.sections.item(1).Footers.item(1).PageNumbers.Add(pagea,fpage);
  4、设置页面横向打印
  s:=Wordapplication1.selection.start;
  e:=Wordapplication1.selection.start;
  aa:=wdSectionBreakNextPage;
  Wordapplication1.ActiveDocument.Range(s,e).InsertBreak(aa);
  Wordapplication1.Selection.Start:=Wordapplication1.Selection.Start + 1;
  s:=Wordapplication1.Selection.start;
  e:=Wordapplication1.ActiveDocument.Content.End_;
  Wordapplication1.ActiveDocument.Range(S,e).PageSetup.Orientation:=wdOrientLandscape;
  5、设置字体、字号
  Wordapplication1.Selection.Font.Size:=18;
  Wordapplication1.Selection.Font.Name := '黑体';
  Wordapplication1.Selection.TypeParagraph; //换行
  Wordapplication1.Selection.ParagraphFormat.Alignment:= wdAlignParagraphCenter;
  Wordapplication1.Selection.TypeParagraph;
  Wordapplication1.Selection.TypeText(dbedit4.text);
  //标题 
  Wordapplication1.Selection.Font.Size := 14;
  Wordapplication1.Selection.Font.Name := '宋体';
  Wordapplication1.Selection.TypeParagraph;//换行
  Wordapplication1.Selection.TypeParagraph;//换行
  Wordapplication1.Selection.ParagraphFormat.Alignment := wdAlignParagraphJustify;
  Wordapplication1.Selection.TypeText(' '+trim(dbmemo1.text));
  //正文
   ... ...

  6、插入表格
var
DefaultTableBehavior,AutoFitBehavior : OleVariant;
t,doc : OleVariant;

DefaultTableBehavior := 0;
AutoFitBehavior := 0;

  Wordapplication1.Selection.Font.Size :=10;
  adoquery2.Active:=false;
  adoquery2.active:=true;
  doc:=Wordapplication1.activedocument;
  counts:=adoquery2.RecordCount;
  //记录数决定表格的行数
  t:=doc.tables.Add(Wordapplication1.selection.range,counts+1,5,
DefaultTableBehavior,AutoFitBehavior);//5列
  t.cell(1,1).range.text:= '单位';
  t.Cell(1,1).Width:=120;
  t.cell(1,1).range.Paragraphs.Alignment:= wdAlignParagraphCenter;
  t.cell(1,2).range.text:= '姓名';
   ... ...
  //依次写入其他字段的表头
  for i:=2 to counts+1 do
  begin
  t.cell(i,1).range.text:=adoquery2.field
  byname('dw').asstring;
  t.Cell(i,1).Width:=120;
  t.cell(i,1).range.Paragraphs.Alignment:=
   wdAlignParagraphCenter;
  t.cell(i,2).range.text:=adoquery2.field
  byname('xm').asstring;
  ... ...
  Adoquery2.next;
  End;


//光标移动到最后文章末尾
Wordapplication.Selection.Start := Wordapplication.Selection.StoryLength;

向word中插入图片(先把图片拷贝到剪切板,然后粘贴到word)
var
Clipboard : TClipboard;

....
Clipboard := TClipboard.Create;
Clipboard.Assign(Image.Picture);
Wordapplication.Selection.Paste;
//worddocument.Sentences.Last.Paste;也可以
Clipboard.free;

  使用Dephi将Word与数据库结合,实现了用户文档的自动生成,大大地方便了用户。
 
delphi擅长做数据库类的mis开发,但对于oa就有点力不从心了。不过随着microsoft的com技术逐渐成熟,现在普通windows应用已经可以和office 97无缝结合了,尤其是在delphi 5中提供了一组servers组件,更是简化了程序开发。

最近接触了一个用户的案例,用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,
Encoding,WVisible: 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;
Encoding := '';
WVisible := true;

wordapplication.documents.open( filename, confirmconversions,
readonly, addtorecentfiles, passworddocument, passwordtemplate,
revert, writepassworddocument, writepasswordtemplate, format,
Encoding,WVisible );

{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,
matchchashida,matchdiacritics,matchalef,matchcontrol: olevariant;
begin
findtext := '< #name> ';
matchcase := false;
matchwholeword := true;
matchwildcards := false;
matchsoundslike := false;
matchallwordforms := false;
forward := true;
wrap := wdfindcontinue;
format := false;
replacewith := 'delphi';
replace := true;
matchchashida := false;
matchdiacritics := false;
matchalef := false;
matchcontrol := false;

worddocument.range.find.execute( findtext, matchcase, matchwholeword,
matchwildcards, matchsoundslike, matchallwordforms, forward,
wrap, format, replacewith, replace,
matchchashida,matchdiacritics,matchalef, matchcontrol );

end;

上面这4段代码完成了公文管理的基本功能,再把它和数据库结合起来,就可以开发一个与lotus notes类似的产品了。
 
上面两个是我收集的word操作资料
我想应该可以解决90%的问题了吧!
 
谢谢各位厚爱,特别感谢yanyandt2提供这么详细的资料。
第一个问题解决了。
但第二个问题--‘遇到一个MICROSOFT程序安装错误’弹到界面,而且程序不再运行。’仍然无法解决。

 
to putianren
我试过没问题。
退出IDE后再执行程序就不会出现问题了,你试试。
 
在wordapplication1.Connect;
前先关闭它wordapplication1.Disconnect;
 
to linsb:
退出IDE后再执行程序才出现的问题呀!
难道跟机器的其他环境有关?
 
虽然问题没完全解决,但分还是要给的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
867
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
836
DelphiTeacher的专栏
D
D
回复
0
查看
785
DelphiTeacher的专栏
D
后退
顶部