...using vs2010 and automating office 2007
The merge works fine but the saved document(pathToDestinationFile) has the original document (pathToTemplate) attached as a second page. I've verified that the pathToTemplate is only a single page document. pathToDB and pathToHdr are plain text files that serve as the data for the merge. What am I doing wrong?
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();
}
}
The solution was to not make the call to MailMerge.Execute(), as if that makes any sense.
the crucial 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;
}