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


# 目的
・自己学習
・業務効率化

# 前提
> 生活に置き換えてツール作成

# 準備
```python
# データとなるExcelファイルを開きます
workbook = openpyxl.load_workbook('./data.xlsx')
sheet = workbook["Sheet1"]
```
# Excelのセルから取り出す（⇒集計したいとき用）
```python
# #####################################

# 請求月 

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

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)
```

# グラフ準備
```python
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シートにグラフを貼り付ける
```python
graphInsertCol = 1 # グラフを挿入する列番号
inColLetter = get_column_letter(graphInsertCol)
inRow = 20 # グラフを挿入する行番号
inCellLetter = inColLetter + str(inRow) # グラフを挿入するセルの位置をExcel形式で作る
ws.add_chart(cht2, inCellLetter)

```

# 出力したいExcelファイル名を指定 
```python
workbook.save('./result.xlsx') # 自動で作成される

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/27a5d138-8e86-0b4d-bafe-ef44d6b16faf.png)



# 参考
[https://pypi.org/project/openpyxl/](https://pypi.org/project/openpyxl/)