将文本发送到 Word 2010 Microsoft中的邮件合并域

本文关键字:合并 Microsoft 2010 文本 Word | 更新日期: 2023-09-27 18:35:16

我使用以下代码将文本发送到我目前仅使用单个 MergeField 设置的简单单词模板以测试我可以让它工作。
我使用的代码如下:

public static void ReplaceMailMergeField(string pWordDoc, string pMergeField, string pValue)
{
    object docName = pWordDoc;
    object missing = Missing.Value;
    Word.MailMerge mailMerge;
    Word._Document doc;
    Word.Application app = new Word.Application();
    app.Visible = false;
    doc = app.Documents.Open(ref docName, ref missing, ref missing, ref missing, ref missing,
                                          ref missing, ref missing, ref missing, ref missing,
                                          ref missing, ref missing, ref missing, ref missing,
                                          ref missing, ref missing, ref missing);
    mailMerge = doc.MailMerge;
    foreach (Word.MailMergeField f in mailMerge.Fields)
    {
        if (f.Code.Text.IndexOf("MERGEFIELD  '"" + pMergeField + "'"") > -1)
        {
            f.Select();
            app.Selection.TypeText(pValue);
        }
    }
    object saveChanges = Word.WdSaveOptions.wdSaveChanges;
    doc.Close(ref saveChanges, ref missing, ref missing);
    app.Quit(ref missing, ref missing, ref missing);
}

我从我的应用程序中调用以下内容:

string pWordDoc = @"C:'Users'Pete-Laptop'Documents'CMS Document Mangement'Word Template.dotx";
cDocument.ReplaceMailMergeField(pWordDoc, "fieldAddress1", "Put address here!");

但什么也没发生。当我逐步完成代码时,它会到达应用程序。文档打开,然后似乎冻结。 我相信这是因为应用程序找不到我的Word文档。 我将完整的文件路径发送到文件名参数是否正确? 如果没有,应用程序还将如何找到我的 Word 模板?

将文本发送到 Word 2010 Microsoft中的邮件合并域

我使用的最终代码对我有用,如下所示:

public static void TextToWord(string pWordDoc, string pMergeField, string pValue)
    {
        Object oMissing = System.Reflection.Missing.Value;
        Object oTrue = true;
        Object oFalse = false;
        Word.Application oWord = new Word.Application();
        Word.Document oWordDoc = new Word.Document();
        oWord.Visible = true;
        Object oTemplatePath = pWordDoc;
        oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
        foreach (Word.Field myMergeField in oWordDoc.Fields)
        {
            Word.Range rngFieldCode = myMergeField.Code;
            String fieldText = rngFieldCode.Text;
            if (fieldText.StartsWith(" MERGEFIELD"))
            {
                Int32 endMerge = fieldText.IndexOf("''");
                Int32 fieldNameLength = fieldText.Length - endMerge;
                String fieldName = fieldText.Substring(11, endMerge - 11);
                fieldName = fieldName.Trim();
                if (fieldName == pMergeField)
                {
                    myMergeField.Select();
                    oWord.Selection.TypeText(pValue);
                }
            }
        }
    }

这段代码最初就是从这里开始的。

你可以尝试:

_doc = _app.Documents.Add(ref _docName , ref _missing , ref _missing , ref _missing );

而不是

_doc = _app.Documents.Open(.......);

然后检查此行是否正确:

if (f.Code.Text.IndexOf("MERGEFIELD  '"" + pMergeField + "'"") > -1) 

我有一个以这种方式工作的功能代码

        mailMerge = doc.MailMerge;         
        foreach (Word.MailMergeField f in mailMerge.Fields)         
        {    
             // Extract the name of the MergeField starting from the 11 character
             // and looking for the first space after the name 
             // (this means that you avoid MergeFields names with embedded spaces)
             string fieldName = f.Code.Text.Substring(11).Trim();
             int  pos = fieldName.IndexOf(' ');
             if (pos >= 0) fieldName = fieldName.Substring(0, pos).Trim();
             if (fieldName == pMergeField) 
             {
                   f.Select();                  
                   app.Selection.TypeText(pValue);  
             }