業務でなくてはならないツールExcel。Excelのマクロを使って自動化することもできるが、Pythonを使うとより幅広いライブラリと併用できて非常に便利だ。とは言え、PythonでExcelを自動操縦する場合、「openpyxl」を使う方法と「pywin32」を使う方法の二台手法がある。ここでは、そのメリット・デメリットを比較してみよう。

Pythonの二大Excelライブラリを比較してみよう

○「openpyxl」「pywin32」のどちらが良いのか?

PythonでExcelを操作して、業務の自動化をする場合、「openpyxl」を使う方法と「pywin32」を使う方法の二大手法がある。どちらにもメリットがある。

まず、どちらのライブラリを使う場合も、基本的なExcelのシートの内容を読み書きすることができる。しかも、双方ともオープンソースであり無料のライブラリだ。しかし、決定的に異なるのが、openpyxlがExcel専用ライブラリであるのに対して、pywin32は名前の通りWindows上の処理を自動化する汎用ライブラリであるという点が異なる。

○「openpyxl」について

最初に、openpyxlについて紹介しよう。openpyxlは、基本的にExcelファイルの読み書きを行うライブラリだ。読み書きだけでなく、書式設定や罫線など基本的な機能を備えている。

ただし、Excelそのものではないので、細かいところで完全にExcelと同じ動作をする訳ではない。しかし、ライブラリも安定しており基本的な読み書き機能で困ることはない。また、マルチプラットフォームに対応しており、Excel自体がインストールされていなくてもExcelファイルの読み書きできるというのは大きなメリットでもある。

openpyxl

[URL] https://openpyxl.readthedocs.io/

openpyxlのWebサイト

○「pywin32」について

これに対して「pywin32」を使ってExcelを操作する場合、Excelがインストールされている必要がある。Windowsの開発した技術であるActiveX/COMの枠組みを利用してExcel操作を自動化する。つまり、Windows専用であり、Excelが必須なのだ。とは言え、業務でExcelを自動化したいという要望がある場合、この条件はクリアしていることだろう。

openpyxlに対する、pywin32のメリットは、何と言っても「Excelを直接操作できる」という点に尽きる。Excelマクロで実現可能なことは、pywin32を使えばほとんど実現可能だ。Excelを操作して、シート内のデータ読み書きができるのは当然のこと、マクロを実行したり、印刷を実行したりと、細かなタスクもPythonで自動化することができる。

pywin32のGitHubプロジェクトページ

[URL] https://github.com/mhammond/pywin32

pywin32のWebサイト

○二大ライブラリのインストール

それでは、それぞれのライブラリをインストールして使い勝手を比較してみよう。それぞれ、pipコマンドを使ってインストールする。そもそも、pywin32はWindows専用なので、Windows上での操作を紹介しよう。

まずは、Windowsメニュー(スタートメニュー)からPowerShellを起動しよう。Anacondaを使っている場合は、Anacondaプロンプトを起動しよう。そして、以下のpipコマンドを実行しよう。

# openpyxlのインストール

pip install openpyxl

# pywin32のインストール

pip install pywin32

○シートに「こんにちは」と書き込んでみよう

本稿では、基本的なシートの読み書きを試してみよう。以下は、シートのセル「B2」に「こんにちは」と書き込むだけのプログラムだ。各ライブラリのやり方を確認してみよう。まずはopenpyxlだ。

以下のプログラムを「hello-openpyxl.py」という名前で保存しよう。

import openpyxl as excel

# 新規ワークブックを作ってシートを得る --- (*1)

book = excel.Workbook()

sheet = book.active

# 書き込み --- (*2)

sheet["B2"] = "こんにちは"

# ファイルを保存 --- (*3)

book.save("hello.xlsx")

そして、IDLEでプログラムを読んで実行するか、コマンドラインから以下のようにタイプしてプログラムを実行する。

python hello-openpyxl.py

プログラムを実行すると「hello.xlsx」というExcelファイルが作成される。Excelで開くと以下のように表示される。

プログラムで生成されたExcelファイル

プログラムをの(*1)では、openpyxlで新規ワークブックを作成し、そのアクティブなシートのオブジェクトを取得する。そして、(*2)ではB2のセルに「こんにちは」と書き込み、(*3)でブックをファイルに保存する。

○pywin32でExcelシートに「こんにちは」と書き込んでみよう

次に以下のプログラムを「hello-pywin32.py」という名前で保存しよう

import win32com.client as com

import os

# Excelを起動 --- (*1)

excel = com.Dispatch("Excel.Application")

# 新規ブックを追加し先頭のシートを得る --- (*2)

book = excel.Workbooks.Add()

sheet = book.Sheets[0]

# シートのB2に書き込む --- (*3)

sheet.Range("B2").Value = "こんにちは"

# ファイルに保存 --- (*4)

path = os.path.dirname(os.path.abspath(__file__)) + '/hello2.xlsx'

book.SaveAs(path)

excel.Quit()

IDLEでファイルを開いて実行するか、PowerShell上で以下のコマンドを打ち込んでプログラムを実行してみよう。

python hello-pywin32.py

プログラムを実行すると、先ほどと同じようにExcelファイルが生成される。プログラムを見てみよう。プログラムの(*1)では、ActiveX/COMの機能を利用してExcelを起動する。そして、(*2)ではワークブックを追加し、先頭のシートを取得する。(*3)ではシートセルB2に「こんにちは」と書き込んで、(*4)でファイルに保存する。ここで、pywin32を使う場合は、Excelを自動操作することになるため、作業フォルダがPythonのプログラムとは関係ないフォルダとなる。そのため、ファイルはフルパスで指定する必要がある。

○まとめ

簡単にシートにデータを書き込むだけのプログラムだが、openpyxlを使う方がプログラムも少なく容易に感じたのではないだろうか。実際、pywin32はExcel専用というわけではないので、Excel意外のWordやPowerPoint、その他、ActiveX/COMの技術に対応したアプリなら何でもPythonから操作できる。しかし、その分、多少冗長な記述が必要になるという訳だ。

とは言え、pywin32を使えば、Excelを直接自動操縦することができるため、大抵のExcelの起動を使うことができるのは大きなアドバンテージと言える。以前、本連載でも、連載62回目でpywin32を使ってExcelファイルからPDFファイルに変換するプログラムを紹介した。PDFへの変換などは、openpyxlには備わっていない機能だ。

とは言え、openpyxlとpywin32のどちらかしか使えない訳ではない。Excelシートの読み書きで十分な場合は「openpyxl」を使って、openpyxlではカバーできない部分、PDFへの変換や印刷などが必要な場合に、pywin32を使うなど、適材適所で使い分けるのが理想だろう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。