来自 C# 的 Word 中的邮件合并会打开多个实例

本文关键字:实例 Word 来自 合并 | 更新日期: 2023-09-27 18:36:28

我正在尝试使用.net程序自动进行邮件合并。word文档中有一封一页的信,写给特定的人,邮件合并字段的名字是"人"。我们的数据库有多个人,每个人的名字都必须进入信件的副本。我们希望一页字母一个接一个地连接起来。目前,此代码尝试使用两个人 - name1 和 name2。下面的代码为每个人名打开一个单独的单词实例。

        object oMissing = System.Reflection.Missing.Value;
        //CREATING OBJECTS OF WORD AND DOCUMENT
        Word.Application oWord = new Word.Application();
        Word.Document oWordDoc = new Word.Document("C:''Test''AddressTemplate.docx");

        //SETTING THE VISIBILITY TO TRUE
        oWord.Visible = true;
        //THE LOCATION OF THE TEMPLATE FILE ON THE MACHINE
        Object oTemplatePath = "C:''Test''AddressTemplate.docx";
        oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
        foreach (Microsoft.Office.Interop.Word.Field field in oWordDoc.Fields)
        {
            if (field.Code.Text.Contains("Person"))
            {
                field.Select();
                oWord.Selection.TypeText(name1);
            }
        }
        oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
        foreach (Microsoft.Office.Interop.Word.Field field in oWordDoc.Fields)
        {
            if (field.Code.Text.Contains("Person"))
            {
                field.Select();
                oWord.Selection.TypeText(name2);
            }
        }

问:如何更改代码以仅打开单词的一个实例,填写mailmerge字段并在另一个字母的末尾连接一个字母?

来自 C# 的 Word 中的邮件合并会打开多个实例

如果您调用新的 Word.Application,则您正在创建一个新实例,如果您想要创建一个新实例(如果没有),但如果已经有一个打开的实例,则重用一个实例,您可以执行以下操作:

        Application app;
        try
        {
            app = (Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
        }
        catch
        {
            app = new Application();
        }

根据您的评论,我认为您实际上只打开了 1 个单词实例,它只是在不同的窗口中打开两个文档(但一个应用程序)。Windows与应用程序不同。

如果您希望在一个窗口中完成所有内容,则可以重复使用以前的文档,或者在打开新文档之前将其关闭

Ronan上面的代码为我做了这个技巧。我每次都在做新的Application(),添加WINWORD实例(我知道,应该知道得更好)。我同时会说 C# 和 VB,但这是我在这个项目中使用的 VB 版本:

        ' Use same winword instance if there; if not, create new one
    Dim oApp As Application
    Try
        oApp = DirectCast(Runtime.InteropServices.Marshal.GetActiveObject("Word.Application"), Application)
    Catch ex As Exception
        ' Word not yet open; open new instance
        Try
            ' Ensure we have Word installed
            oApp = New Application()
        Catch eApp As Exception
            Throw New ApplicationException(String.Format("You must have Microsoft Word installed to run the Top Line report"))
        End Try
    End Try
    oApp.Visible = True