如何通过OleAutomation删除或更改附加的模板

时间:2014-09-09 13:20:48

标签: delphi ms-word ole-automation

我的公司有大量模板,用于生成客户通信。我需要修改现有的流程,以便保存生成的文件(模板+数据)的副本以供以后编辑。

我的问题是,当我打开其中一个已保存的MSWord文档,编辑然后关闭时,MSWord坚持要求对模板(在生成过程中选择的模板)进行更改。

我不确定为什么会发生这种情况,但可能是生成的文档包含对其所基于的模板的引用,但由于模板位于远程位置,MSWord正在尝试生成新的本地文件。

如果诊断正确,那么我需要一种方法从文档中删除模板引用。

如果诊断不正确,可能的解释/解决方案是什么?


我发现BOTH结果文件包含对模板的引用。

注意:Word中的手动编辑没有问题。如果我让这封信生成并从Winword保存到磁盘,我可以打开它并非常愉快地操作它。在自动化步骤的某个地方,正在创建问题。


有趣的是 - 我已将保存格式更改为'.rtf',问题仍然存在。

此外 - 如果我说“是”'那也没关系。要保存对模板的更改,每次打开和关闭文档时都会提示我(无论是否编辑)


我发现通过将文档保存为wdFormatXML,我可以看到对字母模板的引用并进行编辑。如果我这样做,问题就会消失。

我现在试图通过自动化获得相同的结果,但没有成功;

  WordApp.ActiveDocument.Set_AttachedTemplate(tmplt);

不适用于tmplt' Normal.dot',varNull,' c:\ progra~1 \ etc \ Simple.dotx'等等。函数调用告诉我它找不到前两个值的模板,或者只是挂起。

我回到原来的问题 - 如何清除附加的模板?

1 个答案:

答案 0 :(得分:0)

我最终想通了。我的问题是以某种方式延迟绑定。我发现以下代码有效

var
  docpath : OleVariant;
  fmt     : OleVariant;
  tmplt   : OleVariant;
  WordApp : WordApplication;
  WordDoc : WordDocument;
begin
  docpath := SaveLoggedDocToDisk(GetCurrentFileName());

  WordApp := CoWordApplication.Create;
  try
    fmt     := EDITABLE_FORMAT;
    tmplt   := '';

    WordDoc := WordApp.Documents.Open(docpath, EmptyParam, EmptyParam,  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, fmt, EmptyParam, EmptyParam );
    WordDoc.Set_AttachedTemplate(tmplt);

我在此代码的早期版本中遇到的问题是

WordApp.ActiveDocument.SetAttachedTemplate(tmplt);

虽然看起来相当,但表现不佳。通过创建WordDocument类型的变量,这个例程就会栩栩如生。