【问题标题】:How do I work with Word Documents without using COM Automation?如何在不使用 COM 自动化的情况下处理 Word 文档?
【发布时间】:2012-10-31 13:56:01
【问题描述】:

我已阅读有关该问题的多篇文章,但似乎没有一篇文章对我的问题得出一个不错的结论。 (也许我想看看最近有没有什么东西弹出来。)

我有一个处理认捐的小型慈善应用程序。为此,它需要处理和打印文档。

问题是,如果 Word 在后台打开,应用线程会挂起,不会响应 Word 的关闭,我必须手动回滚并关闭 Word。当然,一切正常,但我不能保证最终用户会关闭 Word,即使我将说明放在用户手册中。

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

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

【问题讨论】:

  • 您可以在 .net 上试用 Aspose。没有什么比德尔福全面。也许最好的选择是使用 Word 文档以外的其他内容。基于文本文件的东西。
  • 我并不是非常热衷于编写包装器和东西,如果 Aspose 甚至可以的话。反正我还没有真正看过它,仅仅是因为它是.Net。老实说,Word 为我提供了最大的文档灵活性,尤其是对于最终用户而言。因此,不使用 Word 并不是一个真正的选择。不过谢谢。 :)
  • 应用线程会挂起,具体调用哪个?
  • 在打开 Word 本身的实例时。在我开始之前。
  • 如果您只需要打印一些东西,那么您是否考虑过致电ShellExecute(0, 'print', 'foo.doc', ...)

标签: delphi automation ms-word


【解决方案1】:

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

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

【讨论】:

  • 有没有办法在不使用 TWordApplication 的情况下设置 ConnectKind(或类似的东西)?如果您知道我的意思,我倾向于使用原始 Ole 函数。我确实使用 CreateOleObject。
  • 为什么更喜欢后期绑定COM?当然,早绑定更好。
  • 我可以,这不是一个糟糕的主意,但这是我可以改变 ConnectKind 的唯一方法吗?我确信早期绑定还有其他一些好处,但我不确定我是否需要它们。
  • 不,我认为 ConnectKind 只会在尝试 GetActiveOleObject 或始终使用 CreateOleObject 之间切换,前提是您已经使用了不应产生影响的 CreateOleObject。
  • @DavidHeffernan 早期绑定和后期绑定的区别,是使用接口还是变体,对吧?如果您使用 CreateOleObject,您仍然可以使用这些接口。 TWordApplication 只是一个 Delphi 组件包装器。
【解决方案2】:

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

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

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

【讨论】:

  • 据我所知,RTF 文件格式的问题是不支持页眉和页脚。限制客户的能力是不明智的。出于同样的原因,我不会为此目的完全迁移到 OpenOffice(虽然它受支持)。
【解决方案3】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多