Excelには、売上や在庫、顧客情報など、さまざまなデータを保存できます。
しかし、データの量が増えてくると、
- 売上金額を合計する
- 商品ごとに売上を集計する
- 担当者ごとの売上を集計する
- 集計結果を別のExcelファイルにまとめる
といった作業に時間がかかることがあります。
このような繰り返し作業は、Pythonを使って自動化できます。
今回は、openpyxlというライブラリを使って、Excelに保存された売上データをPythonで読み込み、商品別・担当者別に集計して、結果を新しいExcelファイルに保存する方法を解説します。
PythonでExcelを操作する基本については、前回の記事「PythonでExcelファイルを操作する方法」で詳しく紹介しています。
- PythonでExcelのデータを自動集計すると何ができる?
- 今回使用するライブラリ
- 集計に使うExcelファイルを用意する
- Excelファイルを読み込む
- Excelのデータを読み込む
- Excelの列を確認する
- Excelの売上金額を合計する
- 商品別に売上を集計する
- 担当者別に売上を集計する
- 集計結果をExcelに書き込む
- 担当者別の集計結果を別シートにする
- 売上合計もExcelに保存する
- 集計結果をExcelファイルとして保存する
- 【実践】売上データを自動集計する完全なプログラム
- PythonでExcelを自動集計するメリット
- Pythonで自動化できるExcel作業
- PythonでExcelを自動集計するときの注意点
- まとめ
PythonでExcelのデータを自動集計すると何ができる?
Pythonを使うと、Excelに保存されているデータを読み込んで、さまざまな集計処理を自動化できます。
例えば、
- 売上金額の合計
- 商品別の売上集計
- 担当者別の売上集計
- 月別の売上集計
- 在庫数の集計
- 条件に合うデータの抽出
などです。
例えば、次のような売上データがExcelに入っているとします。
| 日付 | 商品 | 担当者 | 売上 |
|---|---|---|---|
| 10/1 | 商品A | 田中 | 5000 |
| 10/1 | 商品B | 鈴木 | 8000 |
| 10/2 | 商品A | 田中 | 3000 |
| 10/2 | 商品C | 佐藤 | 6000 |
| 10/3 | 商品B | 鈴木 | 4000 |
| 10/3 | 商品A | 佐藤 | 7000 |
| 10/4 | 商品C | 田中 | 5000 |
| 10/4 | 商品B | 鈴木 | 3000 |
このデータをPythonで処理すると、例えば次のような集計結果を作れます。
商品別の売上
| 商品 | 売上合計 |
|---|---|
| 商品A | 15000 |
| 商品B | 15000 |
| 商品C | 11000 |
担当者別の売上
| 担当者 | 売上合計 |
|---|---|
| 田中 | 13000 |
| 鈴木 | 15000 |
| 佐藤 | 13000 |
さらに、これらの結果を新しいExcelファイルとして保存することもできます。
つまり、
売上データ.xlsx
↓
Pythonで読み込み
↓
データを集計
↓
集計結果を作成
↓
sales_result.xlsx
という処理を自動化できます。
今回使用するライブラリ
今回使用するのは、前回の記事でも紹介したopenpyxlです。
openpyxlを使うと、Pythonから .xlsx 形式のExcelファイルを読み込んだり、データを書き込んだりできます。
まだインストールしていない場合は、次のコマンドを実行してください。
pip install openpyxl
Windowsで pip が使えない場合は、次の方法も利用できます。
python -m pip install openpyxl
openpyxl のインストールの詳しい解説はこちらの記事を参考にしてください。
集計に使うExcelファイルを用意する
今回は、sales.xlsx というExcelファイルを用意します。
Excelの1行目には見出しを入れます。
| 日付 | 商品 | 担当者 | 売上 |
|---|---|---|---|
| 10/1 | 商品A | 田中 | 5000 |
| 10/1 | 商品B | 鈴木 | 8000 |
| 10/2 | 商品A | 田中 | 3000 |
| 10/2 | 商品C | 佐藤 | 6000 |
| 10/3 | 商品B | 鈴木 | 4000 |
| 10/3 | 商品A | 佐藤 | 7000 |
| 10/4 | 商品C | 田中 | 5000 |
| 10/4 | 商品B | 鈴木 | 3000 |
ファイル名は、
sales.xlsx
として、Pythonのプログラムと同じフォルダに保存しておきます。
Excelファイルを読み込む
まず、ExcelファイルをPythonで読み込みます。
import openpyxl
book = openpyxl.load_workbook("sales.xlsx")
sheet = book.active
load_workbook()を使うことで、既存のExcelファイルを読み込めます。
book = openpyxl.load_workbook("sales.xlsx")
そして、
sheet = book.active
で、現在のExcelブックにあるアクティブなシートを取得しています。
今回は1つのシートだけを使用するため、activeを使っています。
Excelのデータを読み込む
次に、Excelに保存されている売上データを1行ずつ読み込んでみましょう。
for row in sheet.iter_rows(min_row=2, values_only=True):
print(row)
min_row=2としているのは、1行目が見出しだからです。
実行すると、次のような結果が表示されます。
('10/1', '商品A', '田中', 5000)
('10/1', '商品B', '鈴木', 8000)
('10/2', '商品A', '田中', 3000)
('10/2', '商品C', '佐藤', 6000)
('10/3', '商品B', '鈴木', 4000)
('10/3', '商品A', '佐藤', 7000)
('10/4', '商品C', '田中', 5000)
('10/4', '商品B', '鈴木', 3000)
iter_rows()を使うことで、Excelのデータを行単位で取得できます。
values_only=Trueを指定すると、セルそのものではなく、セルに入っている値を取得できます。
Excelの列を確認する
今回のExcelでは、次のような列になっています。
row[0] → 日付
row[1] → 商品
row[2] → 担当者
row[3] → 売上
例えば、
for row in sheet.iter_rows(min_row=2, values_only=True):
print(row[1])
とすると、商品名だけを表示できます。
商品A
商品B
商品A
商品C
商品B
商品A
商品C
商品B
同じように、
print(row[3])
とすれば、売上金額を取得できます。
Excelの売上金額を合計する
まずは、すべての売上金額を合計してみましょう。
import openpyxl
book = openpyxl.load_workbook("sales.xlsx")
sheet = book.active
total_sales = 0
for row in sheet.iter_rows(min_row=2, values_only=True):
total_sales += row[3]
print("売上合計:", total_sales)
実行すると、
売上合計: 41000
と表示されます。
Excelの売上データをPythonで読み込み、row[3]に入っている売上金額を順番に足しています。
このように、ExcelのデータをPythonで読み込めば、Pythonの計算機能を使って集計できます。
商品別に売上を集計する
次は、もう少し実践的な処理をしてみましょう。
売上データを商品ごとに集計します。
今回のデータでは、
商品A
商品B
商品A
商品C
商品B
商品A
商品C
商品B
のように、同じ商品が何度も登場します。
これを、
商品A → 15000円
商品B → 15000円
商品C → 11000円
のようにまとめます。
ここでは、Pythonの**辞書(dict)**を利用します。
sales_by_product = {}
for row in sheet.iter_rows(min_row=2, values_only=True):
product = row[1]
sales = row[3]
if product not in sales_by_product:
sales_by_product[product] = 0
sales_by_product[product] += sales
これで商品ごとの売上が集計されます。
結果を確認してみましょう。
for product, sales in sales_by_product.items():
print(product, sales)
実行すると、
商品A 15000
商品B 15000
商品C 11000
と表示されます。
辞書を使って集計する
ここで使っている辞書は、
商品A → 15000
商品B → 15000
商品C → 11000
のように、「商品名」と「売上金額」をセットで管理するために使っています。
最初に商品Aが登場したときは、
sales_by_product["商品A"] = 0
として、そこに売上金額を追加します。
次に商品Aが登場したときは、すでに商品Aが辞書に存在しているため、さらに売上金額を追加します。
その結果、同じ商品をまとめて集計できます。
担当者別に売上を集計する
同じ方法で、担当者ごとの売上も集計できます。
sales_by_person = {}
for row in sheet.iter_rows(min_row=2, values_only=True):
person = row[2]
sales = row[3]
if person not in sales_by_person:
sales_by_person[person] = 0
sales_by_person[person] += sales
結果を表示します。
for person, sales in sales_by_person.items():
print(person, sales)
実行すると、
田中 13000
鈴木 15000
佐藤 13000
と表示されます。
このように、集計したい列を変えることで、商品別だけでなく担当者別などの集計もできます。
集計結果をExcelに書き込む
ここまでの処理では、集計結果をPythonの画面に表示していました。
しかし、実際の仕事で利用するなら、結果をExcelファイルに保存したほうが便利です。
そこで、集計結果を新しいExcelファイルに書き込みます。
まず、新しいExcelブックを作成します。
result_book = openpyxl.Workbook()
result_sheet = result_book.active
result_sheet.title = "商品別集計"
次に、見出しを書き込みます。
result_sheet["A1"] = "商品"
result_sheet["B1"] = "売上合計"
そして、商品別の集計結果を書き込みます。
row_number = 2
for product, sales in sales_by_product.items():
result_sheet.cell(row=row_number, column=1).value = product
result_sheet.cell(row=row_number, column=2).value = sales
row_number += 1
これで、Excelには次のような表が作られます。
| 商品 | 売上合計 |
|---|---|
| 商品A | 15000 |
| 商品B | 15000 |
| 商品C | 11000 |
担当者別の集計結果を別シートにする
さらに、担当者別の集計結果も同じExcelファイルに保存してみましょう。
新しいシートを作ります。
person_sheet = result_book.create_sheet("担当者別集計")
見出しを設定します。
person_sheet["A1"] = "担当者"
person_sheet["B1"] = "売上合計"
そして、担当者別の集計結果を書き込みます。
row_number = 2
for person, sales in sales_by_person.items():
person_sheet.cell(row=row_number, column=1).value = person
person_sheet.cell(row=row_number, column=2).value = sales
row_number += 1
これで、1つのExcelファイルに、
商品別集計
担当者別集計
という2つのシートを作成できます。
売上合計もExcelに保存する
全体の売上合計もExcelに入れておきましょう。
例えば、商品別集計シートの下に、
result_sheet["A6"] = "売上合計"
result_sheet["B6"] = total_sales
とします。
今回の商品数は3つなので、
商品分3行 + 見出し分1行 + 空白1行
を間に入れて6行目に配置しています。
実際にはデータの件数に応じて、下のように自動的に位置を決める方法もあります。
total_row = len(sales_by_product) + 3
result_sheet.cell(row=total_row, column=1).value = "売上合計"
result_sheet.cell(row=total_row, column=2).value = total_sales
この方法なら、商品数が増えても対応できます。
集計結果をExcelファイルとして保存する
最後に、作成したExcelファイルを保存します。
result_book.save("sales_result.xlsx")
これで、
sales_result.xlsx
というファイルが作成されます。
完成したExcelファイルは、次のような構成になります。
sales_result.xlsx
├ 商品別集計
│
└ 担当者別集計
元の sales.xlsx はそのまま残し、集計結果を sales_result.xlsx に保存しています。
【実践】売上データを自動集計する完全なプログラム
ここまでの処理を1つのプログラムにまとめてみましょう。
import openpyxl
# Excelファイルを読み込む
book = openpyxl.load_workbook("sales.xlsx")
sheet = book.active
# 全体の売上を集計
total_sales = 0
# 商品別の売上を集計
sales_by_product = {}
# 担当者別の売上を集計
sales_by_person = {}
# Excelのデータを1行ずつ処理
for row in sheet.iter_rows(min_row=2, values_only=True):
product = row[1]
person = row[2]
sales = row[3]
# 全体の売上
total_sales += sales
# 商品別の売上
if product not in sales_by_product:
sales_by_product[product] = 0
sales_by_product[product] += sales
# 担当者別の売上
if person not in sales_by_person:
sales_by_person[person] = 0
sales_by_person[person] += sales
# 集計結果用のExcelファイルを作成
result_book = openpyxl.Workbook()
# 商品別集計シート
result_sheet = result_book.active
result_sheet.title = "商品別集計"
result_sheet["A1"] = "商品"
result_sheet["B1"] = "売上合計"
row_number = 2
for product, sales in sales_by_product.items():
result_sheet.cell(row=row_number, column=1).value = product
result_sheet.cell(row=row_number, column=2).value = sales
row_number += 1
# 売上合計
total_row = row_number + 1
result_sheet.cell(row=total_row, column=1).value = "売上合計"
result_sheet.cell(row=total_row, column=2).value = total_sales
# 担当者別集計シート
person_sheet = result_book.create_sheet("担当者別集計")
person_sheet["A1"] = "担当者"
person_sheet["B1"] = "売上合計"
row_number = 2
for person, sales in sales_by_person.items():
person_sheet.cell(row=row_number, column=1).value = person
person_sheet.cell(row=row_number, column=2).value = sales
row_number += 1
# Excelファイルを保存
result_book.save("sales_result.xlsx")
print("集計が完了しました!")
print("売上合計:", total_sales)
このプログラムを実行すると、元の sales.xlsx を読み込み、商品別・担当者別に売上を集計して、sales_result.xlsx に保存します。
毎回同じ形式のExcelデータを扱うのであれば、このプログラムを実行するだけで集計作業を繰り返せます。
PythonでExcelを自動集計するメリット
今回のような処理をPythonで自動化すると、Excelを手作業で操作する時間を減らせます。
例えば、毎月、
Excelを開く
↓
売上データを確認
↓
商品ごとに集計
↓
担当者ごとに集計
↓
合計金額を計算
↓
集計表を作成
↓
ファイルを保存
という作業をしていたとします。
データが少ないうちは、それほど大変ではありません。
しかし、データの件数が増えたり、毎日・毎週・毎月同じ作業を繰り返したりすると、かなりの時間がかかります。
Pythonで処理を自動化しておけば、
Excelを用意
↓
Pythonを実行
↓
集計結果を自動作成
という形にできます。
特に、同じ形式のExcelを繰り返し処理する作業では、Pythonの自動化が役立ちます。
Pythonで自動化できるExcel作業
今回紹介した売上集計以外にも、Pythonを使えばさまざまなExcel作業を自動化できます。
例えば、
- 在庫データの集計
- 商品別の販売数集計
- 担当者別の実績集計
- 月別の売上集計
- 顧客データの整理
- 複数のExcelファイルの集計
- CSVデータをExcelにまとめる
- 条件に合うデータの抽出
- 定型的なExcelレポートの作成
などです。
Excelだけでもさまざまな集計ができますが、Pythonを組み合わせることで、大量のデータを決められた手順で自動処理することができます。
PythonでExcelを自動集計するときの注意点
便利なPythonによるExcel自動化ですが、いくつか注意点があります。
元のExcelファイルを上書きしない
PythonでExcelファイルを保存するときは、元のファイルとは別の名前にするのがおすすめです。
今回も、
sales.xlsx
を読み込み、
sales_result.xlsx
として保存しています。
元のデータを残しておけば、プログラムに間違いがあった場合でも元データを確認できます。
Excelの列が変わるとプログラムの修正が必要
今回のプログラムでは、
row[0] → 日付
row[1] → 商品
row[2] → 担当者
row[3] → 売上
という前提で処理しています。
そのため、Excelの列を変更して、
日付
担当者
商品
売上
のように順番を変えると、プログラムも修正する必要があります。
実際の仕事で自動化する場合は、Excelの形式をできるだけ固定しておくことが重要です。
空白や入力ミスにも注意する
Excelに空白のセルや想定外のデータが入っている場合、プログラムがエラーになることがあります。
例えば、売上欄に、
5000
3000
未入力
のような文字が入っていると、単純な足し算では処理できません。
実際の業務で利用する場合は、空白や入力ミスがあった場合の処理も追加すると、より安全なプログラムになります。
まとめ
今回は、Pythonとopenpyxlを使って、Excelに保存された売上データを自動集計する方法を紹介しました。
今回覚えたポイントをまとめると、
openpyxlでExcelファイルを読み込めるiter_rows()でExcelのデータを1行ずつ取得できる- Pythonを使って売上金額を計算できる
- 辞書を使って商品別に売上を集計できる
- 担当者別の売上も集計できる
- 集計結果を新しいExcelファイルに書き込める
- Pythonを使ってExcelの定型作業を自動化できる
ということです。
ExcelをPythonで操作するだけなら、セルの読み込みや書き込みが中心になります。
しかし、今回のようにExcelからデータを読み込み、Pythonで処理し、結果を別のExcelファイルとして出力するところまでできるようになると、実際の仕事に近い自動化ができるようになります。
今回は1つのExcelファイルを集計しましたが、Pythonを使えば、複数のExcelファイルをまとめて処理することもできます。
例えば、
1月.xlsx
2月.xlsx
3月.xlsx
4月.xlsx
のような複数のファイルを自動的に読み込み、1つのExcelファイルにまとめることも可能です。
こうした処理を覚えていくと、Pythonを使ったExcel作業の自動化の幅がさらに広がります。
