使excel在单个打印作业中打印多个工作表

时间:2012-10-11 14:42:21

标签: c++ excel com printing office-automation

我正在使用COM自动化打开xls文件并将其打印到虚拟PDF打印机。

Sheets sheets(m_Application.GetSheets());
sheets.PrintOut(CovOptional,CovOptional,CovOptional,CovOptional,COleVariant(_T("My PDF Printer")),CovOptional,CovOptional);

如果文件有多个工作表,excel会为每个工作表创建一个单独的打印作业,所以我得到几个PDF文件而不是一个。

如何强制它在一个打印作业中打印所有纸张?

1 个答案:

答案 0 :(得分:2)

我找到了一个很好的解释为什么Excel有这种行为in this article。来自文章

  

这是因为Microsoft Excel发送打印作业的方式。   Excel假定您的所有单个工作表具有不同的页面   设置,因此它将它们作为多个打印作业发送。

     

为了将所有单张纸打印在一张PDF中   文件(不是多个PDF)您需要设置相同的页面设置选项   对于所有这些(Excel中的页面设置修改了的打印大小   结果文件,例如,如果您将页面布局设置为横向   在Excel中,打印的页面将是横向的,但您的原始Excel   文件仍将保持相同的视图。)

我将an answer的代码改编为类似的问题。代码最初是在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);