📊
OpenPyXLでPythonからExcelのグラフをコピーする
PythonでMicrosoft Excelの操作するライブラリとして、OpenPyXLがメジャーなツールです。
Excelファイルを新規で作る / 既存のExcelファイルを編集するのに必要なメソッドが多く用意されています。
しかし、OpenPyXLには、グラフ(チャート)をコピーするメソッドがありません。
今回は、コピー元のグラフのオブジェクトをいじって自前でコピーする方法を紹介します。
まず、OpenPyXLのPythonライブラリをインストールします。
$ pip install openpyxl
次にExcelファイルで、以下の図のようなシートを用意します。
ファイル名を copy_chart_template.xlsx
にし、 シート名を sheet_template
にします。年度ごとのアイテム数の推移のような表とグラフをイメージしています。
コピー元のシート
コピーを行う処理は以下のようになります。
copy_worksheet メソッドでシート自体はコピーできますが、この際にシート内のグラフ(チャート)はコピーされません。
そこで、コピー元のシート上にあるグラフ(チャート)のオブジェクト(の1個目)を取得しdeepcopyし、コピーしたオブジェクトの参照元を書き換えます。
新しいグラフ(チャート)は、新しいシートのA8の位置に表示させます。
さいごに copy_chart.xlsx
としてファイルを別名で保存します。
import re
from copy import deepcopy
import openpyxl
wb = openpyxl.load_workbook("./copy_chart_template.xlsx")
ws_template = wb['sheet_template']
ws_copy = wb.copy_worksheet(ws_template)
ws_copy.title = "NEW_SHEET"
c = ws_template._charts[0]
chart = deepcopy(c)
for series in chart.series:
series.val.numRef.f = re.sub("sheet_template", ws_copy.title, series.val.numRef.f, 1)
series.tx.strRef.f = re.sub("sheet_template", ws_copy.title, series.tx.strRef.f, 1)
series.cat.strRef.f = re.sub("sheet_template", ws_copy.title, series.cat.strRef.f, 1)
chart.anchor = 'A8'
ws_copy.add_chart(chart)
wb.move_sheet(ws_copy, offset=-wb.index(ws_copy))
wb.save('./copy_chart.xlsx')
今回は、OpenPyXLの鬼門になっている「グラフのコピー」について、回避策を紹介しました。
ネット上を調べてみると、グラフのコピー機能を使うためにWindows用の pywin32
という別のライブラリを使う方法もあるようですが、Macユーザーである自分にはハードルが高かったので、今回のOpenPyXLを利用する方法を選びました。
©︎ 2024 - Yard