見出し画像

openpyxlでアンダーライン付きのハイパーリンクを設定する方法

1.何でこんなことをやっているのか

実は、HTMLでリンク集を作っていて、そのHTMLから
Web上のHPだけでなく、自分や他のPCへの共有フォルダーにアクセスするリンクもある。
でも、Windows11になったので、何かポリシーとかでリンク先を素直に表示してくれなかったりするので、Excelで同じことができないのか画策中だった。

2.リンク先がえらい多い

リンク先は非常にたくさんあるので、ハイパーリンク(エクセルの機能)を
プログラムで設定したかった。
そこでエクセルと非常に愛称のいいopenpyxlというpythonのライブラリを
使うことにした。

3.プログラムはこんな感じ

これはサンプルプログラムだが、これを実行するとsample.xlsxを作成して
noteへのハイパーリンクが作成される。
pythonで実行することができるが、openpyxlをあらかじめpip install openpyxlでインストールすることが必要。
また、sample.xlsxが上書きされるので、既存のファイルがあったら要注意。
もし、実行するなら新しいフォルダーを作って、そこにsample.pyを入れて
実行することをおすすめする。実行環境はWindows11。

#! python
-- coding: utf-8 --
#
# create Excel sheet and set hyperlink with underline on the cells
#

# openpyxlでアンダーライン付きのハイパーリンクを設定する方法
# 作成理由:
# openpyxlでセルにハイパーリンクを設定すると、アンダーラインがないリンクが出来上がる。
# これをHTMLのリンクのようなアンダーライン付きにするために、それらのセルに
# アンダーラインを設定すると、ハイパーリンクの機能であるクリックする前が青系で
# クリック後が紫系になる状態が失われてしまっていた。
# 本プログラムは、それを簡単に解決する方法を示す。

--- sample.py ---
import openpyxl
from openpyxl.styles import Font

book = openpyxl.Workbook()
sheet = book['Sheet']   # openpyxl creates 'Sheet' as default
sheet.cell(3, 3).value = "note"
sheet.cell(3, 3).hyperlink = "https://note.com/"
sheet.cell(3, 3).style = "Hyperlink"

if False:
    sheet.cell(3, 3).font = Font(underline='single')
else:
    wk_font = sheet.cell(3, 3).font
    wk_font += Font(underline='single')     # use '+=' instead of '='
    sheet.cell(3, 3).font = wk_font

book.save("sample.xlsx")

4.ハイパーリンクの仕様

ハイパーリンクは、クリックする前は青色の文字列で、クリックすると紫色の文字列になる。
また、文字列にはアンダーラインが引かれている。

5.アンダーラインが引かれない

上記のsample.pyは完成系だが、最初はstyleに"Hyperlink"を設定しただけで
保存していた。
これだと、ハイパーリンクにアンダーラインが引かれない。これはopenpyxlの仕様とのこと。

6.フォントにアンダーラインを引いたらどうか

次に、if Falseの部分をTrueにしてみた。
これは、ハイパーリンクのセルにアンダーラインを引いているが、
これだとハイパーリンクは引かれるが、色がなくなってしまう。
また、色をcolor='0000FF'として、青色を指定すると見た目はハイパーリンクの仕様となるがクリックしても青色のままになってしまった。

7.解決策の画策

こうなるとインターネットは便利なので、誰かやっているだろうとあちこち検索しまくった。
しかし、英語のページまで検索しても解決案は出てこない。
あまりニーズはないのだろうか。しかし、プログラミングはこうゆう細かいところにこだわるのが面白いのである。

8.ついに解決!!

さっきのif Trueをif Falseに戻して、elseの部分が動くようにした。
Hyperlinkで設定された青から紫になる書式を読みだして、underline要素だけ加えればいいのでは?と思ったが、最初は1のようにしていたのでうまくいかなかった。
1.wk_font = Font(underline='single')
そこで2のように直してみた。これはひらめきである。'='を'+='に変えたのだ。
2.wk_font += Font(underline='single')

9.解決すると気持ちいい

プログラミングはこれだからやめられない。
パズルを解くような楽しさもある。

いいなと思ったら応援しよう!