Pythonでエクセルの作業を自動化させましょう!
(最終更新:2020/11/27 コメントをいただき、返信・編集しました)
以前、エクセルを手動で作るのが手間に感じたため、Pythonでエクセル作成を自動化させるプログラムを作成しました。その際に、今回の「画像挿入、ポップアップ」の機能がネットを探しても見当たらなかったため、誰かの参考になればと思い、書き上げました。
○使用環境
Windows, Python, Openpyxl
今回は、エクセルシートに画像を挿入し、クリックすることで、拡大表示させてみたいと思います。
○最初に、結論!
画像選択
↓
その画像がどこにあるのかを相対パスで表記
↓
エクセルに自動でハイパーリンクを貼り付け
↓
そのリンクをクリックすると、画像がポップアップで表示される
このような流れをPythonで表記していけばOKです。
単に、エクセルシートに画像を挿入するやりかたは、いろんなところで紹介されています(参考)。普通に画像を挿入し、貼り付けたいだけの場合は、他のサイトを参照してもらえれば簡単にできるかと思います。
しかし、大量にエクセルに画像を挿入すると、表をつくっている場合、見栄えが悪くなってしまいます。
そのため、画像を単に貼り付けるのではなく、画像をクリックすると、画像がポップアップ表示され、別画面で見られるようにしていきたいと思います。
考えられる方法としては、以下の2つあります。
①エクセルのコメント機能を利用し、そのコメント欄に写真を貼り付ける。
②ハイパーリンクでファイル場所を指定し、画像を表示。
Openpyxlでは、コメント機能を利用し、コメントを追加することはできますが、画像を自動で貼り付けることができるようなことは、現在のところできません。
そのため、今回は②のやり方で紹介していきます。
まずはじめは、ファイルをダイアルボックスから選択できるようにしましょう。Tkinterを利用します。このやり方は他のサイトでも紹介されています。
これで、指定したファイルの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記法で書けばいいでしょう。
以下のコードでは、Openpyxlにより、テンプレートのシートを読み込みます。(これらのやり方は多くの記事があるので調べてください。)そこで読み込んだシート(sheet)の、E列にHyperlinkをベタ貼りしています。A列に入れたい場合は、EをAに変えればいいです。
.format(s)のsは、for文における代入数字になります。今回、for文のコードは割愛しています。for文により、大量の画像を連続して挿入することも可能になります。
.fontでは、見やすいように、青色でハイパーリンクであることがわかりやすくしています。
【完成イメージ】

E列に、青色でPictureが表示されています。ここをクリックすると画像がポップアップします。上の灰色のPictureは、テンプレートでつくったものになります。
最後でwb.saveすれば、保存ができると思います。
ある程度、Openpyxlの使い方がわかっている方向けに最小限の説明で記載しました。コードをただコピーして貼り付けても動かないでしょう。自分の作りたいものに適する形で、アレンジしていただければと思います。この記事から学べることは、プログラムを作るための”アイデア”です。
かなり省略をした部分もありますので、わからない部分はコメントしていただければ幸いです。
(最終更新: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"))
【完成イメージ】

E列に、青色でPictureが表示されています。ここをクリックすると画像がポップアップします。上の灰色のPictureは、テンプレートでつくったものになります。
最後でwb.saveすれば、保存ができると思います。
ある程度、Openpyxlの使い方がわかっている方向けに最小限の説明で記載しました。コードをただコピーして貼り付けても動かないでしょう。自分の作りたいものに適する形で、アレンジしていただければと思います。この記事から学べることは、プログラムを作るための”アイデア”です。
かなり省略をした部分もありますので、わからない部分はコメントしていただければ幸いです。
Sponsored Link
コメント
コメント一覧 (2)
img = px.drawing.image.Image(filename)
の変数imgは何に紐づくものなのでしょうか?
ハイパーリンクのポップアップのヒントに画像が出るならば、有意義と思いますが...
ご指摘ありがとうございます。全く気がつきませんでした。この記事の内容では、このimgは全く関係ありません。消しておきます。
はじめは画像をエクセルに直接貼り付けるプログラムを作ろうと思いopenpyxl.drawing.image.Image()の関数を使っていたのですが、大量の画像には向いていないと思い、やめたんですよね。ただ消し忘れていただけです。
ハイパーリンクのヒントは考えていなかったです!ヒントだと手作業でも画像は挿入できないと思います。文字だけの対応かと。コメントに画像を挿入するのが一番いいのですが、まだopenpyxlは対応してないんですよね。