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

はじめに

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

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

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

アプローチの概要

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

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

手順

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

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

コード例

import aspose.cells as ac
import os

data_dir = "data/"
workbook = ac.Workbook(data_dir + "book1.xls")

for i in range(workbook.worksheets.count):
    source_sheet = workbook.worksheets[i]
    sheet_name = source_sheet.name
    
    dest_workbook = ac.Workbook()
    dest_index = dest_workbook.worksheets.add()
    dest_sheet = dest_workbook.worksheets[dest_index]
    dest_sheet.name = sheet_name
    
    dest_sheet.copy(source_sheet)
    
    dest_file = data_dir + sheet_name + ".xls"
    dest_workbook.save(dest_file, ac.SaveFormat.EXCEL97_TO_2003)

期待される出力は、データディレクトリ内の新しいファイルのセット (ソースワークブックのワークシートごとに 1 つのファイル) です。各ファイルは対応するソースシートにちなんで名前が付けられ、そのファイルにはその単一シートのデータ (およびオプションで書式設定) が含まれます。

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

アプローチの概要

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

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

手順

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

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

コード例

import aspose.cells as ac
import os

# データディレクトリとファイルパスを定義する
dataDir = "data/"
sourcePath = os.path.join(dataDir, "book1.xls")
outputPath = os.path.join(dataDir, "outputrange.xls")

# ソースのExcelファイルを開く
sourceWorkbook = ac.Workbook(sourcePath)

# ソースワークブックから最初のワークシートを取得する
sourceWorksheet = sourceWorkbook.worksheets[0]

# ソースセル範囲 A1:C10 を定義する(0行0列から始まる10行3列)
sourceRange = sourceWorksheet.cells.create_range(0, 0, 10, 3)

# 新しい宛先ワークブックを作成する
destWorkbook = ac.Workbook()

# 宛先ワークブックの最初のワークシートにアクセスする
destWorksheet = destWorkbook.worksheets[0]

# ソース範囲と同じサイズで A1 に宛先範囲を作成する
destRange = destWorksheet.cells.create_range(0, 0, 10, 3)

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

# 宛先ワークブックを新しい .xls ファイルとして保存する
destWorkbook.save(outputPath, ac.SaveFormat.EXCEL97_TO2003)

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

関連記事