1

COMオートメーションを使用してxlsファイルを開き、仮想PDFプリンターに印刷しています。

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

ただし、ファイルに複数のワークシートがある場合、Excel はシートごとに個別の印刷ジョブを作成するため、1 つではなく複数の PDF ファイルを取得します。

1 回の印刷ジョブですべてのシートを強制的に印刷するにはどうすればよいですか?

4

1 に答える 1

2

Excel がこのような動作をする理由について、この記事で非常に適切な説明を見つけました。記事より

これは、Microsoft Excel が印刷ジョブを送信する方法が原因で発生します。Excel は、すべての個々のシートのページ設定が異なると想定しているため、それらを複数の印刷ジョブとして送信します。

すべての個々のシートを 1 つの 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);
于 2012-10-12T13:52:24.203 に答える