Pythonにできることは自動化しよう!【第13回 Excel応用編1】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Excel操作もPythonにやってもらおう!(応用編1)

前回はPythonからExcelファイルを操作するopenpyxlモジュールの使い方の基本について学習しました。応用編1では、前回扱わなかったopenpyxlを使った柔軟なデータ入出力について解説します。

Excelファイルの複数セルに値を書き込む

前回はExcelファイルのシートを操作するWorksheetオブジェクトに対し、特定の1つのセルを指定してデータを書き込みました。
実際には多くのデータを書き込みたい場合が多いので、ここではその方法について解説します。

複数セルに書き込みたい場合、Worksheetオブジェクトのメソッドappend()を使用します。データの行ごとにforループを用いて繰り返し適用します。

import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
data = [['test',1],['test2',2], ['test3',3]]
for row in data:
        sheet.append(row)
filename = 'excelautomation3.xlsx'
wb.save(filename)  

Excelファイルにデータを追加する

既存のExcelファイルにデータを追加したい場合も、これまでに学習した知識で実行できます。

具体的には、

  1. openpyxl.load_workbook(filename)filenameに指定したExcelファイルのWorkbookオブジェクトを取得
  2. シートの名前を指定してwb[シート名]でデータを追加したいシートのWorksheetオブジェクトを取得
  3. forループ内で繰り返しappend()メソッドを適用してデータを追加する

となります。以下で例を見てみましょう。

filename = 'excelautomation3.xlsx'
wb = openpyxl.load_workbook(filename)
sheet = wb['Sheet']
data2 =  [['add',1],['add2',2], ['add3',3]]
for row in data2:
        sheet.append(row)

シートのサイズを取得する sheet.max_row、sheet.max_col

実際にデータを追加できたことを確認するついでに、シートのサイズを把握する方法を見てみましょう。

シートのサイズは、行数と列数を知ることで把握できます。これらは、Worksheetオブジェクトの属性であるmax_rowmax_columnでそれぞれ取得できます。

print(wb.sheetnames)
# ['Sheet']

sheet = wb['Sheet']
print(sheet.max_row)
# 6
print(sheet.max_column)
# 2

対象のシートの行数は6、列数は2であることがわかりました。どうやら正しくデータの追加が行われていそうですね。

次は実際にデータの中身を確認してみましょう。

forループでデータの中身を処理する iter_rows()、iter_cols()メソッド

各行のデータを順次処理するiter_rows()メソッド

各行のデータを順次printしたり、リストに格納するといった処理をする場合には、iter_rows()メソッドを使用すると良いでしょう。

次の例では、順次printしてさきほど追加したデータを確認しています。各行のデータを表すrowは、その行内のセルのデータであるCellオブジェクトのタプルになっています。そのため、この例ではforループを入れ子にして処理しています。Cellオブジェクトの値はvalue属性で取得できます。

この例では既に取得していたWorksheetオブジェクトのsheetに対して処理していますが、openpyxl.load_workbook(filename)で読み込んだExcelファイルのデータをリストに格納するという用途にも簡単に応用できます。

for row in sheet.iter_rows():
    for col in row:
        print(col.value)

# test
# 1
# test2
# 2
# test3
# 3
# add
# 1
# add2
# 2
# add3
# 3

各列のデータを順次処理するiter_cols()メソッド

各列のデータを順次printしたり、リストに格納するといった処理をする場合には、iter_cols()メソッドを使用します。

使い方はiter_rows()メソッドと同様で、行と列の扱いを入れ替えたものとなります。

for col in sheet.iter_cols():
    for row in col:
        print(row.value)

# test
# test2
# test3
# add
# add2
# add3
# 1
# 2
# 3
# 1
# 2
# 3

最後はデータ保存の復習です。wb.save(ファイル名)でしたね。

filename2= 'excelautomation3_update.xlsx'
wb.save(filename2)



まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第13回として、openpyxlモジュールを使ったExcel操作について解説しました。今回は応用編1として、大規模データをファイルに書き込んだり、読み込む方法について学習し、Pythonを使ったExcel操作の幅が広がったのではないかと思います。

次回は、Excelファイルならではの、「数式の入力」や「グラフの作成」について学習していきたいと思います。

さらに追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。