Microsoft Update导致的Office Word Interop问题

时间:2014-10-17 19:20:34

标签: .net vb.net office-interop

我在使用VB.Net编写的Windows窗体应用程序时遇到问题(我没有编写它,试图对其进行故障排除)。应用程序的一部分使用Word Interop程序集在Word文档和包含数据的文本文件之间进行邮件合并。

几天前,微软推出了Word(KB2883013)的更新,导致邮件合并停止工作。 Word文档只打印出没有数据。我很难过我能做些什么来解决这个问题。

我尝试以管理员身份运行应用程序,我尝试将Interop dll直接复制到项目文件夹,但两者都没有区别(不是我真的认为它会,但我真的不知道还有什么可以尝试) 。唯一有效的方法是实际卸载更新,但下周将进行下一轮自动更新。邮件合并的代码如下,任何建议都将非常感谢,我甚至不知道从哪里开始解决这个问题。 Word文档和数据文件都位于AppData文件夹中。

        wordApp.Documents.Open(FileName:=returnAppPath() & "mergedoc.doc")

        wordApp.ActiveDocument.MailMerge.OpenDataSource(Name:= _
            returnAppPath() & "inputdata.txt", _
            ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
            AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
            WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
            Format:=Word.WdOpenFormat.wdOpenFormatAuto, Connection:="", SQLStatement:="", SQLStatement1 _
            :="", SubType:=Word.WdMergeSubType.wdMergeSubTypeOther)

        With wordApp.ActiveDocument.MailMerge
            .Destination = Word.WdMailMergeDestination.wdSendToNewDocument
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = Word.WdMailMergeDefaultRecord.wdDefaultFirstRecord
                .LastRecord = Word.WdMailMergeDefaultRecord.wdDefaultLastRecord
            End With
            .Execute(Pause:=False)
        End With
        Dim intCopies As Integer = CInt(numudCopies.Value)

        wordApp.Application.PrintOut(FileName:="", Range:=Word.WdPrintOutRange.wdPrintAllDocument, Item:= _
            Word.WdPrintOutItem.wdPrintDocumentContent, Copies:=CObj(intCopies), Pages:="", PageType:=Word.WdPrintOutPages.wdPrintAllPages, _
            ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _
            False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
            PrintZoomPaperHeight:=0)

        wordApp.ActiveWindow.Close(False)
        wordApp.ActiveDocument.Close(SaveChanges:=Word.WdSaveOptions.wdDoNotSaveChanges)
        wordApp.Quit()
        wordApp = Nothing

1 个答案:

答案 0 :(得分:0)

在某些情况下,Interop不是一个好主意(参见Microsoft的KB 257757)。

您的方案中的一个选项是重新创建模板并使用某些OpenXML工具包以编程方式进行邮件合并。通过这种方式,您将获得以下好处:

  • 模板可以使用外接程序在Word中准备数据占位符
  • 最终文档将在docx中,自2003年起可以与所有版本的Office一起使用
  • 您可以合并文档的所有部分(包括页眉,页脚,部分)中的数据
  • 可以根据条件标准显示/省略数据。
  • 报告生成可以在服务器上集中完成,无需安装Word。

在.NET应用程序中,您必须将数据读入.NET对象(数据模型类的集合),然后将它们发送到文档生成方法,该方法准备最终文档,其中模板和数据合并在一起。我选择的工具是Docentric,自从我开始使用它以来,我没有必要为复杂的文档操作做更简单的Word邮件合并或VBA文档脚本。您可以仔细查看实际示例here