Excel ファイルを複数のファイルに分割する
はじめに
開発者が単一の Excel ファイルを複数の小さなファイルに分割する必要のある現実的なシナリオは多数あります。たとえば、ワークブックには部門ごとに 1 つのワークシートが含まれており、各部門長は自分のシートのみを受け取る必要があります。その他のケースでは、ワークシートから特定のテーブルやデータブロックを抽出し、ワークブックの他の部分を公開せずに、スタンドアロンのファイルとして電子メールで送信したい場合があります。また、大規模な統合ワークブックは、扱いやすくしたり、読み込みを高速化したり、他のシステムによる後続処理のために小さなピースに分割する必要がある場合もあります。
Aspose.Cells は、このタスクに対して 2 つの柔軟なアプローチを提供します。最初のアプローチは、ソースワークブック内のすべてのワークシートを反復処理し、そのコンテンツを新しい Workbook インスタンスにコピーして、それぞれを個別のファイルとして保存します。2 番目のアプローチは、ワークシート内の特定のセル範囲に焦点を当て、その範囲のみを新しいワークブックにコピーします。どちらの場合も、一般的な流れは同じです。Workbook クラスを使用してソースワークブックを読み込み、Worksheet および Cells オブジェクトを介して関連データにアクセスし、コンテンツをコピー先の Workbook に転送してから、コピー先をディスクに保存します。
各ワークシートを新しいワークブックにコピーして Excel ファイルを分割する
アプローチの概要
このアプローチでは、ソースワークブックを 1 回開き、その Worksheets コレクション内のすべての Worksheet に対して、新しいコピー先の Workbook を作成します。次に、ソースワークシートのコンテンツをコピー先ワークブックの最初のワークシートにコピーし、コピー先ワークブックをソースワークシートの名前に基づいたファイル名で保存します。結果は、ワークシートごとに 1 つの出力ファイルとなり、各出力ファイルには単一のソースシートのデータが含まれます。
この方法は、ソースワークブック内の各ワークシートが論理的に独立した情報単位(部門、地域、月、製品ラインなど)を表しており、それぞれの単位を個別に配信または処理したい場合に適した選択肢です。
手順
次の手順は、各ワークシートを新しいワークブックにコピーして Excel ファイルを分割する方法を示しています。
Workbookオブジェクトをインスタンス化し、ファイルパスをコンストラクタに渡して、ソース Excel ファイルを開きます。forループまたはforeachループを使用してWorkbook.Worksheetsコレクションを反復処理し、ソースファイル内のすべてのWorksheetが処理されるようにします。- ループ内で、現在のワークシート用に新しいコピー先の
Workbookインスタンス(空のワークブック)を作成します。 - コピー先ワークブックに新しい
Worksheetを追加し(またはデフォルトの最初のワークシートを使用し)、意味のある名前を割り当てます。理想的には、ソースワークシートのNameプロパティと同じ名前にします。 - ソースワークシートのコンテンツをコピー先ワークシートにコピーします。これは、ソースワークシートの
Cellsコレクションのセルを反復処理し、その値をコピー先ワークシートの対応するセルに書き込むことによって行うことも、Cells.Copyメソッドを使用して範囲全体を一度に転送することもできます。 - ソースワークシートの名前を組み込んだ出力ファイルパス(たとえば、
dataDir + worksheet.Name + ".xls")を構築し、生成された各ファイルが一意の名前を持つようにします。 - コピー先の
Workbook.Saveメソッドを呼び出して、ファイルをディスクに書き込みます。 - すべてのワークシートが処理されるまで、次のワークシートについて手順 3 から 7 を繰り返します。
コード例
using System;
using System.IO;
using Aspose.Cells;
string dataDir = "data/";
Workbook workbook = new Workbook(dataDir + "book1.xls");
for (int i = 0; i < workbook.Worksheets.Count; i++)
{
Worksheet sourceSheet = workbook.Worksheets[i];
string sheetName = sourceSheet.Name;
Workbook destWorkbook = new Workbook();
int destIndex = destWorkbook.Worksheets.Add();
Worksheet destSheet = destWorkbook.Worksheets[destIndex];
destSheet.Name = sheetName;
destSheet.Copy(sourceSheet);
string destFile = dataDir + sheetName + ".xls";
destWorkbook.Save(destFile, SaveFormat.Excel97To2003);
}
予想される出力は、データディレクトリ内の新しいファイルのセットであり、ソースワークブックからのワークシートごとに 1 つのファイルがあります。各ファイルは対応するソースシートにちなんで名前が付けられ、そのファイルにはその単一シートのデータ(およびオプションで書式設定)が含まれています。
範囲を新しいワークブックにコピーして Excel ファイルを分割する
アプローチの概要
時には、分割する必要のあるデータはあるワークシートの全体ではなく、A1:D10 のような特定の矩形領域や、特定のテーブルを表す名前付き範囲に対応しています。これらの場合、ワークシート全体をコピーするのは無駄であり、より正確なアプローチが必要です。ソース範囲を特定し、その範囲のみを新しいワークブックにコピーして、新しいファイルを保存します。
このアプローチは、より大きなワークシートから単一のテーブル、レポートブロック、またはデータ領域を抽出し、関連しないすべてのコンテンツを破棄したい場合に理想的です。また、シートのユーザーが選択した領域をスタンドアロンのファイルとしてエクスポートする場合にも役立ちます。
手順
次の手順は、特定の範囲を新しいワークブックにコピーして Excel ファイルを分割する方法を示しています。
- ファイルパスを使用して
Workbookオブジェクトをインスタンス化し、ソース Excel ファイルを開きます。 - コピーしたい範囲を含む対象の
Worksheetを、インデックス(たとえば、最初のシート)またはWorksheetsコレクションからの名前によって取得します。 - コピーする範囲を特定します。これは、
A1:C10のようなハードコードされたセル範囲、Worksheet.Cellsコレクションを介して取得された名前付き範囲、またはWorksheet.Cells.CreateRangeを介して作成された範囲にすることができます。 - 新しいコピー先の
Workbookインスタンスを作成します。 - コピー先ワークブックの最初の
Worksheet(デフォルトのシート)にアクセスします。 - ソース範囲を、通常はセル
A1から開始して、コピー先ワークシートにコピーします。コピー先CellsコレクションのCells.Copyメソッドを使用して範囲全体をコピーすることも、ソース範囲のセルを反復処理し、その値をPutValueでコピー先セルに書き込むこともできます。オプションのCopyOptionsを指定して、転送される内容を制御できます(値のみ、値とスタイル、数式など)。 Workbook.Saveメソッドを使用して、コピー先ワークブックをディスク上の新しいファイルパスに保存します。
コード例
using System;
using System.IO;
using Aspose.Cells;
// データディレクトリとファイルパスを定義する
string dataDir = "data/";
string sourcePath = dataDir + "book1.xls";
string outputPath = dataDir + "outputrange.xls";
// ソースExcelファイルを開く
Workbook sourceWorkbook = new Workbook(sourcePath);
// ソースワークブックから最初のワークシートを取得する
Worksheet sourceWorksheet = sourceWorkbook.Worksheets[0];
// ソースセル範囲 A1:C10 を定義する(行0、列0から始まる10行3列)
var sourceRange = sourceWorksheet.Cells.CreateRange(0, 0, 10, 3);
// 新しい宛先ワークブックを作成する
Workbook destWorkbook = new Workbook();
// 宛先ワークブックの最初のワークシートにアクセスする
Worksheet destWorksheet = destWorkbook.Worksheets[0];
// ソース範囲と同じ寸法で A1 に宛先範囲を作成する
var destRange = destWorksheet.Cells.CreateRange(0, 0, 10, 3);
// ソース範囲を宛先範囲にコピーする
destRange.Copy(sourceRange);
// 宛先ワークブックを新しい .xls ファイルとして保存する
destWorkbook.Save(outputPath, SaveFormat.Excel97To2003);
予想される出力は、データディレクトリ内の単一の新しいファイルであり、ソースワークブックから抽出された指定された範囲の値(およびオプションで書式設定)のみが含まれています。コピー先ファイルはソースファイル内の他のデータとは関係がなく、最初のワークシートのセル A1 から始まる抽出された範囲のみを含んでいます。