Python Excelセルに数式を書き込む。さらに棒グラフを作成する「OpenPyXL」

 下図は、例題用に適当に作成した月別のぶどうの売り上げ表です。A列に月、B列に商品単価、C列に売り上げ個数としたエクセルファイルです。

f:id:HK29:20211001080513p:plain

本プログラムを実行すると、下図のようにD列に月別の売り上げをセルに数式で書き込みます。この時、D列の最終行に合計売上も計算します。

f:id:HK29:20211001080450p:plain

さらに、月別の売り上げを棒グラフ化します。

f:id:HK29:20211001080622p:plain

 

■本プログラム

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import os
import openpyxl
from openpyxl.chart import Reference
from openpyxl.chart.axis import DateAxis
from openpyxl.chart.shapes import GraphicalProperties

# エクセルファイルパスを指定
filepath = os.getcwd() + '/売上.xlsx'
filepath


# In[2]:


# エクセルファイルのインスタンス生成(オブジェクト)
# 引数data_only=Falseで、セル内に数式がある場合は数式で読み込む
wb = openpyxl.load_workbook(filepath, data_only=False)

# ワークシートを読み込む
sheet_name = 'ぶどう'
ws = wb[sheet_name]
ws


# In[3]:


# 最終行を取得
max_row = ws.max_row
max_row


# In[4]:


# 最終列を取得
max_col = ws.max_column
max_col


# In[5]:


# 合計の計算
ws.cell(row = 1, column = max_col + 1).value = '合計'
sum = 0
for row in range(2, max_row + 1, 1):
    ws.cell(row = row, column = max_col + 1).value = '=B' + str(row) + '*' + 'C' + str(row)
    s = ws.cell(row = row, column = 2).value * ws.cell(row = row, column = 3).value
    sum += s
ws.cell(row = max_row + 1, column = max_col + 1).value = '=SUM(D2:D' + str(max_row) + ')'


# In[6]:


# 棒グラフ

chart = openpyxl.chart.BarChart()
chart.type = "col" # 'col'は縦棒グラフ, 'bar'は横棒グラフ
chart.title  = sheet_name + ' 合計:' + str(sum) + ' 円'
chart.style  = 2 # 棒グラフの色、形
chart.height = 7
chart.width  = 11

# Xラベル
#chart.x_axis.title = "月"

# Yラベル
chart.y_axis.title = '売上 [円]'

# Xデータの指定
X_values = Reference(ws, min_row=2, min_col=1, max_row=max_row, max_col=1)
X_titles = Reference(ws, min_row=2, min_col=1, max_row=max_row)
chart.add_data(X_values)
chart.set_categories(X_titles)

# Yデータの指定
Y_values = Reference(ws, min_row=1, min_col=max_col + 1, max_row=max_row, max_col=max_col + 1)
chart.add_data(Y_values, titles_from_data=True)

# 背景色
#props = GraphicalProperties(solidFill="FFCC00") 
#chart.plot_area.graphicalProperties = props 

# 凡例隠す
chart.legend = None 

# グラフの位置
ws.add_chart(chart, "F2")

# 新ファイルに保存
wb.save('売上_まとめ.xlsx')
wb.close()


# In[ ]:

以上

<広告>