こんにちは、しぐれがきです。
PythonでExcelファイルを操作するときに重宝する「openpyxl」ですが、どうやら画像やグラフがコピーできないようです。
(バージョン3.0.1 2019年11月現在)
情報の整理もかねて、備忘録として残しておきます。
目次
openpyxlライブラリについて
Pythonライブラリであるopenpyxlを利用することで、PythonでExcelの操作をすることができます。
公式サイト:
A Python library to read/write Excel 2010 xlsx/xlsm files | openpyxl
openpyxlは万能ではない?
Excelファイルの操作で非常に有用な「openpyxl」ですが、どうやら既存のExcelファイルを開くときに、そのシートにある画像やグラフに対しては読み取りをしないようです。
そのため、シートを開いて同名で保存したり、シートをコピーすると画像やグラフが消えてしまうようです!
引用元:Simple usage | openpyxl
openpyxlの簡単な使い方のところに上の赤枠のように、「現在、openpyxlはExcelファイル内のすべての可能な項目を読み取らないため、既存のファイルを同じ名前で開いて保存すると、画像とグラフは失われます。」(直訳)と記載あります。
本当かどうか実際に確認してみた
既存シートを上書きしたり、シートコピーすることで本当に画像やグラフが消えてしまうのか確認してみました。
確認した環境は以下です。
- OS: Windows10
- openpyxlのバージョン:3.0.1
- Excelのバージョン:Microsoft Excel 2016
実行前のExcelファイル
下の画像のように、実行前のExcelファイルには以下の4つの要素を入れ込んでいます。
- テキストボックス
- 「hogehoge テスト!」と記載したテキストボックス
- 画像
- 本サイトのアイコンに使われているネコちゃんの画像
- グラフ1
- セル['A1:B10']までの値を使った折れ線グラフ
- グラフ2
- セル['D1:E4']までの値を使った円グラフ
既存シートを上書き保存してみた
既存シートを開いて、上書きするようなコードを実行してみました。
何ということでしょう、
テキストボックスが消えた!
既存シートをコピーしてみた
既存シートをWorkbookオブジェクトのcopy_worksheet ()でシートコピーするコードを実行してみました。
こちらは、まじか、、、、、
全部消えている(笑)
じゃあどうすればいいの?
今のところ模索中。。。。
openpyxlでは画像ならopenpyxl.drawing.image.Image()、グラフならopenpyxl.chartモジュールを使って、Pythonコード上で再生成させればどうにかなりそう。
ただし、この方法だとこれまで作成したグラフなどは流用できないですが(泣)
もし、良い解決方法をご存じでしたら教えて下さると助かります。
関連情報
【openpxxlライブラリのまとめ】
【Pythonライブラリのまとめ】
以上!
コメント