大量の売上データを CSV で受け取り、そのまま Excel グラフ付きのレポートにまとめたい場面は多いかと存じます。本記事では pandas で CSV を読み込み、openpyxl でワークブックへ転記し、最後に BarChart で部署別売上グラフを作成する一連の手順をご紹介いたします。
目次
動作環境
項目 | 内容 |
---|---|
Python | 3.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_rows
とReference
を使えば、セルを個別操作することなくデータ範囲を扱えます。- グラフ設定をスクリプト化しておくと、月次・週次レポートを ワンコマンドで自動生成 でき、業務効率が向上いたします。