Python と openpyxl で CSV ファイルから棒グラフ付き Excel レポートを自動生成する方法

大量の売上データを CSV で受け取り、そのまま Excel グラフ付きのレポートにまとめたい場面は多いかと存じます。本記事では pandas で CSV を読み込み、openpyxl でワークブックへ転記し、最後に BarChart で部署別売上グラフを作成する一連の手順をご紹介いたします。


目次

動作環境

項目内容
Python3.10 以上
追加ライブラリpandas、openpyxl
pip install pandas openpyxl
入力ファイル例department_sales.csv
出力ファイル例department_sales_chart.xlsx

コード全体

import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows

# 1. CSV を pandas DataFrame へ読み込み
sales_df = pd.read_csv('department_sales.csv', encoding='utf-8')

# 2. 新規ワークブック作成
report_wb = Workbook()
sheet = report_wb.active
sheet.title = 'SalesData'

# 3. DataFrame をシートへ転記(ヘッダー付き)
for row in dataframe_to_rows(sales_df, index=False, header=True):
    sheet.append(row)

# 4. 棒グラフオブジェクトを生成
bar_chart = BarChart()
bar_chart.type = 'col'

# 5. グラフのデータ範囲とラベル範囲を指定
data_ref = Reference(
    worksheet=sheet,
    min_col=2,           # 売上列
    min_row=1,
    max_col=2,
    max_row=sheet.max_row
)
label_ref = Reference(
    worksheet=sheet,
    min_col=1,           # 部署名列
    min_row=2,
    max_row=sheet.max_row
)

# 6. グラフへデータとラベルをセット
bar_chart.add_data(data_ref, titles_from_data=True)
bar_chart.set_categories(label_ref)

# 7. グラフタイトルと軸ラベルを設定
bar_chart.title = 'Department Sales Performance'
bar_chart.y_axis.title = 'Sales (Million JPY)'

# 8. シートへグラフを配置(任意セルを指定)
sheet.add_chart(bar_chart, 'D8')

# 9. 保存
report_wb.save('department_sales_chart.xlsx')

コードの要点

処理説明
DataFrame からシートへの転記dataframe_to_rows()index=False で呼び出し、インデックス列を除外いたします。
Referenceデータ列(売上金額)とラベル列(部署名)をそれぞれ Reference で渡します。
グラフタイトル・軸タイトル単位を明記することで読み手が数値を誤読しにくくなります。
配置セル'D8' のように左上セルを指定すると、シートの空きスペースへ適切に配置されます。

応用アイデア

ニーズ実装例
月別グラフへ展開groupby() で月別集計し、BarChart ではなく LineChart に置き換える
部署数が変動するsheet.max_row が自動で最終行を取得するため、追加部署にも対応可能
複数グラフを自動生成ループで列ごとに BarChart を作成し、レイアウトを調整する

まとめ

  • pandas と openpyxl を組み合わせることで、CSV の数値データを グラフ付き Excel レポート に一括変換できます。
  • dataframe_to_rowsReference を使えば、セルを個別操作することなくデータ範囲を扱えます。
  • グラフ設定をスクリプト化しておくと、月次・週次レポートを ワンコマンドで自動生成 でき、業務効率が向上いたします。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次