来自c#的mailmerge in word打开多个实例

时间:2013-10-21 17:47:11

标签: c# ms-word interop mailmerge

我正在尝试使用.net程序自动化mailmerge。 word文档中有一个单页字母,发送给一个名为“Person”的mailmerge字段的特定人员。我们的数据库有多个人,每个人的名字都要写成一封信。我们希望一页的字母一个接一个地连接起来。目前,此代码尝试使用两个人 - 名称1&名2。下面的代码为每个人名打开一个单独的单词实例。

        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字段并在另一个结尾处连接一个字母?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

上面罗南的代码为我做了诀窍。我每次都在做新的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