2012-05-24 1 views
1

Я использую следующий код для отправки текста в простой шаблон слова, который я установил только с одним MergeField в настоящее время, чтобы проверить, я могу заставить это работать.
код, я использую это следующим образом:Отправка текста в поля слияния почты в Microsoft Word 2010

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!"); 

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

ответ

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

Этот код orignally от here.

+1

Я собираюсь создать приложение 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); 
      } 
+0

Спасибо Стив, но не могли бы вы уточнить, какие строки моего кода я заменяю вашим кодом, пожалуйста. – PJW

+0

Добавил код и комментарии к вышеуказанному ответу – Steve

+0

@Steve, думаю, что вы можете взвесить мою проблему по адресу http://stackoverflow.com/questions/19980381/perform-microsoft-word-interop-mail-merge-in- с? У меня не было никого, кто мог бы предложить предложения, и ваш первый уважаемый пользователь, которого я встретил в проблеме слияния почты здесь. –