こんにちは、タナカです。
この記事では、openpyxlを使って複数のエクセルシートを一つのエクセルにコピーする方法を紹介します。
普段の業務の中で、設備から大量の数値データを取得し、そのデータを整理・解析することもあるのではないでしょうか。
ただ、データは取得できたけど、そのデータが複数のエクセルファイル(csv含む)で保存されているため、1つひとつ開いてコピーして貼り付けなど、単純な作業に時間がかかることもあるかもしれません。
しかし、pythonを使えば、データの整理といった単純作業も簡単に行うことができます。
今回はopenpyxlという外部ライブラリを使って、複数のエクセルファイル(シート)を1つのエクセルにコピーする処理を実装していきます。
複数のエクセルシートを1つのエクセルにコピーする処理がわかる
1. openpyxlのインストール
pythonがすでにインストールされている前提で話を進めます。pythonのインストールに関してはanacondaとvscodeでpythonの環境構築で紹介しているので、参考にしてください。
openpyxlは外部ライブラリと呼ばれるライブラリのため、pythonをインストールした段階では入っていません。
openpyxlは下記のコマンドをコマンドプロンプトやターミナルで実行することでインストールすることができます。
pip install openpyxl
また、openpyxlのリファレンスはこちらのURLから確認することができます。
>> https://openpyxl.readthedocs.io/en/stable/index.html
2. エクセルデータの確認
今回はデモ用に準備した10個のエクセルデータ(シート)を1つのエクセルにコピーしたいと思います。処理のイメージはこのようになります。
テストデータ1~10までのエクセルデータをまとめて新しく集結.xlsxというファイルを作成します。
3. エクセルデータを1つにまとめる
エクセルデータを1つにまとめるコードがこちらになります。
import openpyxl
import glob
# 対象エクセルデータのパス
file_paths = glob.glob('demo\*.xlsx')
print(file_paths)
# >>['demo\\テストデータ1.xlsx', 'demo\\テストデータ10.xlsx', .. , 'demo\\テストデータ9.xlsx']
# 最終的にデータを集結させるワークブック
m_wb = openpyxl.Workbook()
m_ws = m_wb.active
# ワークブックを作ったときに最初からあるワークシートを削除
m_wb.remove(m_ws)
for file_path in file_paths:
wb = openpyxl.open(file_path)
m_wb._sheets.append(wb._sheets[0])
m_wb.save('集結.xlsx')
for文の中は、テストデータ1~10までのエクセルのパスを順番に一つずつ取得し、openpyxlのopenメソッドでwbオブジェクトを作成しています。
作成したwbのシートを最終的に集結させるm_wbオブジェクトの_sheetsに格納させています。
下図はリファレンスのWorkbookクラスの一部を抜粋したものですが、コンストラクタ内に_sheetsという変数があるのがわかります。
_sheetsは初期として空のリストを持っており、このリストの中にシートの情報を格納することでエクセルのシート情報を保持することができます。
複数のエクセルシートを1つのエクセルにコピーする方法は以上になります。このような単純作業もopenpyxlを使うことで数行で記述することができました。
まとめ
今回はopenpyxlで複数のエクセルシートを1つのエクセルにコピーする方法を紹介しました。
本当は複数のエクセルシートを1つにまとめるような関数が存在していれば良かったのですが、openpyxlにはその関数がないようです。
なので、自分で実装してみました。
エクセルの自動化については、書店でもよく見かけるこちらの本がおすすめです。