Domanda

...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();
    }
}
È stato utile?

Soluzione

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top