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.Name + ".xls")を構築し、生成された各ファイルが固有の名前を持つようにします。
  7. 宛先の Workbook.save メソッドを呼び出して、ファイルをディスクに書き込みます。
  8. すべてのワークシートが処理されるまで、次のワークシートについて手順 3 ~ 7 を繰り返します。

コード例

import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat

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

for i in range(workbook.getWorksheets().getCount()):
    sourceSheet = workbook.getWorksheets().get(i)
    sheetName = sourceSheet.getName()
    
    destWorkbook = Workbook()
    destIndex = destWorkbook.getWorksheets().add()
    destSheet = destWorkbook.getWorksheets().get(destIndex)
    destSheet.setName(sheetName)
    
    destSheet.copy(sourceSheet)
    
    destFile = dataDir + sheetName + ".xls"
    destWorkbook.save(destFile, SaveFormat.Excel97To2003)

jpype.shutdownJVM()

期待される出力は、データディレクトリ内の新しいファイルのセットであり、ソースワークブックからワークシートごとに 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 メソッドを使用して、宛先ワークブックをディスク上の新しいファイルパスに保存します。

コード例

import jpype
import asposecells
jpype.startJVM()
from asposecells.api import Workbook
from asposecells.api import Workbook, Worksheet, Cells, Range, SaveFormat

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

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

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

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

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

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

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

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

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

jpype.shutdownJVM()

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