XPS(XML Paper Specification)は、Microsoft が開発したページ記述言語に基づく固定レイアウトのドキュメント形式です。PDF と同様に、表示環境に依存しない文書の配布や長期保存を目的としており、Windows OS に標準で対応していることが特徴です。
Excel ファイルを XPS 形式に変換することで、元のレイアウトや書式を維持したまま、編集を制限した形式で配布することが可能になります。本記事では、C++ を用いて Excel ファイルを XPS に変換する方法を紹介します。
環境準備
ライブラリの導入
本記事で使用するライブラリは、Excel 文書の読み書きおよび各種形式への変換機能を提供する C++ 向けの製品です。プロジェクトへの組み込み方法は以下の通りです。
Visual Studio を使用する場合
プロジェクトを開き、「ソリューションエクスプローラー」 > 「参照」を右クリック > 「NuGet パッケージの管理」を選択します。「Browse」タブで該当パッケージを検索し、インストールします。
手動で導入する場合
- 製品パッケージをダウンロードし、解凍します
- 解凍したフォルダ内の「include」と「lib」をプロジェクトディレクトリにコピーします
- プロジェクトのプロパティで、追加のインクルードディレクトリとライブラリディレクトリを設定します
- ソースコードに以下のインクルード文を追加します:
#include "Spire.Xls.o.h"
XPS 形式について
XPS は PDF と類似した固定レイアウト形式ですが、以下のような特徴があります:
- Windows OS に標準で対応(XPS ビューアーがプリインストール)
- ZIP 圧縮ベースの XML 形式で構成される
- デバイス非依存の印刷レイアウトを実現
- デジタル署名や DRM (デジタル著作権管理)に対応
変換先として XPS を選択する場合は、対象となる環境で XPS ファイルを開くことができるかを事前に確認することを推奨します。
Excel から XPS への変換実装
基本的な変換方法
Excel ファイルを XPS 形式に変換する基本的なコードは以下の通りです。
#include "Spire.Xls.o.h"
using namespace Spire::Xls;
int main()
{
// Workbook インスタンスを作成
intrusive_ptr<Workbook> workbook = new Workbook();
// Excel ファイルを読み込み
workbook->LoadFromFile(L"サンプル.xlsx");
// XPS として保存
workbook->SaveToFile(L"出力.xps", FileFormat::XPS);
workbook->Dispose();
return 0;
}
このコードでは、Excel ファイル全体が XPS 形式で保存されます。デフォルトでは全てのワークシートが連続したページとして出力されます。
特定のワークシートを XPS に変換
複数のワークシートを含む Excel ファイルから、特定のシートだけを XPS に変換する方法です。
#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);
// XPS として保存
newWorkbook->SaveToFile(L"特定シート.xps", FileFormat::XPS);
workbook->Dispose();
newWorkbook->Dispose();
return 0;
}
全ワークシートを個別の XPS ファイルとして出力
各ワークシートをそれぞれ別の XPS ファイルとして出力する方法です。
#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();
// 各シートを個別の XPS として出力
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".xps";
// 新しいワークブックを作成してシートをコピー
intrusive_ptr<Workbook> tempWorkbook = new Workbook();
tempWorkbook->GetWorksheets()->AddCopy(sheet);
// XPS として保存
tempWorkbook->SaveToFile(fileName.c_str(), FileFormat::XPS);
tempWorkbook->Dispose();
}
workbook->Dispose();
return 0;
}
ページ設定と出力オプション
XPS 変換時には、出力されるページのレイアウトを制御することができます。
ページレイアウトの設定
#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);
// ページ設定を構成
intrusive_ptr<PageSetup> pageSetup = sheet->GetPageSetup();
// 用紙サイズを A4 に設定
pageSetup->SetPaperSize(PaperSizeType::PaperA4);
// 横向きに設定
pageSetup->SetOrientation(PageOrientationType::Landscape);
// 余白の設定(単位:インチ)
pageSetup->SetTopMargin(0.5);
pageSetup->SetBottomMargin(0.5);
pageSetup->SetLeftMargin(0.5);
pageSetup->SetRightMargin(0.5);
// ページ全体を1ページの幅に合わせる
pageSetup->SetFitToPagesWide(1);
pageSetup->SetFitToPagesTall(0);
// XPS として保存
workbook->SaveToFile(L"ページ設定済み.xps", FileFormat::XPS);
workbook->Dispose();
return 0;
}
印刷範囲の指定
ワークシートの一部のみを XPS 出力したい場合は、印刷範囲を設定します。
#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");
// XPS として保存(印刷範囲のみ出力)
workbook->SaveToFile(L"範囲指定.xps", FileFormat::XPS);
workbook->Dispose();
return 0;
}
ヘッダーとフッターの追加
XPS 出力時にヘッダーやフッターを追加することも可能です。
#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);
// ヘッダーを設定(中央)
sheet->GetPageSetup()->SetHeaderText(1, L"&B社内資料&B");
// フッターを設定(右側にページ番号)
sheet->GetPageSetup()->SetFooterText(2, L"Page &P");
// XPS として保存
workbook->SaveToFile(L"ヘッダー付き.xps", FileFormat::XPS);
workbook->Dispose();
return 0;
}
ヘッダー/フッターで使用できる制御コードは以下の通りです:
| 制御コード | 意味 |
|---|---|
| &P | ページ番号 |
| &N | 総ページ数 |
| &D | 現在の日付 |
| &T | 現在の時刻 |
| &B | 太字(オン/オフ) |
| &I | 斜体(オン/オフ) |
| &U | 下線(オン/オフ) |
変換時の留意点
Excel から XPS への変換処理では、以下の点に注意が必要です。
フォントの取り扱い:XPS はドキュメント内にフォントを埋め込むことができます。ただし、ライセンス制限のあるフォントでは埋め込みが許可されていない場合があります。変換前に、使用するフォントの埋め込み可否を確認することを推奨します。
グラフと図形:ほとんどのグラフや図形は XPS 変換時にベクター形式で保持されます。これは PDF 変換と同様に、拡大時の品質劣化が少ないという特性があります。
ページ分割:ワークシートが広範囲にわたる場合、XPS 変換時に自動的にページ分割が行われます。SetFitToPagesWide() や SetFitToPagesTall() を使用することで、ページ分割の挙動を制御できます。
出力環境の確認:XPS ファイルは Windows 環境では標準で表示できますが、macOS や Linux 環境では別途ビューアーが必要となる場合があります。配布先の環境を考慮して形式を選択することを推奨します。
PDF との比較
XPS と PDF は類似した固定レイアウト形式ですが、以下のような違いがあります:
| 特徴 | XPS | |
|---|---|---|
| 標準サポート | Windows 標準 | クロスプラットフォーム |
| 基盤技術 | XML + ZIP | PostScript 派生 |
| 編集ツールの普及度 | 限定的 | 広範 |
| ブラウザ表示 | Microsoft Edge など一部対応 | ほぼ全てのブラウザで対応 |
変換先を選択する際は、文書の配布先や用途に応じて適切な形式を選ぶことが重要です。
まとめ
本記事では、C++ 向けの Excel 処理ライブラリを利用して、Excel ファイルを XPS 形式に変換する方法を解説しました。ワークブック全体の変換、特定ワークシートの変換、全シートを個別に出力する方法など、用途に応じた複数の変換パターンを示しました。また、用紙サイズ、向き、余白、印刷範囲、ヘッダー・フッターといったページ設定についても紹介しました。Excel から XPS への変換は、Windows 環境における文書配布やアーカイブの場面での選択肢の一つです。プログラムによる自動化によって、定期的なレポート出力や大量の Excel ファイルの一括変換などの処理を効率化できます。実際の実装にあたっては、変換対象のデータ量や出力レイアウト、配布先の環境を事前に確認し、必要に応じてページ設定を調整することが重要です。