1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでExcelを自動化するためのopenpyxl代替ライブラリ5選

1
Posted at

PythonでExcelを自動化するためのopenpyxl代替ライブラリ5選

openpyxlは、最新のExcelファイル(.xlsx)の読み取り、作成、編集に広く使われている、信頼性の高いPythonライブラリです。ただし、データ分析、書式付きレポートの生成、デスクトップ版Excelの自動操作、ブックの形式変換といった用途では、別のツールのほうが適している場合があります。

たとえば、openpyxl自体は数式を計算しません。また、openpyxlが対応していないブック内オブジェクトが含まれている場合、ファイルを開いて保存する過程で一部の情報が失われる可能性があります。

この記事では、openpyxlの代替として検討できる、実用的な5つのライブラリを比較します。

  • XlsxWriter
  • pandas
  • xlwings
  • Free Spire.XLS for Python
  • pyexcel

これらは順位付けしていません。各ライブラリに得意な処理があり、適したワークフローが異なるためです。

Python向けExcelライブラリ5製品の比較

ライブラリ 特に適した用途 既存ファイルの読み取り Microsoft Excelのインストール 主な注意点
XlsxWriter 新規で見栄えのよいレポートを作成する いいえ 不要 既存ブックは編集できない
pandas 表形式データの整形・集計・出力 はい 不要 ブック単位の高度な機能制御には不向き
xlwings 実際のExcelアプリケーションを自動操作する はい デスクトップ自動化では通常必要 Linuxサーバーやコンテナ用途には向きにくい
Free Spire.XLS for Python ブック処理とファイル形式の変換 はい 不要 独自APIであり、無料版は.xlsファイルに制限がある
pyexcel 複数形式に対応したシンプルなデータ入出力 プラグイン経由ではい 不要 書式やブックの再現性を重視したライブラリではない

1. XlsxWriter:新しいExcelレポートの作成に最適

既存のブックを編集するのではなく、新しい.xlsxファイルを一から作成したい場合、XlsxWriterは有力な選択肢です。

XlsxWriterは、セル書式、数式、グラフ、条件付き書式、データの入力規則、セル結合、画像、コメント、リッチ文字列、メモリ使用量を抑えた書き込みなどに対応しています。また、pandasやPolarsとの連携にも向いています。

インストール

PyPIからXlsxWriterをインストールします。

pip install XlsxWriter

以下は、書式付きの簡単な売上レポートを作成する例です。

import xlsxwriter

# 新しいブックを作成し、ワークシートを追加します。
workbook = xlsxwriter.Workbook("sales_report.xlsx")
worksheet = workbook.add_worksheet("Summary")

# 見出し用と通貨表示用の書式を定義します。
header_format = workbook.add_format({
    "bold": True,
    "bg_color": "#D9EAF7",
    "border": 1,
})

currency_format = workbook.add_format({
    "num_format": "$#,##0.00",
})

# 表の見出しを書き込みます。
worksheet.write_row(
    "A1",
    ["Product", "Units", "Revenue"],
    header_format,
)

# ワークシートに書き込むデータを用意します。
rows = [
    ["Keyboard", 25, 1249.75],
    ["Monitor", 10, 2899.90],
    ["Mouse", 40, 799.60],
]

# 各行を書き込み、Revenue列に通貨書式を適用します。
for row_index, row in enumerate(rows, start=1):
    worksheet.write(row_index, 0, row[0])
    worksheet.write_number(row_index, 1, row[1])
    worksheet.write_number(
        row_index,
        2,
        row[2],
        currency_format,
    )

# 読みやすいように列幅を調整します。
worksheet.set_column("A:A", 18)
worksheet.set_column("B:C", 12)

# ブックを閉じて書き込みを完了します。
workbook.close()

XlsxWriterのAPIは処理内容が明示的で、ブックの見た目を細かく整えたい場合に便利です。書式設定のコードを対象セルの近くに記述でき、生成にはMicrosoft Excelを必要としません。

XlsxWriterが適しているケース

次のような用途に向いています。

  • 財務レポートや業務レポートの作成
  • ダッシュボード形式のブック生成
  • メモリ使用量を抑えながら行う大規模データ出力
  • グラフ、条件付き書式、入力規則リストを含むファイルの作成
  • pandasで出力したデータに高度な見た目を加える処理

