Pythonでエクセルの作業を自動化させましょう!
(最終更新:2020/11/27 コメントをいただき、返信・編集しました)

以前、エクセルを手動で作るのが手間に感じたため、Pythonでエクセル作成を自動化させるプログラムを作成しました。その際に、今回の「画像挿入、ポップアップ」の機能がネットを探しても見当たらなかったため、誰かの参考になればと思い、書き上げました。

○使用環境
Windows, Python, Openpyxl

今回は、エクセルシートに画像を挿入し、クリックすることで、拡大表示させてみたいと思います。


○最初に、結論!

画像選択

その画像がどこにあるのかを相対パスで表記

エクセルに自動でハイパーリンクを貼り付け

そのリンクをクリックすると、画像がポップアップで表示される


このような流れをPythonで表記していけばOKです。


単に、エクセルシートに画像を挿入するやりかたは、いろんなところで紹介されています(参考)。普通に画像を挿入し、貼り付けたいだけの場合は、他のサイトを参照してもらえれば簡単にできるかと思います。

しかし、大量にエクセルに画像を挿入すると、表をつくっている場合、見栄えが悪くなってしまいます。
そのため、画像を単に貼り付けるのではなく、画像をクリックすると、画像がポップアップ表示され、別画面で見られるようにしていきたいと思います。

考えられる方法としては、以下の2つあります。
①エクセルのコメント機能を利用し、そのコメント欄に写真を貼り付ける。
②ハイパーリンクでファイル場所を指定し、画像を表示。

Openpyxlでは、コメント機能を利用し、コメントを追加することはできますが、画像を自動で貼り付けることができるようなことは、現在のところできません。
そのため、今回は②のやり方で紹介していきます。

まずはじめは、ファイルをダイアルボックスから選択できるようにしましょう。Tkinterを利用します。このやり方は他のサイトでも紹介されています。
import tkinter
from tkinter import filedialog as tkFileDialog
root=tkinter.Tk()
root.withdraw()
filename = tkFileDialog.askopenfilename(filetypes=[("jpeg files","*.jpg"),("all files","*.*")])

これで、指定したファイルのfilenameを得ることができます。
ただし、Pythonの実行ファイルが存在するフォルダに、Picturesというフォルダを作る必要があります。表示したい画像は、そのPicturesのフォルダにすべて保存します。(リンクを作る上で、場所指定が必要なため)

【例】
Samplefile (folder)
  | - picturepop.py
  | - Pictures (folder)
      | - eg1.jpg 
      | - eg2.jpg

以下のコード、filepathでは、指定した画像ファイルがどの場所に存在しているのかを表記させています。たとえば、上記の【例】のファイル構成の場合、eg2.jpgを指定した場合、

./Pictures/eg2.jpg

となります。Samplefileフォルダがどの場所に置かれていても大丈夫なように、相対パスを利用しています。ここではWindowsで利用することを考え、Windows記法で書いています。MacであればMac記法で書けばいいでしょう。

import openpyxl as px
from openpyxl.styles import Alignment from openpyxl.styles import Font from openpyxl.styles.colors import Color

filename2 = os.path.basename(filename) filepath = os.path.join('./Pictures/', filename2)

以下のコードでは、Openpyxlにより、テンプレートのシートを読み込みます。(これらのやり方は多くの記事があるので調べてください。)そこで読み込んだシート(sheet)の、E列にHyperlinkをベタ貼りしています。A列に入れたい場合は、EをAに変えればいいです。
.format(s)のsは、for文における代入数字になります。今回、for文のコードは割愛しています。for文により、大量の画像を連続して挿入することも可能になります。
.fontでは、見やすいように、青色でハイパーリンクであることがわかりやすくしています。

sheet['E{}'.format(s)].value = '=HYPERLINK("{}", "Picture")'.format(filepath)
sheet['E{}'.format(s)].font=Font(name="Calibri", size=11, color=Color(rgb=None, indexed=None, auto=None, theme=10, tint=0.0, type="theme"))

【完成イメージ】
Screen Shot 2020-04-24 at 17.29.40

E列に、青色でPictureが表示されています。ここをクリックすると画像がポップアップします。上の灰色のPictureは、テンプレートでつくったものになります。

最後でwb.saveすれば、保存ができると思います。

ある程度、Openpyxlの使い方がわかっている方向けに最小限の説明で記載しました。コードをただコピーして貼り付けても動かないでしょう。自分の作りたいものに適する形で、アレンジしていただければと思います。この記事から学べることは、プログラムを作るための”アイデア”です。

かなり省略をした部分もありますので、わからない部分はコメントしていただければ幸いです。



Sponsored Link