Excel ファイルを複数のファイルに分割する

はじめに

開発者が単一の Excel ファイルを複数の小さなファイルに分割する必要のある実世界のシナリオは数多くあります。たとえば、ワークブックには部門ごとに 1 つのワークシートが含まれており、各部門長は自分のシートのみを受け取る必要がある場合があります。その他のケースでは、ワークシートから特定のテーブルやデータブロックを抽出し、ワークブックの残りの部分を公開せずに、スタンドアロンファイルとして電子メールで送信したい場合があります。また、大規模な統合ワークブックは、取り扱いを容易にし、読み込みを高速化し、他のシステムによる後続処理のために、より小さなピースに分割する必要がある場合もあります。

Aspose.Cells はこのタスクに対して 2 つの柔軟なアプローチを提供します。最初のアプローチは、ソースワークブック内のすべてのワークシートを反復処理し、その内容を真新しい Workbook インスタンスにコピーして、それぞれを個別のファイルとして保存します。2 番目のアプローチは、ワークシート内の特定のセル範囲に焦点を当て、その範囲のみを新しいワークブックにコピーします。どちらの場合も、一般的な流れは同じです。Workbook クラスを使用してソースワークブックを読み込み、Worksheet オブジェクトと Cells オブジェクトを介して関連データにアクセスし、内容を宛先の Workbook に転送してから、宛先をディスクに保存します。

各ワークシートを新しいワークブックにコピーして Excel ファイルを分割する

アプローチの概要

このアプローチでは、ソースワークブックを 1 回開き、その Worksheets コレクション内のすべての Worksheet に対して、新しい宛先 Workbook を作成します。次に、ソースワークシートの内容を宛先ワークブックの最初のワークシートにコピーし、ソースワークシートの名前に基づいたファイル名で宛先ワークブックを保存します。結果は、ワークシートごとに 1 つの出力ファイルとなり、各出力ファイルには単一のソースシートのデータが含まれます。

この方法は、ソースワークブック内の各ワークシートが論理的に独立した情報の単位(部門、領域、月、製品ラインなど)を表しており、各単位を個別に配信または処理したい場合に適切な選択肢です。

手順

次の手順は、各ワークシートを新しいワークブックにコピーして Excel ファイルを分割する方法を説明しています。

  1. Workbook オブジェクトをインスタンス化し、ファイルパスをコンストラクタに渡すことで、ソース Excel ファイルを開きます。
  2. for ループまたは foreach ループを使用して Workbook.Worksheets コレクションを反復処理し、ソースファイル内のすべての Worksheet が処理されるようにします。
  3. ループ内で、現在のワークシート用の新しい宛先 Workbook インスタンス(空のワークブック)を作成します。
  4. 宛先ワークブックに新しい Worksheet を追加し(またはデフォルトの最初のワークシートを使用し)、理想的にはソースワークシートの Name プロパティと同じ意味のある名前を割り当てます。
  5. ソースワークシートの内容を宛先ワークシートにコピーします。これは、ソースワークシートの Cells コレクションのセルを反復処理し、それらの値を宛先ワークシートの対応するセルに書き込むことによって行うか、Cells.copy メソッドを使用して範囲全体を一度に転送することによって行うことができます。
  6. ソースワークシートの名前を組み込んだ出力ファイルパス(たとえば、dataDir + worksheet.getName() + ".xls")を構築し、生成される各ファイルに一意の名前を付けます。
  7. 宛先の Workbook.save メソッドを呼び出して、ファイルをディスクに書き込みます。
  8. すべてのワークシートが処理されるまで、手順 3 〜 7 を次のワークシートに対して繰り返します。

コード例

const AsposeCells = require("aspose.cells");
const path = require("path");

const dataDir = "data/";
const workbook = new AsposeCells.Workbook(dataDir + "book1.xls");