XlsxWriterが適していないケース

XlsxWriterは書き込み専用です。既存ブックを開き、一部のセルだけを更新しながら、それ以外の内容を維持することはできません。

テンプレートを利用する処理では、openpyxl、xlwings、またはFree Spire.XLSのほうが適していることがあります。

2. pandas:データ中心のExcel処理に最適

pandasは、Excelの完全なオブジェクトモデルを操作するためのライブラリではありません。Excelファイルを主に表形式データの入力元・出力先として扱います。

この違いは重要です。実際の作業が、行の絞り込み、データセットの結合、集計、欠損値処理、表の再構成である場合、Excelの個々のセルを直接操作する必要はありません。

インストール

pandasと、Excelの読み書きに利用するライブラリをまとめてインストールします。

pip install pandas python-calamine XlsxWriter

この構成では、各ライブラリが次の役割を担います。

  • pandas:データ変換
  • python-calamine:Excelファイルの読み取り
  • XlsxWriter:出力ブックの作成
import pandas as pd

# Calamineエンジンを使って元のブックを読み込みます。
orders = pd.read_excel(
    "orders.xlsx",
    engine="calamine",
)

# 不完全な行を除外し、地域ごとにグループ化して、
# 売上合計と注文数を計算します。
summary = (
    orders
    .dropna(subset=["Region", "Revenue"])
    .groupby("Region", as_index=False)
    .agg(
        Total_Revenue=("Revenue", "sum"),
        Order_Count=("Order_ID", "count"),
    )
    .sort_values("Total_Revenue", ascending=False)
)

# 処理後のデータを新しいExcelブックに書き込みます。
with pd.ExcelWriter(
    "regional_summary.xlsx",
    engine="xlsxwriter",
) as writer:
    summary.to_excel(
        writer,
        sheet_name="Regional Summary",
        index=False,
    )

    # 内部で使用されているXlsxWriterのワークシートを取得し、
    # 表示を調整します。
    worksheet = writer.sheets["Regional Summary"]
    worksheet.set_column("A:A", 20)
    worksheet.set_column("B:C", 16)

pandasは、ExcelWriterを介してDataFrameを1つまたは複数のワークシートに書き込めます。.xlsx出力では、内部エンジンとしてopenpyxlやXlsxWriterを利用できます。

つまり、pandasはExcelライブラリを完全に置き換えるというより、他のExcelライブラリと組み合わせて使われることが多いツールです。

pandasが適しているケース

次のような用途に向いています。

  • データ処理パイプラインの入力または出力形式としてExcelを使う
  • フィルタリング、グループ化、結合、集計が主な処理である
  • ブックの見た目よりデータの正確性を重視する
  • 元データがCSV、SQL、JSON、APIなど複数の形式から取得される

pandasが適していないケース

pandasは、既存のExcelファイルを読み込んで再保存したときに、すべてのブック機能を維持することを目的としていません。

また、グラフ、図形、名前付き範囲、印刷設定、複雑なスタイルを細かく制御する処理には向きません。

見栄えのよい出力が必要な場合は、pandasでデータを処理したあと、XlsxWriterやopenpyxlで表示部分を整える方法が一般的です。

3. xlwings:実際のExcelアプリケーションを自動化する場合に最適

Excelのワークフローによっては、Excel本体の機能が必要になることがあります。

ブックに再計算が必要な数式、外部リンク、VBAマクロ、Power Query接続、あるいはファイル単位のライブラリでは正確に再現しにくい機能が含まれている場合、ブックファイルを直接操作するより、インストール済みのExcelアプリケーションを自動操作するほうが安全なことがあります。

オープンソースのxlwingsパッケージは、WindowsおよびmacOS上のデスクトップ版ExcelとPythonを連携させます。ブックを開く、セル範囲を更新する、マクロを呼び出す、再計算を実行する、Excelのオブジェクトモデルを操作するといった処理が可能です。

インストール

pipでxlwingsをインストールします。

pip install xlwings

デスクトップ自動化にxlwingsを使用する場合、通常はMicrosoft Excelのインストールが必要です。

import xlwings as xw

