2015-07-15 8 views
7

Ich habe DateTable. Müssen Sie es anstelle von einigen Zeichen im teplate Dokument einfügen.Wie Einfügen von Tabelle in Word-Dokument anstelle von Textmarke?

Ich kann Text-to-Text auf diese Weise (viele missingObj die Fehler zu vermeiden) ersetzen:

using Word = Microsoft.Office.Interop.Word; 

    Word._Application application; 
    Word._Document document; 
    Object missingObj = System.Reflection.Missing.Value; 
    Object trueObj = true; 
    Object falseObj = false; 

    private void create_button1_Click(object sender, EventArgs e) { 
      application = new Word.Application(); 
      Object templatePathObj; 
      templatePathObj = "template.dot"; 

      try { 
       document = application.Documents.Add(ref templatePathObj, 
        ref missingObj, ref missingObj, ref missingObj); 
      } 
      catch (Exception error) { 
       document.Close(ref falseObj, ref missingObj, ref missingObj); 
       application.Quit(ref missingObj, ref missingObj, ref missingObj); 
       document = null; 
       application = null; 
       throw error; 
      } 

      object strToFindObj = "%%mark%%"; 
      object replaceStrObj = "text to replace"; 
      Word.Range wordRange; 
      object replaceTypeObj; 
      replaceTypeObj = Word.WdReplace.wdReplaceAll; 
      for (int i = 1; i <= document.Sections.Count; i++) { 
       wordRange = document.Sections[i].Range; 
       Word.Find wordFindObj = wordRange.Find; 
       object[] wordFindParameters = new object[15] { strToFindObj, missingObj, 
        missingObj, missingObj, missingObj, missingObj, missingObj, missingObj, 
        missingObj, replaceStrObj, replaceTypeObj, missingObj, missingObj, 
        missingObj, missingObj }; 
       wordFindObj.GetType().InvokeMember("Execute", BindingFlags.InvokeMethod, 
        null, wordFindObj, wordFindParameters); 
     } 
     application.Visible = true; 
    } 

Was ich diesen Code ändern müssen, so wird DataTable statt strToFindObj nehmen?

In diesem Beispiel i Sachen in Range ersetzen, was einige Fragmen von Dokumenten einschließlich Tabellen, Format usw.

Antwort

5

vielen missingObj der Bugs

Ziel .Net 4.0 zu vermeiden oder unterstützt die benannten und optionalen Argumente mit COM-Aufrufen, sodass Sie nicht alle ref missingObj einschließen müssen. Siehe diesen MSDN-Artikel: Named and Optional Arguments - Diese Funktion erleichtert Aufrufe von COM-Schnittstellen wie den Microsoft Office-Automatisierungs-APIs erheblich.


Was muss ich ändern, so kann ich eine DataTable statt von String-Variable strToFindObj mit suchen?

Sie müßten die Tables Row durchlaufen und Cell die Datatable-Zellen in dem Word-Dokument zu ersetzen, zum Beispiel:

foreach(var dr in dt.Rows) 
{ 
    foreach (var cell in dr.ItemArray) 
    { 
    string strToFind = cell.ToString(); 
    string replaceStr = "replace old value"; 
    ReplaceTextInWord(@"C:\Temp\template.docx", strToFind, replaceStr); 
    } 
} 

Wenn Sie zu hart ein Datatable finden verwenden und eine Liste (wie ein Dictionary), die noch einfacher:

var listOfTextToReplace = new Dictionary<string,string>(); 
listOfTextToReplace.Add("%%mark%%","text to replace"); 
foreach(var item in listOfTextToReplace) 
{ 
    string strToFind = item.Key; 
    string replaceStr = item.Value; 
    ReplaceTextInWord(@"C:\Temp\template.docx", strToFind, replaceStr); 
} 

Hier ist die ReplaceTextInWord Methode:

using Word = Microsoft.Office.Interop.Word; 
Word._Application application; 
Word._Document document; 
Object missingObj = System.Reflection.Missing.Value; 
Object trueObj = true; 
Object falseObj = false; 

private void create_button1_Click(object sender, EventArgs e) { 
    //ReplaceTextInWord("template.dot", "find me", "Found"); <-- Are you sure you want to replace in a Template? 
    ReplaceTextInWord(@"C:\Temp\template.docx", "%%mark%%","text to replace"); //I think you want a .DOC or DOCX file 
} 

private void ReplaceTextInWord(string wordDocFilePath, string strToFind, string replaceStr) { 
    application = new Word.Application(); 
    try { 
     //document = application.Documents.Add(ref templatePathObj, ref missingObj, ref missingObj, ref missingObj); 
     document = application.Documents.Open(wordDocFilePath); //You need to open Word Documents, not add them, as per https://msdn.microsoft.com/en-us/library/tcyt0y1f.aspx 
    } 
    catch (Exception error) { 
     document.Close(ref falseObj, ref missingObj, ref missingObj); 
     application.Quit(ref missingObj, ref missingObj, ref missingObj); 
     document = null; 
     application = null; 
     throw error; 
    } 

    for (int i = 1; i <= document.Sections.Count; i++) { 
    Word.Range wordRange = document.Sections[i].Range; 
    Word.Find findObject = wordRange.Find; 
    findObject.ClearFormatting(); 
    findObject.Text = strToFind; 
    findObject.Replacement.ClearFormatting(); 
    findObject.Replacement.Text = replaceStr; 

    object replaceAll = Word.WdReplace.wdReplaceAll; 
    findObject.Execute(ref missing, ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref missing, ref missing, ref missing, 
     ref replaceAll, ref missing, ref missing, ref missing, ref missing); 
    } 
    application.Visible = true; 
} 

Ref MSDN: How to: Programmatically Search for and Replace Text in Documents

Verwandte Themen