Pythonにできることは自動化しよう!【第12回 Excel入門編】

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

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

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

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

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

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

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



Excel操作もPythonにやってもらおう!(入門編)openpyxlモジュール

導入

膨大なデータが書き込まれたExcelファイルの一部を修正するなど、人間が手作業でやるには面倒な作業も、Pythonにやってもらうことができます。まずはopenpyxlモジュールをインストールしましょう。

openpyxlモジュールがインストールされていない場合はpipでインストールしてからimportします。

%pip install openpyxl
import openpyxl

ちなみに、標準ライブラリやNumpy、Pandasを用いたCSVファイルの入出力方法については【Python】ファイル入出力方法(numpy・Pandas他)で解説しています。

Excelファイルを作成する

Pythonコードを使ってExcelファイルを作成し、保存してみましょう。

wb = openpyxl.Workbook()

sheet = wb.active
# sheet.titleを指定しない場合、シート名は'Sheet'となります。
sheet.title = 'Sheet 1'
wb.sheetnames
filename = 'excelautomation.xlsx'
wb.save(filename)

これで’excelautomation.xlsx’という名前のExcelファイルがカレントディレクトリに保存されます。この段階ではセルにデータは書き込んでいません。

Excelファイルを読み込む load_workbook()メソッド

次はExcelファイルにデータを書き込んでいきたいところですが、まずはさきほど保存したExcelファイル'excelautomation.xlsx'を読み込む必要があります。

filename = 'excelautomation.xlsx'
wb = openpyxl.load_workbook(filename)

Excelファイルのシートを指定してセルに値を書き込む

Excelファイルは単純なCSVファイルと異なり、複数のシートをもつ場合が多いです。したがって、データを書き込む際にはどのシートに値を書き込むかを明示する必要があります。

Workbookオブジェクトの属性であるsheetnamesは、すべてのシート名のリストになっています。今回読み込んだ'excelautomation.xlsx'には'Sheet 1'しかシートがないため、リストの要素はひとつだけです。

sheets = wb.sheetnames
print(sheets)
# ['Sheet 1']

シート名が分かったら、wb[シート名]とすることでWorksheetオブジェクトを取得することができます。

sheet = wb['Sheet 1']
print(sheet)
# <Worksheet "Sheet 1">

このWorksheetオブジェクトにデータを書き込んでいきます。ちょうど辞書のキーを指定して値を書き込むように、セルの座標を指定してデータを書き込みます。

sheet['A1'] = 'write data'

セルの値を確認してみましょう。

sheet['A1'].value
# 'write data'



Excelファイルにシートを追加・削除・コピーする create_sheet()、remove()、copy_worksheet()メソッド

create_sheet()メソッド

Workbookオブジェクトwbにシートを追加してみます。シートの追加にはcreate_sheet()メソッドを使います。create_sheet()メソッドは、引数に値を指定しない場合、末尾に'Sheet','Sheet1', 'Sheet2', …という名前のシートを追加していきます。

wb.create_sheet()

wb.create_sheet()を3回繰り返したあとで、wb.sheetnamesによってシート名のリストを取得してみましょう。

sheets = wb.sheetnames
print(sheets)
# ['Sheet 1', 'Sheet', 'Sheet1', 'Sheet2']

引数にindextitleを指定することもできます。既に指定したインデックスにシートが存在する場合、新しくシートが挿入され、以降のシートが後ろにずれます。

wb.create_sheet(index=3, title = 'title')
sheets = wb.sheetnames
print(sheets)
# ['Sheet 1', 'Sheet', 'Sheet1', 'title', 'Sheet2']

removeメソッド

シートの作成にはremoveメソッドを使用します。引数には削除したいシートのWorksheetオブジェクトを指定します。

wb.remove(wb['Sheet'])
wb.remove(wb['Sheet1'])
sheets = wb.sheetnames
print(sheets)
# ['Sheet 1', 'title', 'Sheet2']

copy_worksheet()メソッド

シートをコピーしたい場合は、copy_worksheet()メソッドを使用します。コピーしたシートは'元のシート名' + ' Copy'という名前で末尾に追加されます。

シート名を変更したい場合は、title属性を変更しましょう。

最後の行では、A1セルのvalue属性を確認して、コピー元のシートがきちんとコピーされていることを確認しています。

ws_copy = wb.copy_worksheet(wb['Sheet 1'])
sheets = wb.sheetnames
print(sheets)
# ['Sheet 1', 'title', 'Sheet2', 'Sheet 1 Copy']

ws_copy.title = 'Sheet 3'
sheets = wb.sheetnames
print(sheets)
# ['Sheet 1', 'title', 'Sheet2', 'Sheet 3']
print(wb['Sheet 3']['A1'].value)
# write data

セルにデータを書き込んだら、名前をつけて保存します。これで、1つ目のシート’Sheet 1’と4つ目のシート’Sheet 3’のA1セルに’write data’という文字列が書き込まれ、他に’title’, ‘Sheet2’という名前のシートをもつファイル'excelautomation2.xlsx'が新しくカレントディレクトリに保存されます。

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



まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第12回として、openpyxlモジュールを使ったExcel操作の基礎について解説しました。Pythonでは、CSVファイルのような簡単なデータファイルだけでなく、Excelファイルの操作も可能です。とはいえ、今回の入門編では初歩的な操作のみ行いました。次回以降、Excelファイルならではの操作についても解説していきます。

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

おすすめ参考書

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