仕事でExcelを使っていると、
- 月ごとにExcelファイルが分かれている
- 部署ごとにExcelファイルが作られている
- 複数のExcelファイルを1つにまとめたい
- 毎回コピー&ペーストしてデータを統合している
といった場面があります。
ファイルが少なければ手作業でも対応できますが、10個、20個と増えてくると、かなり面倒です。
そこで便利なのが、PythonによるExcelの自動処理です。
Pythonのライブラリ「openpyxl」を使えば、フォルダ内にある複数のExcelファイルを読み込み、1つのExcelファイルにまとめることができます。
今回は、月ごとの売上データを例にして、
01月.xlsx
02月.xlsx
03月.xlsx
04月.xlsx
↓
Pythonで自動処理
↓
年間売上.xlsx
という形で、複数のExcelファイルを1つにまとめてみます。
また、Excelの日付は、ファイルによって書式が違うとPythonでの読み込まれ方が変わることがあります。
そこで今回は、日付列をPython側で統一してから、新しいExcelファイルに保存する方法も紹介します。
- Pythonで複数のExcelファイルをまとめると何ができる?
- 今回使用するExcelファイルを用意する
- openpyxlをインストールする
- Excelの日付は書式によって読み込まれ方が変わることがある
- Pythonでフォルダ内のExcelファイルを取得する
- Pathとは?
- glob("*.xlsx")とは?
- Excelファイルを1つずつ読み込む
- Excelからデータを取得する
- 日付をPython側で統一する
- 複数のExcelファイルを1つにまとめる
- 【実践】複数のExcelファイルを自動的に1つへまとめる
- プログラムを実行してみる
- 年間売上.xlsxを確認する
- convert_date()は何をしている?
- yyyy/mm/ddは何を意味する?
- 複数のExcelファイルをまとめるときの注意点
- PythonでExcelファイルをまとめるメリット
- さらにExcel作業を自動化できる
- まとめ
Pythonで複数のExcelファイルをまとめると何ができる?
例えば、次のように月ごとにExcelファイルが分かれているとします。
sales_data
├─ 01月.xlsx
├─ 02月.xlsx
├─ 03月.xlsx
└─ 04月.xlsx
それぞれのExcelファイルには、次のような売上データが入っています。
| 日付 | 商品 | 担当者 | 売上 |
|---|---|---|---|
| 2026/01/05 | パソコン | 田中 | 100000 |
| 2026/01/10 | マウス | 佐藤 | 5000 |
| 2026/01/15 | キーボード | 鈴木 | 8000 |
これらのExcelファイルをPythonで読み込んで、1つのファイルにまとめます。
01月.xlsx
02月.xlsx
03月.xlsx
04月.xlsx
↓
Python
↓
年間売上.xlsx
手作業でコピー&ペーストする必要がなくなるため、ファイル数が多い場合に便利です。
今回使用するExcelファイルを用意する
今回は、次のようなフォルダ構成にします。
excel_merge
├─ merge_excel.py
└─ sales_data
├─ 01月.xlsx
├─ 02月.xlsx
├─ 03月.xlsx
└─ 04月.xlsx
merge_excel.pyがPythonのプログラムです。
sales_dataフォルダには、まとめたいExcelファイルを入れておきます。
Excelファイルの形式をそろえる
今回は、すべてのExcelファイルを次のような構成にします。
| 日付 | 商品 | 担当者 | 売上 |
|---|---|---|---|
| 2026/01/05 | パソコン | 田中 | 100000 |
| 2026/01/10 | マウス | 佐藤 | 5000 |
| 2026/01/15 | キーボード | 鈴木 | 8000 |
列は次のようにします。
A列:日付
B列:商品
C列:担当者
D列:売上
今回のプログラムでは、A列を日付列として処理します。
そのため、A列には日付データだけを入れてください。
openpyxlをインストールする
PythonからExcelファイルを操作するために、openpyxlを使用します。
まだインストールしていない場合は、ターミナルやコマンドプロンプトで次のコマンドを実行してください。
pip install openpyxl
インストールできたか確認するには、次のプログラムを実行します。
import openpyxl
print("openpyxlを読み込みました")
エラーが表示されなければ準備完了です。
openpyxl のインストールの仕方は、こちらの記事でより詳しく解説しています。
Excelの日付は書式によって読み込まれ方が変わることがある
Excelでは、同じように、
2026/01/05
と表示されている日付でも、Excelファイルの状態によってPythonから取得した値が異なる場合があります。
例えば、
2026/01/05
として取得される場合もあれば、
2026/01/05 0:00:00
のように時刻まで含まれる場合があります。
また、Excelの設定によっては、
46027
のような数字として扱われる場合もあります。
そこで今回は、読み込んだA列の日付をPython側で判定して、日付として統一してから保存するようにします。
この記事では、Excelの日付の仕組みを詳しく覚える必要はありません。
「Excelの日付は、ファイルによってPythonでの読み込まれ方が違うことがある」
ということだけ覚えておけば十分です。
Pythonでフォルダ内のExcelファイルを取得する
まず、sales_dataフォルダにあるExcelファイルを取得してみましょう。
Python標準ライブラリのpathlibを使用します。
from pathlib import Path
files = Path("sales_data").glob("*.xlsx")
for file in files:
print(file)
実行すると、
sales_data/01月.xlsx
sales_data/02月.xlsx
sales_data/03月.xlsx
sales_data/04月.xlsx
のように表示されます。
Pathとは?
Pathは、Pythonでファイルやフォルダの場所を扱うための機能です。
from pathlib import Path
と書くことで使用できます。
Path("sales_data")
は、
sales_dataというフォルダを指定する
という意味です。
glob("*.xlsx")とは?
.glob("*.xlsx")
は、指定したフォルダの中から.xlsx形式のファイルを探します。
つまり、
Path("sales_data").glob("*.xlsx")
とすると、
sales_dataフォルダにあるExcelファイルを探す
という処理になります。
Excelファイルを1つずつ読み込む
次に、取得したExcelファイルを順番に読み込みます。
import openpyxl
from pathlib import Path
files = Path("sales_data").glob("*.xlsx")
for file in files:
book = openpyxl.load_workbook(file)
print(file.name)
book.close()
実行すると、
01月.xlsx
02月.xlsx
03月.xlsx
04月.xlsx
のように表示されます。
これで、フォルダ内にある複数のExcelファイルを順番に処理できるようになりました。
Excelからデータを取得する
次に、Excelのデータを取得します。
例えば、次のようなExcelファイルがあるとします。
| 日付 | 商品 | 担当者 | 売上 |
|---|---|---|---|
| 2026/01/05 | パソコン | 田中 | 100000 |
| 2026/01/10 | マウス | 佐藤 | 5000 |
| 2026/01/15 | キーボード | 鈴木 | 8000 |
Pythonでは、iter_rows()を使ってデータを取得できます。
import openpyxl
book = openpyxl.load_workbook("sales_data/01月.xlsx")
sheet = book.active
for row in sheet.iter_rows(min_row=2, values_only=True):
print(row)
book.close()
ここでは、
min_row=2
としているため、1行目の見出しを除いて、2行目からデータを取得します。
日付をPython側で統一する
今回の記事で重要なのが、この部分です。
Excelの日付が、
2026/01/05
として読み込まれる場合もあれば、
2026/01/05 0:00:00
のように読み込まれる場合もあります。
さらに、Excelの状態によっては、
46027
のような数字として読み込まれることもあります。
そこで、日付を処理するための関数を作ります。
import openpyxl
from datetime import datetime, date
from openpyxl.utils.datetime import from_excel
def convert_date(value, epoch):
# Pythonの日付・日時として読み込まれた場合
if isinstance(value, datetime):
return value.date()
if isinstance(value, date):
return value
# Excelの日付が数字として読み込まれた場合
if isinstance(value, (int, float)):
return from_excel(value, epoch).date()
return value
少し長く見えますが、やっていることはシンプルです。
この関数は、
Excelの値
↓
Pythonで日付・日時として読み込まれた?
↓
YES → 日付に統一
数字として読み込まれた?
↓
YES → Excelの日付として変換
それ以外(文字列など)として読み込まれた?
↓
YES → そのまま値を返す
という処理をしています。
これによって、日付の形式が多少違っていても、Python側でできるだけ統一できます。
複数のExcelファイルを1つにまとめる
それでは、ここまでの処理を組み合わせてみましょう。
まず、まとめ先となる新しいExcelファイルを作成します。
import openpyxl
result_book = openpyxl.Workbook()
result_sheet = result_book.active
result_sheet.title = "売上データ"
result_sheet.append([
"日付",
"商品",
"担当者",
"売上"
])
これで、新しいExcelファイルに見出しを作ることができます。
【実践】複数のExcelファイルを自動的に1つへまとめる
それでは、今回の完成版プログラムを作ります。
フォルダ構成は次のとおりです。
excel_merge
├─ merge_excel.py
└─ sales_data
├─ 01月.xlsx
├─ 02月.xlsx
├─ 03月.xlsx
└─ 04月.xlsx
merge_excel.pyに、次のコードを記述してください。
import openpyxl
from pathlib import Path
from datetime import datetime, date
from openpyxl.utils.datetime import from_excel
# --------------------------------
# 日付を統一する関数
# --------------------------------
import openpyxl
from datetime import datetime, date
from openpyxl.utils.datetime import from_excel
def convert_date(value, epoch):
# Pythonの日付・日時として読み込まれた場合
if isinstance(value, datetime):
return value.date()
if isinstance(value, date):
return value
# Excelの日付が数字として読み込まれた場合
if isinstance(value, (int, float)):
return from_excel(value, epoch).date()
# それ以外
return value
# --------------------------------
# フォルダ内のExcelファイルを取得
# --------------------------------
files = Path("sales_data").glob("*.xlsx")
# --------------------------------
# まとめ先のExcelファイルを作成
# --------------------------------
result_book = openpyxl.Workbook()
result_sheet = result_book.active
result_sheet.title = "売上データ"
# --------------------------------
# 見出しを追加
# --------------------------------
result_sheet.append([
"日付",
"商品",
"担当者",
"売上"
])
# --------------------------------
# Excelファイルを1つずつ処理
# --------------------------------
for file in files:
print(f"{file.name}を処理しています")
# Excelファイルを開く
book = openpyxl.load_workbook(file)
sheet = book.active
# 2行目からデータを取得
for row in sheet.iter_rows(min_row=2):
# A列:日付
date_value = convert_date(
row[0].value,
book.epoch
)
# B列:商品
product = row[1].value
# C列:担当者
person = row[2].value
# D列:売上
sales = row[3].value
# まとめ先にデータを追加
result_sheet.append([
date_value,
product,
person,
sales
])
# 日付列の表示形式を設定
result_sheet.cell(
row=result_sheet.max_row,
column=1
).number_format = "yyyy/mm/dd"
# Excelファイルを閉じる
book.close()
# --------------------------------
# Excelファイルとして保存
# --------------------------------
result_book.save("年間売上.xlsx")
print("Excelファイルの統合が完了しました")
これで、複数のExcelファイルを1つにまとめられます。
プログラムを実行してみる
ターミナルやコマンドプロンプトから、
python merge_excel.py
を実行します。
すると、
01月.xlsxを処理しています
02月.xlsxを処理しています
03月.xlsxを処理しています
04月.xlsxを処理しています
Excelファイルの統合が完了しました
と表示されます。
そして、
excel_merge
├─ merge_excel.py
├─ 年間売上.xlsx
└─ sales_data
├─ 01月.xlsx
├─ 02月.xlsx
├─ 03月.xlsx
└─ 04月.xlsx
という状態になります。
年間売上.xlsxを確認する
作成された年間売上.xlsxを開いてみましょう。
すると、複数のExcelファイルに分かれていたデータが、1つのシートにまとまっています。
例えば、
| 日付 | 商品 | 担当者 | 売上 |
|---|---|---|---|
| 2026/01/05 | パソコン | 田中 | 100000 |
| 2026/01/10 | マウス | 佐藤 | 5000 |
| 2026/01/15 | キーボード | 鈴木 | 8000 |
| 2026/02/03 | パソコン | 鈴木 | 120000 |
| 2026/02/08 | マウス | 田中 | 6000 |
のようになります。
日付についても、出力先のExcelでは、
2026/01/05
のように統一して表示されます。
2026/01/05 0:00:00のように時刻が表示されることもありません。
また、Excel側の書式によって日付が数字として扱われていた場合にも、今回のプログラムでは日付として変換してから保存します。
convert_date()は何をしている?
今回のプログラムで少し難しく見えるのが、
def convert_date(value, epoch):
から始まる部分です。
これは、
Excelから読み込んだ日付を、扱いやすい日付データに統一する
ための関数です。
例えば、
2026/01/05
や、
2026/01/05 0:00:00
など、読み込まれ方が違っていても、Python側で日付として扱えるようにします。
今回の記事では、この関数の細かい仕組みまで覚える必要はありません。
「Excelの日付を統一するための処理」
と考えておけば十分です。
yyyy/mm/ddは何を意味する?
プログラムの中に、
.number_format = "yyyy/mm/dd"
という部分があります。
これは、Excelでの日付の表示形式を指定しています。
yyyy → 年
mm → 月
dd → 日
そのため、
2026年1月5日
という日付を、
2026/01/05
と表示できます。
ここで重要なのは、表示方法を指定しているだけで、日付そのものを文字列に変換しているわけではないということです。
そのため、Excel上でも日付として扱いやすい状態を維持できます。
複数のExcelファイルをまとめるときの注意点
A列を日付列として使用する
今回のプログラムでは、
A列:日付
B列:商品
C列:担当者
D列:売上
という構成を前提にしています。
特にA列は日付として処理するため、A列には日付データだけを入れてください。
例えば、
2026/01/05
2026/01/10
2026/01/15
などです。
Excelファイルの列構成をそろえる
複数のExcelファイルをまとめる場合、列の順番もそろえておきましょう。
例えば、
01月.xlsx
日付 | 商品 | 担当者 | 売上
なのに、
02月.xlsx
商品 | 日付 | 売上 | 担当者
となっていると、正しくデータをまとめられません。
Pythonで自動処理する場合は、元となるExcelファイルの形式をそろえておくことが重要です。
見出しの位置をそろえる
今回のプログラムでは、
min_row=2
としているため、1行目が見出しであることを前提としています。
例えば、
1行目:日付・商品・担当者・売上
2行目:データ
3行目:データ
という構成です。
Excelファイルによって見出しの位置が違う場合は、プログラムを変更する必要があります。
空のExcelファイルに注意する
フォルダの中に空のExcelファイルが入っている場合もあります。
大量のExcelファイルを自動処理する場合は、
- ファイルが空ではないか
- 必要な列が存在するか
- 日付が正しい形式か
- 売上が数値になっているか
などを確認する処理を追加すると、より安全です。
入力フォルダと出力ファイルを分ける
今回のフォルダ構成では、
sales_data
に入力するExcelファイルを入れています。
一方、完成したファイルは、
年間売上.xlsx
としてexcel_mergeフォルダに保存しています。
このように、入力ファイルと出力ファイルを分けておくことをおすすめします。
もし年間売上.xlsxまでsales_dataフォルダに入れてしまうと、次回の処理で出力ファイルまで読み込んでしまう可能性があるためです。
PythonでExcelファイルをまとめるメリット
複数のExcelファイルを手作業でまとめる場合、
- Excelファイルを開く
- データをコピーする
- まとめ先のExcelを開く
- データを貼り付ける
- 次のExcelファイルを開く
- 同じ作業を繰り返す
という作業になります。
ファイル数が増えるほど、時間もかかります。
Pythonなら、
Excelファイルをフォルダに入れる
↓
Pythonを実行
↓
Excelファイルを自動的に読み込む
↓
データを1つにまとめる
↓
年間売上.xlsxを作成
という流れにできます。
特に、
「毎月同じ作業を繰り返している」
という場合は、Pythonによる自動化と相性が良いでしょう。
さらにExcel作業を自動化できる
今回作成したプログラムは、複数のExcelファイルを1つにまとめるところまでです。
しかし、Pythonとopenpyxlを組み合わせれば、さらに多くのExcel作業を自動化できます。
例えば、
- 複数のExcelファイルを1つにまとめる
- 売上を自動集計する
- 商品ごとに集計する
- 担当者ごとに集計する
- 月別に集計する
- 不要なデータを削除する
- Excelファイルを自動作成する
- セルの書式を変更する
- グラフを作成する
といった処理が可能です。
単純なExcel操作だけではなく、Excelを使った定型業務そのものを自動化できるのがPythonの大きなメリットです。
まとめ
今回は、Pythonとopenpyxlを使って、複数のExcelファイルを1つにまとめる方法を紹介しました。
ポイントをまとめると、
openpyxlを使うとPythonからExcelを操作できるpathlibを使うとフォルダ内のExcelファイルを取得できるglob("*.xlsx")でExcelファイルをまとめて探せるiter_rows()でExcelのデータを取得できるappend()でデータを別のExcelに追加できる- Excelの日付はファイルによってPythonでの読み込まれ方が異なる場合がある
- 日付をPython側で統一してから保存すると扱いやすい
- 出力先では
yyyy/mm/ddの形式で日付を表示できる - 入力ファイルと出力ファイルを分けておくと安全
今回のように、複数のExcelファイルを毎回手作業でまとめているのであれば、その作業はPythonで自動化できるかもしれません。
まずは少ないファイルで試してみて、うまく動くことを確認してから、実際の業務データに応用してみるとよいでしょう。
