PythonでExcelのデータを自動集計する方法|openpyxlで売上データを集計

Excelには、売上や在庫、顧客情報など、さまざまなデータを保存できます。

しかし、データの量が増えてくると、

  • 売上金額を合計する
  • 商品ごとに売上を集計する
  • 担当者ごとの売上を集計する
  • 集計結果を別のExcelファイルにまとめる

といった作業に時間がかかることがあります。

このような繰り返し作業は、Pythonを使って自動化できます。

今回は、openpyxlというライブラリを使って、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で処理すると、例えば次のような集計結果を作れます。

商品別の売上

商品売上合計
商品A15000
商品B15000
商品C11000

担当者別の売上

担当者売上合計
田中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 のインストールの詳しい解説はこちらの記事を参考にしてください。

参考記事
・PythonでExcelファイルを操作する方法|初心者向けに読み込み・書き込みを解説

集計に使う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には次のような表が作られます。

商品売上合計
商品A15000
商品B15000
商品C11000

担当者別の集計結果を別シートにする

さらに、担当者別の集計結果も同じ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作業の自動化の幅がさらに広がります。

関連記事
・PythonでExcelファイルを操作する方法|初心者向けに読み込み・書き込みを解説
・WindowsにPythonをインストールする方法【初心者向け】
タイトルとURLをコピーしました