1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonとExcelグラフの連携してみた

Last updated at Posted at 2020-03-14

目的

・自己学習
・業務効率化

前提

生活に置き換えてツール作成

準備

# データとなるExcelファイルを開きます
workbook = openpyxl.load_workbook('./data.xlsx')
sheet = workbook["Sheet1"]

Excelのセルから取り出す(⇒集計したいとき用)

# #####################################

# 請求月 

# #####################################

month = []
 
for i in range(3,17):
    cell_value = sheet.cell(row=i, column=2).value
 
    if cell_value not in month:
        month.append(cell_value)
 
print(month)

# #####################################

# 電気代 

# #####################################

ene_price = []
 
for i in range(3,17):
    cell_value = sheet.cell(row=i, column=6).value
 
    if cell_value not in ene_price:
        ene_price.append(cell_value)
 
print(ene_price)

グラフ準備

from openpyxl.utils import get_column_letter
from openpyxl.styles import Color, PatternFill, Font, Border

ws = workbook['Sheet1']

# 出力するグラフのサイズ
chtWidth = 24
chtHeight = 12

# 1つ目の散布図を用意します
cht1 = openpyxl.chart.ScatterChart()
cht1.y_axis.axId = 200
cht1.height = chtHeight
cht1.width = chtWidth

# 2つ目の散布図を用意します
cht2 = openpyxl.chart.ScatterChart()
cht2.title = '年間光熱費'
cht2.x_axis.title = '請求月'
cht2.y_axis.title = '支払額'
cht2.y_axis.majorGridLines = None
cht2.height = chtHeight
cht2.width = chtWidth

# グラフ化するデータを参照する
startRow = 1
endRow = 60

# Excelのデータ参照した変数を用意する
frameValues = openpyxl.chart.Reference(ws, min_col=2, min_row=startRow, max_row=endRow)
heightValues = openpyxl.chart.Reference(ws, min_col=5, min_row=startRow, max_row=endRow)
wPosXValues = openpyxl.chart.Reference(ws, min_col=7, min_row=startRow, max_row=endRow)
wPosYValues = openpyxl.chart.Reference(ws, min_col=8, min_row=startRow, max_row=endRow)
moveDistValues = openpyxl.chart.Reference(ws, min_col=6, min_row=startRow, max_row=endRow)

# 系列を用意し、データ参照を入力する 最初の行を凡例とする
s1 = openpyxl.chart.Series(heightValues, frameValues, title_from_data=False, title=title1)
s2 = openpyxl.chart.Series(wPosXValues, frameValues, title_from_data=False, title=title2)
s3 = openpyxl.chart.Series(wPosYValues, frameValues, title_from_data=False, title=title3)
s4 = openpyxl.chart.Series(moveDistValues, frameValues, title_from_data=False, title=title4)

# グラフの書式設定をする
s1.graphicalProperties.line.solidFill = "4f81bd" # グラフの線の色
s1.marker.symbol = "diamond" # 各データ点のマーカーの形状
s1.marker.graphicalProperties.solidFill = "4f81bd" # 各データ点のマーカーの塗りつぶし色
s1.marker.graphicalProperties.line.solidFill = "4f81bd" # 各データ点のマーカーの枠の色

s2.graphicalProperties.line.solidFill = "8064a2"
s2.marker.symbol = "triangle"
s2.marker.graphicalProperties.solidFill = "8064a2"
s2.marker.graphicalProperties.line.solidFill = "8064a2"

s3.graphicalProperties.line.solidFill = "9bbb59"
s3.marker.symbol = "triangle"
s3.marker.graphicalProperties.solidFill = "9bbb59"
s3.marker.graphicalProperties.line.solidFill = "9bbb59"

s4.graphicalProperties.line.solidFill = "c0504d"
s4.marker.symbol = "x"
s4.marker.graphicalProperties.solidFill = "c0504d"
s4.marker.graphicalProperties.line.solidFill = "c0504d"

# Chartに系列を追加する
# 1つ目のグラフに系列(s1)を、2つ目のグラフに3つの系列(s2, s3, s4)を追加している。
cht1.series.append(s1)
cht2.series.append(s2)
cht2.series.append(s3)
cht2.series.append(s4)

# y軸を2軸もつグラフに設定する(グラフを足し合わせる)
# 2つ目のグラフのy軸を右側に設定する
cht2.y_axis.crosses = "max"
cht2 += cht1

Excelシートにグラフを貼り付ける

graphInsertCol = 1 # グラフを挿入する列番号
inColLetter = get_column_letter(graphInsertCol)
inRow = 20 # グラフを挿入する行番号
inCellLetter = inColLetter + str(inRow) # グラフを挿入するセルの位置をExcel形式で作る
ws.add_chart(cht2, inCellLetter)

出力したいExcelファイル名を指定

workbook.save('./result.xlsx') # 自動で作成される

image.png

参考

https://pypi.org/project/openpyxl/

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?