【業務自動化】Chapter3-3:グラフ付きレポート作成ツールを作ろう

ながみえ

一つ前のページでは 請求書の自動作成ツール を作成しました。

今回は グラフ付きレポートの自動作成ツール を作成しましょう。

Chapter1:PythonによるExcel自動化の基本を身につけよう
Chapter2:自動化ツールを.exe化して配布しよう
Chapter3:現場で使える便利な自動化ツールを4つ作ろう
 ・Chapter3-1:Excelファイルをフォルダ丸ごと結合しよう
 ・Chapter3-2:テンプレートを使った請求書自動作成
 ・Chapter3-3:グラフ付き売上レポート自動生成ツールを作ろう ◁今回はここ
 ・Chapter3-4:勤怠の丸め・残業集計自動化ツールを作ろう
Chapter4:Webスクレイピングでデータを自動で集めよう
Chapter5:自動化ツールを作ってお金を稼ごう

Excelで売上や業務データを管理していると、「商品別の売上をまとめて、グラフ付きのレポートを作りたい」と思うことはありませんか?

しかし、手作業で毎月コピー&貼り付けを繰り返し、さらにグラフを更新するのは非常に手間がかかります。

この記事では、Pythonとopenpyxlを使って売上データを自動集計し、グラフ付きのレポート を自動生成する方法を解説します。

初心者でも一歩ずつ進めれば理解できる内容になっており、実務でもすぐに役立つ「自動化の第一歩」となるはずです。

<<前のページ

業務自動化の記事一覧

次のページ>>

openpyxl.chartモジュールの基本と使い方

Excelでグラフを作成する際は「データを選択して、グラフを挿入する」という流れで行いますね。

openpyxlでも同じように、対象データを指定して、グラフオブジェクトを生成・配置するという流れで進めます。

ここから、openpyxlでグラフを作成するための基本を体系的に紹介します。

あわせて読みたい
openpyxl使える関数・メソッド・クラス一覧【Excel自動化の基本リファレンス】
openpyxl使える関数・メソッド・クラス一覧【Excel自動化の基本リファレンス】
【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

Excelグラフ作成用モジュールの概要と4つのクラス

グラフを作成するためのクラスは openpyxl.chartモジュール にまとめられています。

代表的なグラフのクラスは以下の通りです。

  • 棒グラフ(BarChart):商品別売上やカテゴリ別の数量比較に最適
  • 折れ線グラフ(LineChart):時系列データの推移を可視化
  • 円グラフ(PieChart):割合やシェアを表すのに便利
  • 散布図(ScatterChart):相関関係を可視化するときに使用

これらはどれも、以下のようにインポートして利用します。

from openpyxl.chart import BarChart, LineChart, PieChart, ScatterChart 

グラフ作成の基本ステップ

openpyxlでグラフを作る手順は大きく次の4ステップに分けられます。

グラフオブジェクトを作成

まずは「どの種類のグラフを作るか」を決めて、そのオブジェクトを用意します。

例えば以下のようにして、オブジェクトを作成(インスタンス生成)します。

chart_1 = BarChart()		# 棒グラフを作る場合
chart_2 = ScatterChart()	# 散布図を作る場合

タイトル・軸ラベルを設定|title・x_axis・y_axisの使い方

グラフを分かりやすくするために、タイトルや軸の名前を設定します。

chart.title = "商品別売上グラフ"
chart.x_axis.title = "商品"
chart.y_axis.title = "売上金額"

データ範囲・カテゴリ範囲をReferenceで指定

グラフは「数値データ」と「ラベル(カテゴリ)」の2つを必要とします。

どのセル範囲をデータに使うか指定するオブジェクトとして Reference を使います。

  • 数値データ(売上金額など) → Y軸に使われる
  • カテゴリデータ(商品名など) → X軸や凡例に使われる

コード例を見てみましょう。

from openpyxl.chart import Reference

# 数値データの範囲(2列目、2行目から10行目まで)
data_ref = Reference(sheet, min_col=2, min_row=2, max_row=10)

# カテゴリデータの範囲(1列目、3行目から10行目まで)
cat_ref = Reference(sheet, min_col=1, min_row=3, max_row=10)

# データをグラフに追加
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cat_ref)

ここで重要なのは、Reference が 「シート内のどの部分を参照するか」 を指定する役割を持っていることです。

