如何在不使用COM自动化的情况下使用Word文档?

时间:2012-10-31 13:56:02

标签: delphi automation ms-word

我已经阅读了关于这个问题的多个帖子,似乎没有一个人对我的问题得出了正确的结论。 (也许我正试图看看最近是否出现过任何问题。)

我有一个处理承诺的小型慈善机构应用程序。在这样做时,它需要使用和打印文档。

事情是,如果Word在后台打开,应用程序线程将挂起并且不会响应Word的关闭,我必须手动回滚并关闭单词。当然,一切正常,但我无法保证最终用户将关闭Word,即使我将指令放在用户手册中。

我对速度并不太感兴趣,但我想如果它可以增强,那将是一个不错的小奖励。

是否已为Delphi发布了允许我打开,编辑,打印和保存文档的库?如果没有,有没有办法以这样的方式使用Word Automation,它在打开时不会与Word的另一个打开句柄冲突?

3 个答案:

答案 0 :(得分:5)

如果您使用GetActiveOleObject,您将获得正在运行的Word实例。 通过使用CreateOleObject,您将获得一个新实例,不应该被其他正在运行的实例所困扰。

如果您使用TWordApplication包装器,则可以将ConnectKind设置为ckNewInstance来完成此操作。默认情况下,TWordApplication将尝试连接正在运行的实例。

答案 1 :(得分:1)

procedure PrintViaWord (const filename: string);
const
 wdUserTemplatesPath = 2;

var
  wrdApp, wrdDoc, wrdSel: variant;

begin
 wrdApp:= CreateOleObject ('Word.Application');   // create new instance
 sleep (5000);    // this fixes a bug in Word 2010 to do with opening templates
 wrdDoc:= wrdApp.documents.add (
          wrdApp.Options.DefaultFilePath[wdUserTemplatesPath] + '\mytemplate.dot');

 wrdDoc.Select;
 wrdSel:= wrdApp.selection;
 wrdApp.Options.CheckSpellingAsYouType:= 0;
 wrdSel.paragraphformat.alignment:= 1;
 wrdSel.typetext ('This is a program demonstrating how to open Word in the background'
                  + ' and add some text, print it, save it and exit Word');
 wrdDoc.SaveAs (filename + '.doc');
 wrdApp.ActivePrinter:= 'Konica Minolta 211';
 wrdApp.PrintOut;
 WrdDoc.SaveAs (filename + '.doc');
 wrdApp.quit;

 wrdSel:= unassigned;
 wrdDoc:= unassigned;
 wrdApp:= unassigned
end;

答案 2 :(得分:0)

如果您想打开编辑和打印Word文档,并且不介意使用RTF格式进行操作,请调查TRichView

它将生成RTF格式的丰富文档,这是MS word支持的格式之一。我不认为它直接读取.DOC文件,但您可以将.DOC和.DOCX转换为RTF,对于大多数简单文件,但转换中会丢失某些高级格式化功能。

它的优点是无需任何MS Word副本就可以在要进行文档处理的机器上安装。对于收据和其他简单文件的制作,这将是最可靠的技术;根本不要直接使用Word。