for (let i = 0; i < workbook.getWorksheets().getCount(); i++) {
    const sourceSheet = workbook.getWorksheets().get(i);
    const sheetName = sourceSheet.getName();
    
    const destWorkbook = new AsposeCells.Workbook();
    const destIndex = destWorkbook.getWorksheets().add();
    const destSheet = destWorkbook.getWorksheets().get(destIndex);
    destSheet.setName(sheetName);
    
    destSheet.copy(sourceSheet);
    
    const destFile = dataDir + sheetName + ".xls";
    destWorkbook.save(destFile, AsposeCells.SaveFormat.Excel97To2003);
}

期待される出力は、データディレクトリ内の一連の新しいファイルであり、ソースワークブックのワークシートごとに 1 つのファイルです。各ファイルは対応するソースシートにちなんで命名されており、そのファイルにはその単一シートのデータ(および必要に応じて書式設定)が含まれています。

範囲を新しいワークブックにコピーして Excel ファイルを分割する

アプローチの概要

時には、分割する必要のあるデータがワークシート全体ではなく、ワークシートの特定の矩形領域(A1:D10 や特定のテーブルを表す名前付き範囲など)に対応することがあります。これらのケースでは、ワークシート全体をコピーするのは無駄であり、より正確なアプローチが必要です。ソース範囲を特定し、その範囲のみを新しいワークブックにコピーして、新しいファイルを保存します。

このアプローチは、関連のないすべてのコンテンツを破棄しながら、より大きなワークシートから単一のテーブル、レポートブロック、またはデータ領域を抽出する場合に理想的です。また、シートのユーザーが選択した領域をスタンドアロンファイルとしてエクスポートする場合にも役立ちます。

手順

次の手順は、特定の範囲を新しいワークブックにコピーして Excel ファイルを分割する方法を説明しています。

  1. ファイルパスで Workbook オブジェクトをインスタンス化することで、ソース Excel ファイルを開きます。
  2. コピーしたい範囲を含むターゲットの Worksheet を、インデックス(たとえば最初のシート)または Worksheets コレクションから名前で取得します。
  3. コピーする範囲を特定します。これは、A1:C10 のようなハードコードされたセル範囲、Worksheet.Cells コレクションを通じて取得された名前付き範囲、または Worksheet.Cells.createRange によって作成された範囲になります。
  4. 新しい宛先 Workbook インスタンスを作成します。
  5. 宛先ワークブックの最初の Worksheet(デフォルトシート)にアクセスします。
  6. ソース範囲を宛先ワークシートにコピーします。通常はセル A1 から開始します。宛先の Cells コレクションの Cells.copy メソッドを使用して範囲全体をコピーするか、ソース範囲のセルを反復処理し、それらの値を putValue で宛先セルに書き込むことができます。オプションの CopyOptions を指定して、転送されるもの(値のみ、値とスタイル、数式など)を制御できます。
  7. Workbook.save メソッドを使用して、宛先ワークブックをディスク上の新しいファイルパスに保存します。

コード例

let sourceWorkbook = new AsposeCells.Workbook(sourcePath);

// ソースワークブックから最初のワークシートを取得する
let sourceWorksheet = sourceWorkbook.getWorksheets().get(0);

// ソースセル範囲 A1:C10 を定義する (行 0、列 0 から始まる 10 行、3 列)
let sourceRange = sourceWorksheet.getCells().createRange(0, 0, 10, 3);

// 新しい宛先ワークブックを作成する
let destWorkbook = new AsposeCells.Workbook();

// 宛先ワークブックの最初のワークシートにアクセスする
let destWorksheet = destWorkbook.getWorksheets().get(0);

// ソース範囲と同じ寸法で A1 に宛先範囲を作成する
let destRange = destWorksheet.getCells().createRange(0, 0, 10, 3);

// ソース範囲を宛先範囲にコピーする
destRange.copy(sourceRange);

// 宛先ワークブックを新しい .xls ファイルに保存する
destWorkbook.save(outputPath, AsposeCells.SaveFormat.Excel97To2003);

期待される出力は、ソースワークブックから抽出された指定された範囲の値(および必要に応じて書式設定)のみを含む、データディレクトリ内の単一の新しいファイルです。宛先ファイルはソースファイル内の他のデータとは関係がありません。最初のワークシートのセル A1 から始まる、抽出された範囲のみが含まれています。