# 空のブックを作成せず、Excelをバックグラウンドで起動します。
app = xw.App(
    visible=False,
    add_book=False,
)

workbook = None

try:
    # 既存のExcelモデルを開きます。
    workbook = app.books.open("forecast_model.xlsx")

    # 入力値を更新します。
    inputs = workbook.sheets["Inputs"]
    inputs["B2"].value = 0.08
    inputs["B3"].value = 125000

    # Excelにブック内の数式を再計算させます。
    app.calculate()

    # 別のワークシートから計算結果を取得します。
    result = workbook.sheets["Summary"]["D10"].value
    print(f"Calculated forecast: {result}")

    # 更新したブックを別名で保存します。
    workbook.save("forecast_model_updated.xlsx")
finally:
    # エラーが発生した場合でも、ブックとExcelを終了します。
    if workbook is not None:
        workbook.close()

    app.quit()

数式計算をExcel本体が実行するため、数式、リンク、マクロ、またはデスクトップ版Excelと同じ動作が必要な処理に適しています。

xlwingsが適しているケース

次のような用途に向いています。

  • VBA自動化の置き換えまたは拡張
  • 複雑な財務モデルの更新
  • 計算結果を読み取る前にExcelで再計算を実行する
  • Excel固有の動作に依存するブックの自動化
  • Pythonを利用したマクロやアドインの構築

xlwingsが適していないケース

デスクトップ版xlwingsは、Dockerコンテナ、Linuxサーバー、高い同時実行数が求められるWebサービスでは、通常は第一候補になりません。

Excelプロセスの起動と制御には、.xlsxファイルを直接読み書きする方法よりも運用上の負担がかかります。

無人のサーバー環境でファイルを生成する場合は、XlsxWriter、openpyxl、pandas、または単体で動作するドキュメントライブラリのほうが導入しやすいことが多いです。

4. Free Spire.XLS for Python:幅広い形式対応と変換処理に最適

Free Spire.XLS for Pythonは、スプレッドシートを「データ」だけでなく「文書」として扱うタイプのライブラリです。

Microsoft Officeをインストールせずに、Excelブックの作成、読み取り、編集、変換を行えます。従来形式の.xlsに加え、.xlsx.xlsm.xlsb.odsなどにも対応しています。

APIは、数式、グラフ、ピボットテーブル、条件付き書式、データの入力規則、ワークシート保護、文書変換などもカバーしています。

インストール

PyPIから無料版をインストールします。

pip install Spire.Xls.Free

既存ブックの内容を更新する基本例は次のとおりです。

from spire.xls import Workbook, FileFormat

# Workbookオブジェクトを作成します。
workbook = Workbook()

try:
    # 既存ブックを読み込みます。
    workbook.LoadFromFile("monthly_report.xlsx")

    # 先頭のワークシートを取得します。
    worksheet = workbook.Worksheets[0]

    # ワークシート内の2つのセルを更新します。
    worksheet.Range["A1"].Value = "Updated Monthly Report"
    worksheet.Range["B2"].Value = "Reviewed"

    # 更新したブックをXLSX形式で保存します。
    workbook.SaveToFile(
        "monthly_report_updated.xlsx",
        FileFormat.Version2016,
    )
finally:
    # ブックが使用したリソースを解放します。
    workbook.Dispose()

同じAPIを使って、ExcelブックをPDFに変換することもできます。

from spire.xls import Workbook, FileFormat

# Workbookオブジェクトを作成し、元のブックを読み込みます。
workbook = Workbook()

try:
    workbook.LoadFromFile("monthly_report.xlsx")

    # ブックを直接PDFに変換します。
    workbook.SaveToFile(
        "monthly_report.pdf",
        FileFormat.PDF,
    )
finally:
    # 変換後にリソースを解放します。
    workbook.Dispose()

ExcelからPDF、画像、HTMLへの変換、従来形式の.xlsへの対応などは、多くのオープンソースPythonスプレッドシートライブラリでは標準的に提供されていない機能です。

Free Spire.XLSが適しているケース

次のような用途に向いています。

  • 従来形式と最新形式の両方を扱う必要がある
  • 実行環境にMicrosoft Officeをインストールできない
  • ExcelファイルをPDF、画像、HTML、CSVなどへ変換する
  • DataFrame形式の処理より、ブック単位の機能を重視する
  • デスクトップ版Excelの自動操作ではなく、単体で動作するAPIを利用したい

