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

1

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

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

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);
                }
            }
        }
    }

Этот код изначальноВот.

Я собираюсь создать приложение Winform, как это. Спасибо за предоставленную идею.
3

Вы можете попробовать с:

_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);  
             }
Спасибо, Стив, но не могли бы вы уточнить, какие строки моего кода я заменяю вашим кодом, пожалуйста. PJW
Добавлен код и комментарии к ответу выше
@ Стив, думаю, ты можешь взвесить мою проблему вstackoverflow.com/questions/19980381/…? У меня не было никого, кто бы даже предлагал свои предложения, и ваш первый уважаемый пользователь, с которым я столкнулся в проблеме слияния, здесь.

Похожие вопросы