1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでExcelグラフを出力したのに最後のデータが反映されない問題を解決しました

Posted at

PythonのExcelグラフはめちゃめちゃ癖が強かったというお話

私は毎年読書の記録をスプレッドシートでつけています。

年末には集計して読了数、購入媒体、ジャンルなどをグラフ出力しているのですが、Pythonでグラフのひな形を書いておいて出力したら楽かな?と思い立ち、PythonのExcelグラフ出力を試みてみました。

とりあえずラフにデータを書き込んで出力させてみたのですが、どういうわけか3つ項目があるうちの2項目までしかグラフに反映されず詰まってしまいました。

テスト用にラフに作ったExcelの元データ(2024read.xlsx)

xl01.jpg

パイチャートを出力させるために書いたコード

※openpyxlライブラリをインストールする必要があります

import openpyxl
from openpyxl.chart import PieChart, Reference
from openpyxl.chart.series import DataPoint

wb = openpyxl.load_workbook("2024read.xlsx")
sh = wb["label2"]
data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row)

print(labels)
print(data)

chart = PieChart()
chart.title = "ラベル別"
chart.add_data(data, titles_from_data=True)
chart.set_categories(labels)

sh.add_chart(chart, "H23")
wb.save("2024read.xlsx")

最後のデータが反映されない問題

上記のコードを実行して出力されたグラフがこちらです
py01.jpg

残念ながらtのデータが反映されていません。

ちなみにデータの範囲の参照はちゃんとされているようです
py01out.jpg

データ指定の肝になっている部分はここ

data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row)

もしかしてmax_row+1で行ける?と思い以下のコードで実行

data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row+1)
labels = Reference(sh, min_col=1,min_row=1, max_row=sh.max_row+1)

実行結果は以下の通り。がっくり。
pyplus1.jpg

あと、空欄の4行目までが選択範囲になってしまうのでダメですね。
py02out.jpg

それにしても進歩したのは「ラベルは全部反映されている」という点です

グラフデータは2行目までしか読み込んでくれない(選択行の-2まで読んでいる)
が、ラベルは3行目まで読んでくれた(選択行の-1まで読んでいる)

!!!

読み込みの先頭行が設定(min_row)の一個前になっているのではないか?
というわけで-1行目を挿入することを思いつきました。
(実際には見出し行でデータの前に一行挿入されているのが普通のExcelデータです)

見出し行的に1行挿入

xl02.jpg

ここで気を付けないといけないのは、ラベルは選択行の-1まで読んでいるけれど、データは選択行の-2までしか読んでいないという点です。
ここに気を付けて先頭行を調整します。

先頭行調整後のコード

data = Reference(sh, min_col=2,min_row=1, max_row=sh.max_row)
labels = Reference(sh, min_col=1,min_row=2, max_row=sh.max_row) #min_rowの設定変更

実行してグラフ出力
pycomp.jpg

今度はちゃんと出力されました!めでたしめでたし✨

まとめ

実際、見出し行を入れる解決策に思い至るまで3日間も詰まっていました。
Excelの書き方の問題ではなく、コードの方に問題があると思っていたのです。

それにしてもopenpyxlのラベル(凡例)とデータの取り方が違うという癖は気づくまで本当に厄介でした。

1
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?