Excel作業を自動化!PythonからExcelを操作できるopenpyxlの使い方
こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。
Excel上のデータを他のシステムに一つずつコピペしたり、逆にシステムからExcelにデータ転記していませんか?データ量が少なければそれほど気にならない作業ですが、数十、数百と扱うデータが増えると手に追いきれません。
そこで登場するのがPythonです!定型的なExcel操作であればopenpyxlライブラリを使ってPythonで自動化プログラムを作れます。
本記事では、ルーチン化しているExcel作業にお困りの方を対象にPythonからExcel操作を自動化できるopenpyxlの使い方を解説します。
目次
PythonとVBAの使い分け
「Excelの自動化というとVBAじゃないの?」と思われるかもしれません。たしかに、VBAはExcel自動化の王道です。
あえてPythonを使う理由は豊富なライブラリと連携できるからです。ライブラリとは、よく使うプログラムを再利用可能な形でまとめたもので、今回のopenpyxlもその一つです。
ライブラリのなかにはブラウザ操作を自動化できたり、Webから自動でデータ収集できるものがあります。そのため、Python上でExcelデータを読み込みさえすれば、そのデータをブラウザに入力したり、Excelだけにとどまらないさまざまな処理ができるようになるのです。
まとめると、Excel以外のブラウザやシステムなどの外部と連携して処理したいときはPython、Excel単体で作業が完結するのであればVBAで十分といえます。VBAはいささか扱いづらい側面があるので、Pythonに統一するのもアリです!
PythonからExcelを操作する方法
PythonからExcelを操作するにはopenpyxlというライブラリを使います。すでにPythonをインストール済みという前提で進めますので、まだの方はPythonインストールから始めてください。
openpyxlのインストール
openpyxlはPythonのパッケージ管理ツール「pip」を通してインストールします。コマンドラインツール(Windowsはコマンドプロンプト、Macはターミナル)を開いて、下記コマンドを実行してください。
pip install openpyxl
これでopenpyxlライブラリを使えるようになりました。拡張子がpyのPythonファイルを作成し、冒頭でopenpyxlを読み込みます。今回はmain.pyというファイルを作り、以降では冒頭でopenpyxlを読み込み済みとして進めます。
import openpyxl # 以下でExcel操作を自動化する処理を書いていく
Excelファイルの読み込み
load_workbookメソッドの引数にExcelファイルのパスを指定するとWorkbookオブジェクトを取得できます。Workbookオブジェクトはその名の通りExcelのワークブックを操作するオブジェクト。sheetnamesプロパティを使うと指定したワークブックに含まれるワークシート名がリスト形式で取得できます。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') print(wb.sheetnames) # 実行結果 ['Sheet1', 'Sheet2']
openpyxlはExcel2007以降のExcelファイル(拡張子が.xlsx)にしか対応していません。Excel2003以前の拡張子がExcelファイル(拡張子が.xls)を使いたいときはxlrdライブラリを検討してください。
ワークシートの取得、シート名変更、追加、コピー、削除
ワークシートを操作するWorksheetオブジェクトは、Workbookオブジェクトにシート名を指定して取得できます。Worksheetオブジェクトのtitleプロパティでシート名を編集できます。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet1'] ws.title = 'New Name'
シート追加はWorkbookオブジェクトのcreate_sheetメソッドで追加できます。一つ目の引数にシート名、二つ目の引数にシートを挿入する位置をインデックスで指定可能。引数の指定はどちらも任意です。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb.create_sheet('New Sheet', 0)
シートコピーはWorkbookオブジェクトのcopy_worksheetメソッドでコピーできます。引数にコピーしたいWorksheetオブジェクトを指定するだけです。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws1 = wb['Sheet1'] ws2 = wb.copy_worksheet(ws1)
シート削除はWorkbookオブジェクトのremoveメソッドを使います。こちらも引数に削除したいWorksheetオブジェクトを指定するだけです。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet2'] wb.remove(ws)
セルの編集
セルの取得はWorksheetオブジェクトにセル範囲を指定して取得可能。取得したセルのvalueプロパティを使ってセルを編集できます。cellメソッドを使えば、行と列、値を指定してセルを編集できます。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet1'] c = ws['A1'] c.value = 'New Value' # cellメソッドの使用例 d = ws.cell(row=1, column=1, value='New Value')
複数セルの編集
複数セルにアクセスするときは下記のようにセル範囲をコロンで区切って指定します。行番号、列番号を指定することで、行単位、列単位で複数セルを指定できます。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet1'] c = ws['A1':'C3'] # 行単位で指定 row = ws[10] rows = ws[5:10] # 列単位で指定 col = ws['C'] cols = ws['A':'C']
複数セルを取得できたらforループで操作できます。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet1'] rows = ws['A1':'C3'] for row in rows: for cell in row: print(cell.value)
開始行番号、終了列番号、終了行番号を指定して、一度に複数セルの扱えるiter_rowsメソッドも用意されています。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet1'] for row in ws.iter_rows(min_row=1, max_col=3, max_row=3): for cell in row: print(cell.value)
最終行、最終列の取得
データが入っている最終行や最終列を数値指定できない場面も実践ではよくあります。そんなときはWorksheetオブジェクトのmax_rowプロパティ、max_columnプロパティを使いましょう。iter_rowsメソッドと組み合わせた下記のコードはよく使います。
wb = openpyxl.load_workbook('path/to/your/sample.xlsx') ws = wb['Sheet1'] for row in ws.iter_rows(min_row=1, max_col=ws.max_column, max_row=ws.max_row): for cell in row: print(cell.value)
Excelファイルの保存
Excelファイルの保存は、Workbookオブジェクトのsaveメソッドに保存先パスを指定します。新規作成の場合は新しいパス、上書き保存の場合は既存のパスを指定してください。
wb = openpyxl.Workbook() wb.save('path/to/your/sample.xlsx')
まとめ
PythonからExcel操作できるライブラリopenpyxlの使い方を解説しました。ご覧いただいたようにExcelの基本操作を簡単に再現できます。
Excelを扱うルーチンワークがあればぜひ本記事を参考に自動化してみてください。圧倒的に作業時間を削減できること間違いなしです!
Pythonは他にもさまざまな作業の自動化に役立ちます。少ないコード量でプログラムを書くことができ、可読性を重視した設計のプログラミング言語なので初心者にうってつけです。下記の記事ではPythonで自動化できることを解説しているので、Pythonに興味が出てきたらご覧ください。
【学習ロードマップ付き】実例で理解するPythonで自動化できること5選!