技術雑食系車好きの備忘録

今やってるもの:python・サーバ構築・blender

<Python Openpyxl>add_imageについてランエボとともに考える

はじめに

Pythonを使ってExcelやwordに画像を張り付けるお勉強で使われたメソッド、「add_image」の仕様がイマイチ理解できなかったので調べてみた。

リファレンス

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.worksheet.html#openpyxl.worksheet.worksheet.Worksheet.add_image

・仕様説明
add_image(img, anchor=None)[source]
Add an image to the sheet. Optionally provide a cell for the top-left anchor
⇒和訳:画像をシートに貼り付けます。オプションで左上セル(ExcelならA1)に貼り付けます。

なるほど、後半がイマイチ分からん。

・ソース

def add_data_validation(self, data_validation):
    """ Add a data-validation object to the sheet.  The data-validation
        object defines the type of data-validation to be applied and the
        cell or range of cells it should apply to.
    """
    self.data_validations.append(data_validation)

コメント部分曰く、data_validationには画像データを貼り付けたいセルもしくはセルの範囲を指定せよという事。
なんてことはない、ただのペーストする場所を指定しているだけでした。
add_image(img, 'A1') ⇒ A1セルに画像添付
add_image(img, 'C55') ⇒ C55セルに画像添付

★参考
qiita.com

add_image()で使用する画像のサイズ

次にポイントになるのが、引数img側の事前設定

img.width = 72 * 7
img.height = 25 * 10

こんな感じでわざわざ掛け算するサンプルコードが多いるのは何故だろうと考えてみたが、至極当然な話。
上記の設定の場合「幅72ptの列7個分、高さ25ptの行10個分」の大きさで画像をペーストしますよ、という事。
確かに貼り付ける際、幅何個分行何個分という基準で考えると分かりやすいです。
※cmではなくpt

サイズにマイナスを指定したら?

こんな疑問が頭に思い浮かんだので実験。
ちょうどランエボの画像が大量にあったので使ってみます、予想は縦横が反転して貼り付けられる。

>オリジナルサイズ
幅:約791pt
高さ:約592pt

import openpyxl

workbook = openpyxl.load_workbook("test.xlsx")
sheet = workbook['Sheet1']

# 比較用に正の値サイズで貼り付け
img1 = openpyxl.drawing.image.Image("01.evo5.JPG")
img1.width = 791 / 2
img1.height = 592 / 2
sheet.add_image(img1, 'A1')

# 負の値サイズで貼り付け
img2 = openpyxl.drawing.image.Image("01.evo5.JPG")
img2.width = -791 / 2
img2.height = -592 / 2
sheet.add_image(img2, 'I1')

workbook.save('insert.xlsx')

さて結果は、、、

あれ、、、エラー起きたわけでもないのに貼り付けられて無い?
と思いきや、サイズ0状態で張り付けられていました。

まとめ

add_image()を使いたい場合は、ペーストする画像の縦横サイズとセル番地を事前に定義しておくこと。
そして、画像サイズ設定の最小は0pt、負の値をセットしても0ptで貼りつくよということ。
なんという初歩的な理解