<Python Openpyxl>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で貼りつくよということ。
なんという初歩的な理解