word.interop распечатать основной документ из почтового слияния

Я создал письмо слияния с Interop.Word из файла.doc.

Он работает нормально, загружает данные из указанного источника данных, и я могу просмотреть заполненные данные с помощью метода wDoc.MailMerge.EditMainDocument();

Но я не хочу открывать его, а хочу распечатать MainDocument, что означает, что я хочу напечатать 15 страниц, если в моем mailmerge-datasource 15 записей.

Когда я выполняю wDoc.PrintOut, мой basic-Doc-файл распечатывается без заполненных данных!

Возможно ли это и как?

Вот мой код до сих пор:

Application wApp = new Application();
Document wDoc = wApp.Documents.Open(ref oFile, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
wDoc.Activate();
wApp.ActivePrinter = "TestPrinter";

wDoc.MailMerge.OpenDataSource(wDoc.MailMerge.DataSource.Name, ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
wDoc.MailMerge.Execute(ref missing);

wDoc.MailMerge.EditMainDocument();
wDoc.MailMerge.Execute(ref missing);

wDoc.PrintOut(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
wDoc.Close(ref saveOptionsObject, ref missing, ref missing);
wApp.Quit(ref saveOptionsObject, ref missing, ref missing);

1 ответ

Решение

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

//before you run .Execute method try to set the followings:
wDoc.MailMerge.Destination = wdSendToPrinter; // vba constant
wDoc.MailMerge.SuppressBlankLines = True; 
wDoc.MailMerge.DataSource.FirstRecord = wdDefaultFirstRecord; //vba constant
wDoc.MailMerge.DataSource.LastRecord = wdDefaultLastRecord; //vba constant
//and now you need to .Execute mailmerge
wDoc.MailMerge.Execute(ref missing); //or try with False parameter inside ()

РЕДАКТИРОВАТЬ (проверено на C#, спасибо Карлу):

// ...OpenDataSource
wDoc.MailMerge.Destination = Microsoft.Office.Interop.Word.WdMailMergeDestination.wdSendToPrinter;
wDoc.MailMerge.SuppressBlankLines = true;
wDoc.MailMerge.DataSource.FirstRecord = (int)Microsoft.Office.Interop.Word.WdMailMergeDefaultRecord.wdDefaultFirstRecord;
wDoc.MailMerge.DataSource.LastRecord = (int)Microsoft.Office.Interop.Word.WdMailMergeDefaultRecord.wdDefaultLastRecord;
wDoc.MailMerge.Execute(ref missing);
// wDoc.Close...
Другие вопросы по тегам