Я использую автоматизацию COM, чтобы открыть файл xls и распечатать его на виртуальном принтере PDF.
Sheets sheets(m_Application.GetSheets());
sheets.PrintOut(CovOptional,CovOptional,CovOptional,CovOptional,COleVariant(_T("My PDF Printer")),CovOptional,CovOptional);
Однако, если файл имеет несколько рабочих листов, Excel создает отдельное задание на печать для каждого листа, поэтому я получаю несколько файлов PDF вместо одного.
Как я могу заставить его печатать все листы за одно задание?
Я нашел очень хорошее объяснение того, почему в Excel такое поведение в этой статье. Из статьи
Это происходит из-за способа, которым Microsoft Excel отправляет задание на печать.
Excel предполагает, что все ваши отдельные листы имеют разные страницы
настройки, поэтому он отправляет их как несколько заданий на печать.Для того, чтобы все отдельные листы были напечатаны в одном PDF
файл (не несколько PDF-файлов), вам нужно установить одинаковые параметры страницы
для всех из них (настройка страницы в Excel изменяет размер печати
результирующий файл, например, если вы установите макет страницы в альбомную
в Excel напечатанная страница будет в альбомной ориентации, но ваш оригинальный Excel
файл будет по-прежнему поддерживать тот же вид).
Я адаптировал код из ответ на похожий вопрос. Код изначально был на C #, но я адаптировал его для C ++.
Sheets sheets(m_Application.GetSheets());
for (int ii = 1; ii <= sheets.GetCount(); ii++)
{
_Worksheet sheet(sheets.GetItem(COleVariant((long) ii)));
PageSetup pagesetup(sheet.GetPageSetup());
pagesetup.SetOrientation(2); // landscape
pagesetup.SetOrder(1); // xlDownThenOver
pagesetup.SetFitToPagesWide(COleVariant((long) 1));
pagesetup.SetFitToPagesTall(COleVariant((long) 50));
VARIANT variant;
variant.vt = VT_BOOL;
variant.boolVal = VARIANT_FALSE;
pagesetup.SetZoom(variant);
}
sheets.PrintOut(CovOptional, CovOptional, CovOptional, CovOptional, COleVariant(_T(MyAppPrinterName)), CovOptional, CovOptional);
Других решений пока нет …