ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

【Python】Excelデータを操作する|openpyxl

脱エクセルを目指している職場もありますが、まだまだ現役バリバリのエクセル。今回はPythonでExcelデータを読み書き操作する方法を解説します。非エンジニアの会社員で業務改善の一環でプログラミングを勉強中の人を読者に想定しています。

目次

PythonでExcelデータを操作する方法

PythonはExcelのデータを操作する事ができます。まずExcelデータを操作するのにPythonを使う事のメリットを確認した後、具体的な方法について解説します。

PythonでExcelデータを操作するメリット

Excelを操作すると言えば、Excel VBAがまず思い浮かびます。VBAではエクセルブックの中に格納されているデータやエクセルアプリケーションを動かす事ができます。しかし、エクセルアプリケーションを開かないと何もできないというデメリットがあります。つまり、VBAでエクセルのデータを触ろうとすると、Excelというアプリそのものを開き、Excelのブックを開いて、それからようやく中身が触れるというわけです。

一方、Pythonでエクセルのデータを操作するモジュールを使うと、エクセルのブックを開くことなく、その中身のデータを操作する事ができます。目で見て操作する必要がないのであればエクセルブックの中身だけ触ればいいですよね。エクセルはブックを開くところが結構重い動作なので、エクセルブックの中身だけ書き換える時に動作が素早いというメリットがあります。

具体的な方法

Pythonでエクセルの中身を触ることのメリットが分かったところで、具体的に方法を見て行きます。

openpyxlモジュールをインポートする

openpyxlというサードパーティモジュールを利用します。そのため、あらかじめコマンドラインでインストールしておきましょう。

pip install openpyxl

これでopenpyxlを使う準備ができたので、スクリプトを作成していきます。

import openpyxl as xl

asはエイリアスと言います。この一文はopenpyxlというモジュールをインポートして、今後、このスクリプト内では openpyxlのことをxlと呼びますよ、と言う意味です。

WorkbookからSheetを取得する

今回は、スクリプトが書かれた.pyファイルがあるのと同じフォルダに「sample_format.xlsx」というエクセルブックが存在し、その中に「Data」という名前シートがあるとします。

import openpyxl as xl

wb = xl.load_workbook('sample_format.xlsx')
ws = wb['Data']

Pythonは変数のデータの宣言はなく、始めて使った時にその変数の型が決まるという言語仕様です。今回はwbにエクセルのワークブック、wsにそのエクセルブックのなかにあるシートを格納しています。こういう風に書くんだーと思ってもらえればと思います。

Cellオブジェクトとcellメソッド

Pythonで使うopenpyxlモジュールには、Cellオブジェクトとcellメソッドが存在します*1

Cellオブジェクトはrow、column、valueというプロパティを持っています。rowはエクセルの行番号。columnは列番号です。valueはセルの持っている値です。このCellオブジェクトのvalueプロパティに値を書き込むのがcellメソッドです。cellメソッドが分かったところで、具体的にセルに値を書き込む処理を追記してみます。

cellメソッドを使って値を書き込む
import openpyxl as xl

wb = xl.load_workbook('sample_format.xlsx')
ws = wb['Data']

ws.cell(1, 1 , 'hello')
ws.cell(2, 3 , 'world!')
ws.cell(3, 5, '世界の皆さん')
ws.cell(4, 9, 'こんにちは!')

wb.save('sample_format2.xlsx')

cellメソッドの3つの引数に、行番号、列番号、入力したい値を指定しています。

実行すると下記のようになりました。

新しく名前をつけて保存された
確かにsample_format2.xlsxが作成されている

確かに狙ったように値が記述された保存されていた
新しく生成されて保存されていたsample_format2.xlsxの中身

ちなみに、元データであるsample_format.xlsxは何もも変更がありませんでした。

これは、Pythonではなく、エクセルの解説となってしまいますが、重要なので述べます。元データを開いて、そこに値を書き込むように見えています。しかし、ファイルの実態が決まるのは保存された瞬間です。今回は、ファイルに別名をつけて保存したので、その変更された内容は名前をつけて保存した新しい方のファイルに反映されており、元データの方は影響を受けません。違和感があるかも知れませんが、エクセルは、名前が確定されるまで保存されない、と覚えておけば良いでしょう。

エクセルの値を読み込む

次にエクセルの値を読み込みます。cellメソッドのvalueプロパティを取得します。ここまでで作ってきたプログラムコードのwb.save('sample_format2.xlsx')の直前に、下の2行を追加します。

greeting_str = ws.cell(1, 1).value + ws.cell(2, 3).value
print(greeting_str)

(1,1)セルの値と(2,2)セルの値を結合したものを一旦greeting_strという変数に入れてからコマンドラインに表示させています。これを実行した結果、コマンドラインにhelloworld!が表示されました。

セルの値が結合された文字列がコマンドラインに表示された
実行結果

データが書き込めてm読み取れるということは、ルールベースエクセル操作はPythonでも可能と言うことですね。大量のエクセルファイルを処理するなどの時は力を発揮するでしょう。うまくVBAと使い分けて業務改善につなげていきましょう!

<関連記事>

*1:VBAではCellはオブジェクトではありません。Sheetの中の位置を示すプロパティです。VBAができる人は混同しないようにしましょう