Excelで言うと「セル範囲をドラッグして選択する」のと同じことを、Pythonで書いているわけです。

グラフをシートへ追加|add_chartの使い方

最後に、作成したグラフをシート内の好きな場所に配置します。

sheet.add_chart(chart, "D4")  # "D4"付近にグラフを配置

これでExcelに実際のグラフが挿入されます。

この流れを押さえれば、どの種類のグラフでも基本的に同じように扱えます。

最小構成のサンプルコード|コピペで化

以下の例は「商品名と売上金額」を表に書き込み、それを円グラフで表現する最小限のサンプルです。

import openpyxl
from openpyxl.chart import PieChart, Reference

# 新しいブックとシートを作成
book = openpyxl.Workbook()
sheet = book.active
sheet.title = "売上データ"

# データを書き込み
sheet.append(["商品", "売上金額"])
sheet.append(["ノートPC", 200000])
sheet.append(["モニター", 80000])
sheet.append(["プリンター", 50000])

# グラフ作成
chart = PieChart()
chart.title = "商品別売上シェア"

# データ範囲とカテゴリ範囲を指定
data_ref = Reference(sheet, min_col=2, min_row=1, max_row=4)  # 売上金額
cat_ref = Reference(sheet, min_col=1, min_row=2, max_row=4)  # 商品名
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cat_ref)

# グラフをシートに追加
sheet.add_chart(chart, "D4")

# 保存
book.save("sample_pie_chart.xlsx")

これを実行すると、商品ごとの売上構成比を示す円グラフ付きのExcelファイルが生成されます。

Excelの手作業と同じ結果が、Pythonコード一発で再現されることを実感できるでしょう。

【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

売上レポート自動生成の準備|データ作成~GUI選択~出力

ここからは、実際に「売上データを集計してグラフ付きレポートを作成するツール」を作っていきます。

このツールを使えば、毎月の売上データをExcelに入力しておくだけで、自動で商品別売上を集計し、グラフ付きのレポートを出力できるようになります。

このサンプルスクリプトでできること

今回作成するツールの機能はシンプルですが、実務にすぐ応用できる強力なものです。

  • 複数の月の売上データをまとめて集計
  • 商品別に売上金額を合計
  • 集計結果をExcelの新しいブックに出力
  • 商品ごとの売上金額を棒グラフで自動生成

これにより、従来はExcelで「月ごとのシートを開き、SUM関数で集計し、さらにグラフを挿入する」という手作業を毎回繰り返していた作業を、ワンクリックで完了できるようになります。

特に、データ更新が頻繁に発生する職場では「時間の節約」だけでなく「ヒューマンエラーの防止」にもつながるため、実務での価値は非常に大きいです。

サンプルデータ生成|12か月×商品×金額を自動作成

実際の職場ではすでに売上データのExcelファイルが存在していることが多いですが、学習環境では練習用データが必要です。

そこでこの記事では、サンプル売上データを自動生成するPythonスクリプトを用意しています。

このスクリプト(Make_Sample_Excel.py)を実行すると、以下のような特徴を持つ売上データファイルが作成されます。

  • 12か月分(1月〜12月)のシートが自動生成される
  • 各シートには「商品」と「売上金額」がランダムに50件記録される
  • データが保存されるファイル名は sales_data.xlsx
  • 保存先は、スクリプトと同じディレクトリにある workbooks フォルダ

これにより、現実に近い売上データを使って練習できる環境が整います。

import openpyxl, pathlib, random

# === 出力先フォルダ ===
file_path = pathlib.Path(__file__).parent / "workbooks"
file_path.mkdir(exist_ok=True)

sales_file = file_path / "sales_data.xlsx"

# === サンプルデータ ===
products = ["ノートPC", "デスクトップPC", "モニター", "プリンター", "キーボード", "マウス"]
months = [f"{m:02d}月" for m in range(1, 13)]  # "01月"〜"12月"

book = openpyxl.Workbook()
book.remove(book.active)  # デフォルトシート削除

# 各月ごとにランダムな売上データを生成
for month in months:
    sheet = book.create_sheet(title=month)
    sheet.append(["商品", "売上金額"])
    for _ in range(50):  # 各月50件のデータ
        product = random.choice(products)
        amount = random.randint(5000, 200000)
        sheet.append([product, amount])

book.save(sales_file)

print(f"12か月分の売上データを出力しました:\n  {sales_file}")

