Python 0penPyXLでExcelファイルをシート毎に分割して保存する方法

Excelファイルは複数のシートで構成されていることがあり、データ分析やシステム連携の際にシートごとに分割したい場合があります。この記事では、Pythonopenpyxlライブラリを使用して、Excelファイルをシートごとに分割し、個別のファイルとして保存する方法を段階的に解説します。

前提条件

  • Python 3.x がインストールされていること
  • openpyxlライブラリがインストールされていること

手順

ステップ1: openpyxlのインストール

openpyxlが未インストールの場合は、以下でインストールします。

pip install openpyxl

pydocument.hatenablog.com

ステップ2: 基本的な分割処理の作成

まずは、Excelファイルを読み込み、各シートを個別のファイルに保存する基本的なスクリプトを作成します。

from openpyxl import load_workbook, Workbook

def split_excel_sheets(input_file_path):
    """Excelファイルを読み込み、各シートを個別のExcelファイルとして保存する(基本バージョン)。"""
    wb = load_workbook(input_file_path)

    for sheet_name in wb.sheetnames:
        new_wb = Workbook()
        new_sheet = new_wb.active
        new_sheet.title = sheet_name

        source_sheet = wb[sheet_name]
        for row in source_sheet.iter_rows():
            new_row = [cell.value for cell in row]
            new_sheet.append(new_row)

        new_wb.save(f"{sheet_name}.xlsx")

if __name__ == "__main__":
    input_file = "input.xlsx"
    split_excel_sheets(input_file)
  • load_workbook(input_file_path): 指定されたパスのExcelファイル(input_file_path)を読み込むために、openpyxlload_workbook関数を使用します。これにより、Excelファイルの内容にアクセスするためのWorkbookオブジェクトが作成されます。

  • wb.sheetnames: 読み込んだExcelファイルのすべてのシートの名前を取得するために、Workbookオブジェクトのsheetnames属性を使用しています。これにより、シート名のリストが得られ、各シートに対して処理を繰り返すことができます。

  • Workbook(): シートごとに新しいExcelファイルを作成するために、openpyxlWorkbookクラスを使用します。これにより、新しい空のワークブックが作成されます。

  • new_wb.save(f"{sheet_name}.xlsx"): シートごとに作成した新しいワークブックを、元のシート名に.xlsx拡張子を付けたファイル名で保存するために、Workbookオブジェクトのsaveメソッドを使用しています。

この段階では、エラー処理や出力ディレクトリの指定などは行っていません。input.xlsxというファイルがスクリプトと同じディレクトリに存在し、複数のシートが含まれていることを想定しています。

退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]

ステップ3: 出力ディレクトリの指定と作成機能の追加

次に、分割したExcelファイルの出力先ディレクトリを指定できるようにし、指定されたディレクトリが存在しない場合は自動的に作成する機能を追加します。

from openpyxl import load_workbook, Workbook
import os  # osモジュールをインポート

def split_excel_sheets(input_file_path, output_dir=""):
    """Excelファイルを読み込み、各シートを個別のExcelファイルとして保存する(出力ディレクトリ対応)。"""
    wb = load_workbook(input_file_path)

    if output_dir and not os.path.exists(output_dir):
        os.makedirs(output_dir)  # 出力ディレクトリ作成

    for sheet_name in wb.sheetnames:
        new_wb = Workbook()
        new_sheet = new_wb.active
        new_sheet.title = sheet_name

        source_sheet = wb[sheet_name]
        for row in source_sheet.iter_rows():
            new_row = [cell.value for cell in row]
            new_sheet.append(new_row)

        output_file_name = f"{sheet_name}.xlsx"
        if output_dir:
            output_file_path = os.path.join(output_dir, output_file_name)  # 出力パス
        else:
            output_file_path = output_file_name
        new_wb.save(output_file_path)

if __name__ == "__main__":
    input_file = "input.xlsx"
    output_directory = "output"  # 出力ディレクトリ
    split_excel_sheets(input_file, output_directory)

