Excel ファイルをプログラムで操作する際、ワークシートの追加、並べ替えのための移動、不要なシートの削除といった操作は基本的な処理のひとつです。データの整理やレポート生成の自動化において、これらの操作を C++ から実行できると、処理の幅が大きく広がります。本記事では、ワークシートの追加、移動、削除を C++ で行う方法を、サードパーティ製ライブラリを用いて紹介します。
前提条件
この記事の内容を試すには、以下の環境が必要です。
- Visual Studio 2017 以降(C++17 対応コンパイラ)
- 今回使用するライブラリ:Spire.XLS for C++ (NuGet または提供元の Web サイトから入手)
- ネイティブ C++ 向けの API を使用します。C++/CLI 向けではない点に注意してください。
プロジェクトにライブラリを導入する際は、インクルードディレクトリの設定と、リンクする .lib ファイルの追加を適切に行います。また、実行時には必要な DLL ファイルを実行ファイルと同じディレクトリに配置してください。
ワークシートを操作するための基本オブジェクト
ワークシートの追加・移動・削除はいずれも、Workbook オブジェクトが持つ Worksheets コレクションを通じて行います。Worksheets はワークブック内の全シートを管理するコレクションであり、インデックスによるアクセスや、追加・削除などのメソッドを提供します。
1. ワークシートを追加する
シートを末尾に追加する
新しいワークシートをワークブックの末尾に追加するには、Worksheets コレクションの Add メソッドを使用します。引数にシート名を指定します。
workbook.GetWorksheets()->Add(L"NewSheet");
シート名を指定しない場合の Add メソッドも用意されており、その場合はデフォルトの名前(Sheet1、Sheet2 など)が自動的に割り当てられます。Add メソッドの戻り値として、追加された Worksheet オブジェクトへのポインタが返されます。
Worksheet* newSheet = workbook.GetWorksheets()->Add(L"NewSheet");
シートを指定した位置に追加する
Add メソッドには、挿入位置のインデックスを指定するオーバーロードも用意されています。たとえば、先頭(インデックス 0)にシートを追加する場合は以下のように記述します。
workbook.GetWorksheets()->Add(0, L"FirstSheet");
インデックスは0から始まり、既存のシート数と同じ値を指定すると末尾に追加されます。範囲外のインデックスを指定すると予期しない動作を引き起こす可能性があるため、注意が必要です。
追加のコード例
#include "Spire.Xls.h"
using namespace Spire::Xls;
int main()
{
Workbook workbook;
workbook.LoadFromFile(L"sample.xlsx");
// 末尾にシートを追加
workbook.GetWorksheets()->Add(L"Summary");
// 先頭にシートを追加
workbook.GetWorksheets()->Add(0, L"Cover");
workbook.SaveToFile(L"output_add.xlsx", ExcelVersion::Version2016);
workbook.Dispose();
return 0;
}
2. ワークシートを移動する
ワークシートの移動は、Worksheets コレクションの MoveWorksheet メソッドを使用します。移動元のシートのインデックスと、移動先のインデックスを指定します。
workbook.GetWorksheets()->MoveWorksheet(0, 2);
上記の例では、インデックス 0 のシートをインデックス 2 の位置に移動します。移動先より後ろにあったシートは、ひとつずつ後ろにずれます。
移動のコード例
#include "Spire.Xls.h"
using namespace Spire::Xls;
int main()
{
Workbook workbook;
workbook.LoadFromFile(L"sample.xlsx");
// インデックス0のシートをインデックス2の位置に移動
workbook.GetWorksheets()->MoveWorksheet(0, 2);
workbook.SaveToFile(L"output_move.xlsx", ExcelVersion::Version2016);
workbook.Dispose();
return 0;
}
移動先のインデックスは、移動が完了したあとの位置を基準として指定します。移動元のシートが一時的にコレクションから除外された状態で計算されるため、直感的に理解しやすい動作となります。
シート名を指定して移動する方法
ライブラリにはシート名で直接移動するメソッドは用意されていませんが、シート名からインデックスを取得して MoveWorksheet を呼び出すことで実現できます。シート名をキーにインデックスを検索するには、Worksheets コレクションをループで走査します。
int GetSheetIndex(Worksheets* sheets, const wchar_t* sheetName)
{
for (int i = 0; i < sheets->GetCount(); i++)
{
if (wcscmp(sheets->Get(i)->GetName(), sheetName) == 0)
{
return i;
}
}
return -1; // 見つからない場合
}
3. ワークシートを削除する
インデックスを指定して削除する
ワークシートを削除するには、Worksheets コレクションの RemoveAt メソッドを使用し、削除したいシートのインデックスを指定します。
workbook.GetWorksheets()->RemoveAt(1);
上記の例では、インデックス1のシート(2番目のシート)が削除されます。
シート名を指定して削除する
シート名で削除する場合は、Remove メソッドにシート名を渡します。
workbook.GetWorksheets()->Remove(L"SheetName");
指定した名前のシートが存在しない場合の動作は、ライブラリのバージョンによって異なる可能性があります。事前に存在確認を行うか、例外処理を適切に実装することを推奨します。
削除のコード例
#include "Spire.Xls.h"
using namespace Spire::Xls;
int main()
{
Workbook workbook;
workbook.LoadFromFile(L"sample.xlsx");
// インデックス1のシートを削除
workbook.GetWorksheets()->RemoveAt(1);
// シート名を指定して削除
workbook.GetWorksheets()->Remove(L"UnnecessarySheet");
workbook.SaveToFile(L"output_delete.xlsx", ExcelVersion::Version2016);
workbook.Dispose();
return 0;
}
注意点
- ワークブックには少なくとも 1 つの可視シートが必要です。すべてのシートを削除しようとするとエラーが発生するため、最後の1枚の削除には注意してください。
- 非表示シートも削除の対象となります。削除前にシートの可視状態を確認するには、
WorksheetクラスのGetVisibilityメソッドを使用できます。
実践的な例:シートの整理操作
以下は、ワークシートの追加・移動・削除を組み合わせて、ワークブック内のシートを整理する例です。
#include "Spire.Xls.h"
using namespace Spire::Xls;
int main()
{
Workbook workbook;
workbook.LoadFromFile(L"report.xlsx");
// 先頭に「目次」シートを追加
workbook.GetWorksheets()->Add(0, L"目次");
// 「データ」シートを末尾に移動
int dataIndex = -1;
for (int i = 0; i < workbook.GetWorksheets()->GetCount(); i++)
{
if (wcscmp(workbook.GetWorksheets()->Get(i)->GetName(), L"データ") == 0)
{
dataIndex = i;
break;
}
}
if (dataIndex != -1)
{
int lastIndex = workbook.GetWorksheets()->GetCount() - 1;
workbook.GetWorksheets()->MoveWorksheet(dataIndex, lastIndex);
}
// 「一時作業用」シートを削除
workbook.GetWorksheets()->Remove(L"一時作業用");
workbook.SaveToFile(L"output_organized.xlsx", ExcelVersion::Version2016);
workbook.Dispose();
return 0;
}
まとめ
C++ のプログラムから Excel のワークシートを操作する際、Worksheets コレクションを通じて追加、移動、削除の各処理を実行できます。追加には Add メソッドを使用し、必要に応じて挿入位置をインデックスで指定します。移動には MoveWorksheet メソッドを使用し、移動元と移動先のインデックスを指定します。削除にはインデックスによる RemoveAt メソッドと、シート名による Remove メソッドの2種類が用意されています。これらの操作は、データ集約や帳票生成の自動化において、シート構成を動的に管理するための基礎となります。実際の開発に利用する際は、ライブラリのライセンス形態や配布条件についても事前に確認しておくことをお勧めします。