レポート生成スクリプトの紹介

ここまでの準備が整ったら、いよいよ「売上データを集計し、グラフ付きレポートを作成するスクリプト」を紹介します。

import openpyxl, pathlib, sys, tkinter
from tkinter import messagebox
from openpyxl.chart import BarChart, Reference

# === 実行環境に応じた基準ディレクトリ ===
if getattr(sys, 'frozen', False):
    BASE_DIR = pathlib.Path(sys.executable).parent
else:
    BASE_DIR = pathlib.Path(__file__).parent

file_path = BASE_DIR / "workbooks"
sales_file = file_path / "sales_data.xlsx"
report_file = file_path / "sales_report.xlsx"

# === データ読み込み ===
try:
    book = openpyxl.load_workbook(sales_file)
except FileNotFoundError:
    messagebox.showerror("エラー", f"売上データ {sales_file} が見つかりません")
    sys.exit(1)

available_months = [sheet.title for sheet in book.worksheets]

# === Tkinter GUIでチェックボックス選択 ===
selected_months = []

def run_selection():
    global selected_months
    selected_months = [m for m, var in month_vars.items() if var.get() == 1]
    root.destroy()

root = tkinter.Tk()
root.title("集計する月を選択してください")

month_vars = {}
for idx, month in enumerate(available_months):
    var = tkinter.IntVar()
    chk = tkinter.Checkbutton(root, text=month, variable=var)
    chk.grid(row=idx // 4, column=idx % 4, sticky="w", padx=5, pady=5)
    month_vars[month] = var

btn = tkinter.Button(root, text="実行", command=run_selection)
btn.grid(row=4, column=0, columnspan=4, pady=10)

root.mainloop()

if not selected_months:
    messagebox.showerror("エラー", "集計する月が選択されていません")
    sys.exit(1)

# === 商品別売上を集計(選択された月のみ) ===
sales_summary = {}
for month in selected_months:
    sheet = book[month]
    for row in sheet.iter_rows(min_row=2, values_only=True):
        product, amount = row
        if not product or not amount:
            continue
        sales_summary[product] = sales_summary.get(product, 0) + amount

# === レポート用ブック作成 ===
report_book = openpyxl.Workbook()
report_sheet = report_book.active
report_sheet.title = "summary"

# ヘッダー
report_sheet["A1"] = f"集計対象: {', '.join(selected_months)}"
report_sheet["A2"] = "商品"
report_sheet["B2"] = "売上合計"

# 集計データ書き込み
for idx, (product, total) in enumerate(sales_summary.items(), start=3):
    report_sheet.cell(row=idx, column=1, value=product)
    report_sheet.cell(row=idx, column=2, value=total)

# === グラフ作成 ===
chart = BarChart()
chart.title = f"商品別売上グラフ({', '.join(selected_months)})"
chart.x_axis.title = "商品"
chart.y_axis.title = "売上金額"

data_ref = Reference(report_sheet, min_col=2, min_row=2, max_row=report_sheet.max_row)
cat_ref = Reference(report_sheet, min_col=1, min_row=3, max_row=report_sheet.max_row)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cat_ref)

report_sheet.add_chart(chart, "D4")

# 保存
report_book.save(report_file)

messagebox.showinfo("完了", f"売上レポートを作成しました!\n保存先: {report_file}")

このスクリプトを実行すると、「複数月の売上データを集計 → グラフ付きレポートにまとめる」 という一連の作業が完全に自動化されます。

Chapter2-1 で解説した、PyInstallerを用いたツール化(exe化)も忘れずに実行しましょう。

まとめ|Excelグラフの自動生成を使いこなそう

この記事では、Pythonとopenpyxlを使ってグラフ付き売上レポートを自動生成する手順を学びました。

  • グラフオブジェクトの作成
  • タイトルや軸ラベルの設定
  • Reference によるデータ範囲の指定
  • グラフの配置方法

これらを組み合わせることで、Excelで毎回繰り返していた集計・グラフ作成作業をワンクリックで完了できるようになります。

ポイントは、「一度仕組みを作れば、毎月の定型作業が一瞬で終わる」 ということです。

この考え方は売上レポートに限らず、アンケート結果の集計や在庫管理など、あらゆる業務に応用できます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいExcel自動化学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

業務自動化の記事一覧

次のページ>>

記事URLをコピーしました