0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C++ で Excel ファイルを PDF に変換する方法

0
Posted at

Excel ファイルをPDF形式に変換することは、文書の配布や印刷、長期保存の際に広く行われている作業です。PDF 形式には、レイアウトの固定、編集の制限、プラットフォーム非依存などの特性があるため、ビジネスシーンにおいて Excel データを共有する手段として一般的に採用されています。

本記事では、C++ を用いて Excel ファイルを PDF に変換する方法を紹介します。具体的には、以下の操作を実装します:

  • ワークブック全体を PDF に変換
  • 特定のワークシートを PDF に変換
  • ワークシート内の一部セル範囲を PDF に変換

環境準備

ライブラリの導入

本記事で使用するライブラリは、Excel 文書の読み書きおよび変換機能を提供する C++ 向けの製品です。プロジェクトへの組み込み方法は以下の通りです。

Visual Studio を使用する場合

プロジェクトを開き、「ソリューションエクスプローラー」 > 「参照」を右クリック > 「NuGet パッケージの管理」を選択します。「Browse」タブで該当パッケージを検索し、インストールします。

手動で導入する場合

  1. 製品パッケージをダウンロードし、解凍します
  2. 解凍したフォルダ内の「include」と「lib」をプロジェクトディレクトリにコピーします
  3. プロジェクトのプロパティで、追加のインクルードディレクトリとライブラリディレクトリを設定します
  4. ソースコードに以下のインクルード文を追加します:
#include "Spire.Xls.o.h"

変換パターン別実装例

1. ワークブック全体をPDFに変換

Excel ファイル全体を一つの PDF ドキュメントとして出力する基本的な方法です。

#include "Spire.Xls.o.h"

using namespace Spire::Xls;

int main()
{
    // Workbook インスタンスを作成
    intrusive_ptr<Workbook> workbook = new Workbook();
    
    // Excel ファイルを読み込み
    workbook->LoadFromFile(L"販売データ.xlsx");
    
    // ワークブック全体を PDF として保存
    workbook->SaveToFile(L"販売データ_全体.pdf", FileFormat::PDF);
    
    workbook->Dispose();
    
    return 0;
}

このコードでは、Excel ファイルに含まれる全てのワークシートが PDF に変換され、シートの順序は元のファイルと同一になります。

2. 特定のワークシートのみ PDF に変換

複数のワークシートを含むファイルから、必要なシートだけを選択して変換する方法です。

#include "Spire.Xls.o.h"

using namespace Spire::Xls;

int main()
{
    // Workbook インスタンスを作成
    intrusive_ptr<Workbook> workbook = new Workbook();
    workbook->LoadFromFile(L"年間レポート.xlsx");
    
    // 変換対象のワークシートを指定(例:2 番目のシート)
    intrusive_ptr<Worksheet> targetSheet = workbook->GetWorksheets()->Get(1);
    
    // 新しい Workbook オブジェクトを作成し、対象シートをコピー
    intrusive_ptr<Workbook> newWorkbook = new Workbook();
    newWorkbook->GetWorksheets()->AddCopy(targetSheet);
    
    // コピーしたワークブックをPDFとして保存
    newWorkbook->SaveToFile(L"対象シート.pdf", FileFormat::PDF);
    
    workbook->Dispose();
    newWorkbook->Dispose();
    
    return 0;
}

一部のライブラリではワークシート単体での保存APIが提供されていない場合があるため、ここでは対象シートを新しいワークブックにコピーしてから変換する手法を用いています。

3. 特定のセル範囲を PDF に変換

ワークシート全体ではなく、特定のセル範囲のみを PDF として出力する方法です。

#include "Spire.Xls.o.h"

using namespace Spire::Xls;

int main()
{
    // Workbook インスタンスを作成
    intrusive_ptr<Workbook> workbook = new Workbook();
    workbook->LoadFromFile(L"予算実績表.xlsx");
    
    // 最初のワークシートを取得
    intrusive_ptr<Worksheet> sheet = workbook->GetWorksheets()->Get(0);
    
    // 印刷範囲を設定(例:A1 から F20 まで)
    sheet->GetPageSetup()->SetPrintArea(L"A1:F20");
    
    // 印刷範囲を PDF として保存
    workbook->SaveToFile(L"予算実績_範囲指定.pdf", FileFormat::PDF);
    
    workbook->Dispose();
    
    return 0;
}

