【Python×Excel】ファイルを読み取り、グラフを挿入する方法~openpyxl.chart編~

Python

 

PythonからExcelファイルを自動生成するだけでなく、「グラフ」も自動で挿入できたら便利ですよね?
今回は、Pythonのライブラリ「openpyxl」を使って、棒グラフをExcelファイルに自動で描画する方法を紹介します。
報告書作成やデータの可視化に役立つテクニックです。




使用ライブラリ:openpyxl

使用するライブラリーは「openpyxl」となります。

以下のコードをプロンプトに打ち込みライブラリーをインストールしましょう

pip install openpyxl

実行するとどうなる?(完成イメージ)

以下のコードを実行すると、以下のような処理が行われます:

  1. 「sample.xlsx」というExcelファイルを新規作成
  2. 数字データをA列・B列に入力
  3. B列のデータを使って棒グラフを作成
  4. グラフをD5セル付近に表示
  5. ファイルを保存

サンプルコード

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference

# ワークブックとシートを作成
wb = Workbook()
ws = wb.active
ws.title = "データ"

# 見出しとデータを入力
data = [
    ["月", "売上"],
    ["1月", 300],
    ["2月", 420],
    ["3月", 380],
    ["4月", 500],
]
for row in data:
    ws.append(row)

# グラフを作成
chart = BarChart()
chart.title = "月別売上"
chart.x_axis.title = "月"
chart.y_axis.title = "売上"

# グラフに使用するデータ範囲を指定
data_ref = Reference(ws, min_col=2, min_row=1, max_row=5)
cats_ref = Reference(ws, min_col=1, min_row=2, max_row=5)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cats_ref)

# グラフをシートに追加(位置指定)
ws.add_chart(chart, "D5")

# 保存
wb.save("sample.xlsx")

解説

  1. WorkbookとWorksheetの作成
    Workbook() でExcelファイルを新規作成し、.active で最初のシートを操作対象にします。
  2. データ入力
    リスト形式で、見出し+4か月分の売上データを .append() で1行ずつ入力します。
  3. BarChart(棒グラフ)の設定
    BarChart() を使って棒グラフを作成し、タイトルや軸ラベルを設定します。
  4. グラフデータの参照範囲
    Reference() でデータとカテゴリ(X軸)の範囲を指定します。
    ここではB列(売上)とA列(月)を使っています。
  5. グラフの追加と保存
    グラフを add_chart() でD5セル付近に配置し、save() でExcelファイルを保存します。

PythonでExcelにグラフを挿入する方法【応用編】

次に、openpyxlを使ってExcelにグラフを挿入する際の応用的なテクニックを3つ紹介します。
実務で役立つ場面が多く、ビジネスレポートや自動化ツールに応用できます。

1. 複数系列のデータを使った棒グラフを作成する方法

概要

売上、利益、コストなどの複数項目を1つのグラフで比較できるようにします。

サンプルコード

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference

wb = Workbook()
ws = wb.active

# データ入力
ws.append(["月", "売上", "利益", "コスト"])
ws.append(["1月", 100, 30, 70])
ws.append(["2月", 120, 40, 80])
ws.append(["3月", 90, 25, 65])

# グラフの作成
chart = BarChart()
chart.title = "月別 売上・利益・コスト"
chart.x_axis.title = "月"
chart.y_axis.title = "金額"

# データ範囲を設定(系列)
data = Reference(ws, min_col=2, max_col=4, min_row=1, max_row=4)
# カテゴリ(X軸)
cats = Reference(ws, min_col=1, min_row=2, max_row=4)

chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)

ws.add_chart(chart, "E2")

wb.save("multi_series_bar.xlsx")

2. 折れ線グラフと棒グラフを同時に描画する複合グラフの作り方

概要

売上を棒グラフ、利益率を折れ線で重ねるなど、2種類のグラフを1つにまとめる方法を解説します。

サンプルコード

from openpyxl import Workbook
from openpyxl.chart import BarChart, LineChart, Reference

wb = Workbook()
ws = wb.active

# データ入力
ws.append(["月", "売上", "利益率"])
ws.append(["1月", 100, 30])
ws.append(["2月", 120, 33])
ws.append(["3月", 90, 28])

# 棒グラフ(売上)
bar_chart = BarChart()
bar_data = Reference(ws, min_col=2, min_row=1, max_row=4)
cats = Reference(ws, min_col=1, min_row=2, max_row=4)
bar_chart.add_data(bar_data, titles_from_data=True)
bar_chart.set_categories(cats)

# 折れ線グラフ(利益率)
line_chart = LineChart()
line_data = Reference(ws, min_col=3, min_row=1, max_row=4)
line_chart.add_data(line_data, titles_from_data=True)
line_chart.set_categories(cats)

# 複合グラフとして重ねる
bar_chart += line_chart

ws.add_chart(bar_chart, "E2")

wb.save("combo_chart.xlsx")

3. データが100行以上ある場合に自動でグラフ範囲を計算する方法

概要

データが継続的に増える場合、最終行を自動で取得してグラフの範囲を設定する方法を紹介します。

サンプルコード

from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference

wb = Workbook()
ws = wb.active

# タイトル行
ws.append(["日付", "売上"])

# データ100件以上(例)
for i in range(1, 121):
    ws.append([f"2024-01-{i:02d}", i * 10])

# 最終行の自動取得
max_row = ws.max_row

# 折れ線グラフ
chart = LineChart()
data = Reference(ws, min_col=2, min_row=1, max_row=max_row)
cats = Reference(ws, min_col=1, min_row=2, max_row=max_row)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
chart.title = "売上推移(自動更新)"

ws.add_chart(chart, "D2")

wb.save("dynamic_chart.xlsx")

おわりに

応用編では、実務でよく使われる「複数系列」「複合グラフ」「動的範囲」などを扱いました。
これらを組み合わせることで、Pythonを使った本格的なExcelレポート作成が可能になります。

まとめ

  • openpyxl.chart を使うと、Pythonだけでグラフ付きExcelを作成できます
  • 文字や数値だけでなく、視覚的な情報を自動生成できるのは大きな強み
  • 棒グラフ以外にも、折れ線グラフ(LineChart)、円グラフ(PieChart)なども対応可能