注意点

製品ページによると、無料版では.xlsファイルに対して、1ブックあたり最大5ワークシート、1ワークシートあたり最大200行という制限があります。これらの制限は.xlsxファイルには適用されません。

より大きな.xlsファイルを処理する場合や、大規模なブックを他形式に変換する場合は、製品版へのアップグレードが必要です。

5. pyexcel:複数形式をシンプルなAPIで扱う場合に最適

pyexcelは、ブックの見た目よりもデータの可搬性を重視しています。

配列、辞書、レコードといった形式でスプレッドシートデータを読み書きするための共通APIを提供します。.xls.xlsx.ods、CSVなどの形式は、各プラグインを通じてサポートされます。

インストール

コアパッケージと、必要な形式に対応するプラグインをインストールします。

pip install pyexcel pyexcel-xlsx pyexcel-xls pyexcel-ods3

すべてのプラグインをインストールする必要はありません。たとえば、.xlsxファイルだけを扱うアプリケーションでは、次の構成で十分です。

pip install pyexcel pyexcel-xlsx

以下は、データをフィルタリングして別形式に変換する例です。

import pyexcel

# スプレッドシートを辞書形式のレコード一覧として読み込みます。
# 先頭行の値が辞書のキーとして使用されます。
records = pyexcel.get_records(
    file_name="employees.xls"
)

# StatusがActiveの従業員だけを残します。
active_employees = [
    record
    for record in records
    if record.get("Status") == "Active"
]

# 絞り込んだデータをODS形式で保存します。
pyexcel.save_as(
    records=active_employees,
    dest_file_name="active_employees.ods",
)

pyexcelが適しているケース

次のような用途に向いています。

  • 社内業務アプリケーションのインポート・エクスポート機能
  • ユーザーがアップロードしたスプレッドシートデータの正規化
  • シンプルな表データを複数のスプレッドシート形式間で変換する
  • 見た目よりデータ内容を重視するワークフロー
  • 複数のファイル形式に対して同じAPIを利用したいアプリケーション

pyexcelが適していないケース

pyexcelは、フォント、色、グラフ、高度なブック表示の制御を主な目的としていません。

また、pyexcelは主に抽象化レイヤーである点も理解しておく必要があります。形式ごとのプラグインは、内部で別のスプレッドシートライブラリに依存している場合があります。

たとえば、.xlsx用プラグインの内部エンジンとしてopenpyxlが使われることがあります。そのため、pyexcelは別のプログラミングインターフェイスを提供しますが、内部ライブラリまで完全に独立した代替とは限りません。

どの代替ライブラリを選ぶべきか

比較表の機能数だけでなく、実際のワークフローを基準にすると選びやすくなります。

  • XlsxWriter:既存ファイルを読む必要がなく、新しい見栄えのよいブックを作成する場合
  • pandas:Excelを構造化データの入出力形式として使い、変換、集計、分析が主な作業である場合
  • xlwings:Excel本体でブックを開き、数式を計算し、マクロを実行し、Excel固有の動作を維持する必要がある場合
  • Free Spire.XLS for Python:従来形式への対応、単体で動作するブック処理、PDFや画像などへの変換が必要な場合。導入前に無料版の制限を確認してください
  • pyexcel:複数形式の基本的なスプレッドシートデータを、小さく統一されたAPIで読み書き・変換したい場合
  • openpyxl:Excelをインストールせずに、最新のExcelブックを読み取り・編集するための、成熟したオープンソースライブラリが必要な場合。一般的な.xlsx自動化では、引き続き有力な標準選択肢です

まとめ

openpyxlをすべての用途で置き換えられる単一のライブラリはありません。それぞれ異なるExcelワークフローを想定して設計されています。

新規レポート作成にはXlsxWriter、データ処理にはpandas、デスクトップ版Excelの自動操作にはxlwings、ブック変換にはFree Spire.XLS、シンプルな複数形式のデータ交換にはpyexcelが適しています。

重要なのは、機能を過剰に増やすのではなく、目的の処理に合ったライブラリを選ぶことです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?