※当サイトではアフィリエイト広告を利用しています。

自動化

openpyxlで複数のエクセルシートを1つのエクセルにコピーする方法

こんにちは、タナカです。

この記事では、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つのエクセルにコピーしたいと思います。処理のイメージはこのようになります。

processing-image

テストデータ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という変数があるのがわかります。

wb-class
_sheetsは初期として空のリストを持っており、このリストの中にシートの情報を格納することでエクセルのシート情報を保持することができます。

複数のエクセルシートを1つのエクセルにコピーする方法は以上になります。このような単純作業もopenpyxlを使うことで数行で記述することができました。

まとめ

今回はopenpyxlで複数のエクセルシートを1つのエクセルにコピーする方法を紹介しました。

本当は複数のエクセルシートを1つにまとめるような関数が存在していれば良かったのですが、openpyxlにはその関数がないようです。

なので、自分で実装してみました。

エクセルの自動化については、書店でもよく見かけるこちらの本がおすすめです。