2015-08-07 2 views
2

То, что я пытаюсь достичь

В моем C# приложении Я хотел бы создать отчет (Документ Word) из данных в моем приложении, я понял, что лучший способом сделать это было бы выполнение чего-то вроде слияния с использованием источника данных из моего приложения.Как вы отправляете объединить документ слова в C#

То, что я пытался

  1. Я пытался следуя Mail Merge into word однако это использует Gembox, которые вы должны платить за
  2. Я попытался с помощью Microsoft.Office.Interop.Word однако я упал Короче, когда я не знаю, как ссылаться на сохраненный шаблон документа:

    Dictionary<string, string> MailMerge = new Dictionary<string, string>() 
        { 
         { "ID", "123" }, 
         { "Name", "Test" }, 
         { "Address1", "Test" }, 
         { "Address2", "Test" }, 
         { "Address3", "Test" }, 
         { "Address4", "Test" }, 
         { "PostCode", "Test" }, 
         { "Year End", "Test" }, 
         { "SicCode", "123" }, 
        }; 
    
        Document doc = new Document(); 
        doc.MailMerge.Execute(MailMerge); 
    

Резюме

Я ищу какое-то руководство относительно того, что следует исследовать дальше, поскольку я считаю, что должен быть «стандартный» способ сделать это.

+0

Итак, что именно вы хотите сделать? Создайте документ из своего шаблона и замените поля слияния на ваш словарь? Это правильно? –

+0

Правильно, точно так же, как слияние почты –

ответ

3

Это довольно просто, используя Microsoft.Office.Interop.Word. Here представляет собой простой шаг за шагом учебник о том, как это сделать.

Код для замены MERGEFIELD со строкой, как это:

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

первоначально размещен here и here

В случае, если вы хотите использовать словарь, чтобы заменить много полей сразу использовать код:

public static void TextToWord(string pWordDoc, Dictionary<string, string> pDictionaryMerge) 
    { 
     Object oMissing = System.Reflection.Missing.Value; 
     Object oTrue = true; 
     Object oFalse = false; 
     Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application(); 
     Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document(); 
     oWord.Visible = true; 
     Object oTemplatePath = pWordDoc; 
     oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); 

     foreach (Microsoft.Office.Interop.Word.Field myMergeField in oWordDoc.Fields) 
     { 
      Microsoft.Office.Interop.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(); 
       foreach (var item in pDictionaryMerge) 
       { 
        if (fieldName == item.Key) 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(item.Value); 
        } 
       } 
      } 
     } 
    } 
+0

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

+0

О, это выглядит легко, как пирог! [/ sarcasm] – Hill

0

Я также использую то же самое, но у меня есть сложность. Я также должен проверить условие if. В текстовом файле шаблона {ЕСЛИ «Уплата» = Ежемесячно », тогда появится таблица« «ничего не показывать»}

, когда я использую приведенный выше код, используемый в ответе. и если условие в C# Я написал

Range rngFieldCode = myMergeField.Code; 
      String fieldText = rngFieldCode.Text.Trim(); 
      if (fieldText.ToUpper().StartsWith("IF")) 
      { 
       myMergeField.UpdateSource();} 

поэтому выход как

{IF Месячный = Месячный «то таблица не появится» «ничего, чтобы показать»}

, но желаемый результат только «тогда появится таблица».

+0

Это новый вопрос, связанный с начальным вопросом? Если это так, вы должны создать новый вопрос и, возможно, ответить на вопрос, но не ставить в качестве ответа новый вопрос. –

Смежные вопросы