変更点

  • osモジュールのインポート: ファイルシステム関連の操作(ディレクトリの存在確認、作成)を行うため、import osos モジュールをインポートします。
  • 出力ディレクトリの自動作成: output_dir で指定されたディレクトリが存在しない場合、os.makedirs(output_dir) を使用してディレクトリを自動的に作成します。これにより、ユーザーは事前にディレクトリを作成する手間が省けます。
  • 出力ファイルパスの生成: output_dir が指定されている場合は、os.path.join(output_dir, output_file_name) を使用して、出力ファイルの完全なパスを生成します。これにより、指定されたディレクトリ内に分割されたファイルが保存されます。

ステップ4: [完成形] エラーハンドリングと進捗表示の追加

最後に、ファイルが存在しない場合や読み込みエラーが発生した場合の処理、そして各シートの保存状況を表示する機能を追加します。

最終的なコード

from openpyxl import load_workbook, Workbook
import os

def split_excel_sheets(input_file_path, output_dir=""):
    """
    Excelファイルを読み込み、各シートを個別のExcelファイルとして保存する(エラー処理、進捗表示付き)。
    """
    try:
        wb = load_workbook(input_file_path)
    except FileNotFoundError:
        print(f"エラー: ファイルが見つかりません: {input_file_path}")
        return  # 処理を中断
    except Exception as e:
        print(f"エラー: ファイル読み込みエラー: {e}")
        return

    if output_dir and not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for sheet_name in wb.sheetnames:
        new_wb = Workbook()
        new_sheet = new_wb.active
        new_sheet.title = sheet_name

        source_sheet = wb[sheet_name]
        for row in source_sheet.iter_rows():
            new_row = [cell.value for cell in row]
            new_sheet.append(new_row)

        output_file_name = f"{sheet_name}.xlsx"
        output_file_path = os.path.join(output_dir, output_file_name) if output_dir else output_file_name

        try:
            new_wb.save(output_file_path)
            print(f"シート '{sheet_name}' を保存: {output_file_path}")  # 進捗表示
        except Exception as e:
            print(f"エラー: シート '{sheet_name}' の保存に失敗: {e}")

    print("すべてのシートの分割が完了しました。")  # 完了メッセージ

if __name__ == "__main__":
    input_file = "input.xlsx"
    output_directory = "output"
    split_excel_sheets(input_file, output_directory)

変更点

  • ファイル読み込み時のエラーハンドリング: load_workbook()関数をtry...exceptブロックで囲み、FileNotFoundError(ファイルが存在しない場合)とその他の例外(Exception)を捕捉するようにしています。これにより、ファイルが存在しない場合や読み込み時にエラーが発生した場合に、プログラムが異常終了するのを防ぎます。

  • シート保存時のエラーハンドリング: 各シートの保存処理(new_wb.save())もtry...exceptで囲んでいます。これにより、保存中にエラーが発生した場合、エラーメッセージを表示しつつ、次のシートの処理を続行できます。

スクリプトの実行

  1. スクリプトの保存: 上記の最終的なコードを、split_excel.py などの名前のPythonファイル(.py)として保存します。
  2. 入力ファイルの準備: input.xlsx という名前のExcelファイルを作成し、複数のシートに適当なデータを入力します。このinput.xlsxファイルを、split_excel.pyと同じディレクトリに配置します。
    • 既存のファイルを処理したい場合は、input.xlsxの部分をそのファイル名に変更してください。
  3. 実行: コマンドプロンプト(Windows)またはターミナル(macOS/Linux)を開き、split_excel.pyを保存したディレクトリに移動します。そして、以下のコマンドを実行します。
python split_excel.py

実行すると、input.xlsx内の各シートが個別のExcelファイルとして、指定した出力ディレクトリ(またはスクリプトと同じディレクトリ)に保存されます。

シゴトがはかどる Python自動処理の教科書 [ クジラ飛行机 ]

まとめ

このスクリプトは、Excelファイルをシートごとに分割し、個別のExcelファイルとして保存する処理を、段階的に機能を追加しながら実装する方法を解説しました。openpyxlは、シート分割以外にも、セルの書式設定、数式の処理、グラフの作成など、Excelファイルの様々な操作が可能です。必要に応じて機能を拡張し、より高度なExcelファイル処理を行うことができます。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com