Отправка текста в поля слияния в Microsoft Word 2010

Я использую следующий код для отправки текста в простой шаблон слова, который я настроил только с одним 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!");

Но ничего не происходит. Когда я шагаю по коду, он доходит до app.Documents.Open, а затем, кажется, зависает. Я считаю, что это потому, что приложение не может найти мой документ Word. Правильно ли я отправляю полный путь к файлу для параметра имени файла? Если нет, то как еще приложение найдет мой шаблон Word?

2 ответа

Решение

Последний код, который я использовал и который работает для меня, выглядит следующим образом:

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);  
             }
Другие вопросы по тегам