【業務自動化】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でグラフを作成するための基本を体系的に紹介します。


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コード一発で再現されることを実感できるでしょう。

売上レポート自動生成の準備|データ作成~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で毎回繰り返していた集計・グラフ作成作業をワンクリックで完了できるようになります。
ポイントは、「一度仕組みを作れば、毎月の定型作業が一瞬で終わる」 ということです。
この考え方は売上レポートに限らず、アンケート結果の集計や在庫管理など、あらゆる業務に応用できます。