SetPrintArea() メソッドを使用して印刷範囲を指定することで、その範囲のみが PDF 出力の対象となります。

4. 複数ワークシートを個別の PDF として出力

ファイル内の複数シートを、それぞれ別の PDF ファイルとして出力する方法です。

#include "Spire.Xls.o.h"

using namespace Spire::Xls;

int main()
{
    // Workbook インスタンスを作成
    intrusive_ptr<Workbook> workbook = new Workbook();
    workbook->LoadFromFile(L"四半期レポート.xlsx");
    
    // 全シート数を取得
    int sheetCount = workbook->GetWorksheets()->GetCount();
    
    // 各シートを個別の PDF として出力
    for (int i = 0; i < sheetCount; i++)
    {
        intrusive_ptr<Worksheet> sheet = workbook->GetWorksheets()->Get(i);
        
        // シート名をファイル名に使用
        std::wstring sheetName = sheet->GetName();
        std::wstring fileName = sheetName + L".pdf";
        
        // 新しいワークブックを作成してシートをコピー
        intrusive_ptr<Workbook> tempWorkbook = new Workbook();
        tempWorkbook->GetWorksheets()->AddCopy(sheet);
        
        // PDF として保存
        tempWorkbook->SaveToFile(fileName.c_str(), FileFormat::PDF);
        
        tempWorkbook->Dispose();
    }
    
    workbook->Dispose();
    
    return 0;
}

PDF 出力の詳細設定

実際の業務では、PDF のページレイアウトや用紙設定を細かく調整する必要が生じることがあります。以下に代表的な設定例を示します。

用紙サイズと向きの設定

// 用紙サイズを A4 に設定
sheet->GetPageSetup()->SetPaperSize(PaperSizeType::PaperA4);

// 横向きに設定
sheet->GetPageSetup()->SetOrientation(PageOrientationType::Landscape);

// 余白の設定(単位:インチ)
sheet->GetPageSetup()->SetTopMargin(0.7);
sheet->GetPageSetup()->SetBottomMargin(0.7);
sheet->GetPageSetup()->SetLeftMargin(0.7);
sheet->GetPageSetup()->SetRightMargin(0.7);

ヘッダーとフッターの追加

// 中央ヘッダーを設定(&B は太字を意味する制御コード)
sheet->GetPageSetup()->SetHeaderText(1, L"&B社内資料&B");

// フッター右側にページ番号を設定
sheet->GetPageSetup()->SetFooterText(2, L"Page &P of &N");

印刷品質とスケーリング

// 印刷解像度の設定(DPI)
sheet->GetPageSetup()->SetPrintDpi(300);

// 用紙の幅に合わせて縮小して印刷
sheet->GetPageSetup()->SetFitToPagesWide(1);
sheet->GetPageSetup()->SetFitToPagesTall(0); // 高さは自動調整

変換時の留意点

Excel から PDF への変換処理では、以下の点に注意が必要です。

フォントの取り扱い:システムにインストールされていないフォントが Excel 内で使用されている場合、PDF 変換時に代替フォントで表示される可能性があります。変換環境と閲覧環境でフォントの差異が生じうる点をあらかじめ考慮しておくことが望ましいです。

グラフと図形:ほとんどのグラフや図形は変換時に保持されますが、一部の高度な描画オブジェクトではレイアウトがずれることがあります。重要な文書では変換前にプレビューで確認することを推奨します。

大量データの処理:非常に多くの行や列を含むワークシートを PDF に変換する場合、メモリ使用量が増加します。必要に応じてシートを分割してから変換する方法も検討できます。

まとめ

本記事では、C++ 向けの Excel 処理ライブラリを利用して、Excel ファイルを PDF 形式に変換する方法を解説しました。ワークブック全体の変換、特定ワークシートの変換、セル範囲の指定変換など、用途に応じた複数の変換パターンを示しました。また、用紙サイズ、向き、余白、ヘッダー・フッターといった PDF 出力の詳細設定についても紹介しました。Excel から PDF への変換は文書共有やアーカイブの場面で頻繁に必要となる処理であり、プログラムによる自動化によって作業効率を向上させることができます。実際の実装にあたっては、変換対象のデータ量やフォント環境、出力レイアウトの要件を事前に確認し、適切な設定を選択することが重要です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?