2012-03-29 4 views
0

... VS2010 mit und MSWord Automatisierung fusionieren druckt Vorlagendokument zu

Die Zusammenführung funktioniert office 2007

Automatisierung aber das gespeicherte Dokument (pathToDestinationFile) hat das Originaldokument (pathToTemplate) als zweite Seite angebracht. Ich habe überprüft, dass das PfadToTemplate nur ein einzelnes Dokument ist. pathToDB und pathToHdr sind reine Textdateien, die als Daten für die Zusammenführung dienen. Was mache ich falsch?

public void MergeWordTemplate(bool displayApp, string pathToTemplate, string pathToDB, string pathToHdr, string pathToDestinationFile) 
{ 
    Word._Application wrdApp = null;; 
    Word._Document mrgDoc = null, newDoc = null; 

    try 
    { 
     wrdApp = new Word.Application(); 
     wrdApp.Visible = displayApp; 

     //open the template 
     mrgDoc = wrdApp.Documents.Add(pathToTemplate, ref oMissing, ref oMissing, ref oMissing); 

     if (mrgDoc.MailMerge.Fields != null && mrgDoc.MailMerge.Fields.Count == 0) 
      throw new Exception(string.Format("Template \"{0}\" does not contain any merge fields.", System.IO.Path.GetFileName(pathToTemplate))); 

     //open the data file 
     mrgDoc.MailMerge.OpenDataSource(pathToDB); 
     mrgDoc.MailMerge.OpenHeaderSource(pathToHdr); 

     mrgDoc.MailMerge.Destination = Word.WdMailMergeDestination.wdSendToNewDocument; 

     //merge 
     mrgDoc.MailMerge.Execute(ref oFalse); 
     newDoc = wrdApp.ActiveDocument; 

     try 
     {      
      if (!string.IsNullOrWhiteSpace(pathToDestinationFile) && Directory.Exists(Path.GetDirectoryName(pathToDestinationFile))) 
       newDoc.SaveAs(pathToDestinationFile); 
     } 
     catch 
     { 
      wrdApp.Visible = true; 
     } 

     //get out 
     mrgDoc.Saved = true; 
     mrgDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges); 
     KillCOM(mrgDoc); 
     newDoc.Saved = true; 
     newDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges); 
     KillCOM(newDoc); 

     wrdApp.Quit(ref oFalse, ref oMissing, ref oMissing); 
     KillCOM(wrdApp); 

     mrgDoc = null; 
     newDoc = null; 
     wrdApp = null; 
    } 
    catch (Exception e) 
    { 
     KillCOM(mrgDoc); 
     KillCOM(newDoc); 
     KillCOM(wrdApp); 
     mrgDoc = null; 
     newDoc = null; 
     wrdApp = null; 

     //todo: log exceptions here 
     string err = e.ToString(); 
    } 
} 

Antwort

0

Die Lösung wurde auf nicht den Anruf zu MailMerge.Execute() machen, als ob das Sinn macht.

die entscheidenden Bits ....

//open the data file 
mrgDoc.MailMerge.OpenHeaderSource(pathToHdr); 
mrgDoc.MailMerge.OpenDataSource(pathToDB); 
mrgDoc.MailMerge.SuppressBlankLines = true; 
mrgDoc.MailMerge.ViewMailMergeFieldCodes = 0; 

mrgDoc.Application.ActiveDocument.Range(0, 0).Select();     
try 
{ 
    if (!string.IsNullOrWhiteSpace(pathToDestinationFile) && Directory.Exists(Path.GetDirectoryName(pathToDestinationFile))) 
    mrgDoc.SaveAs(pathToDestinationFile); 
} 
catch 
{ 
    wrdApp.Visible = true; 
}