openpyxlでハイパーリンクを設定するとりあえずの方法

■ 二通りの手段、どちらを採るべきか

openpyxl(2.4.9)には、出力Excel上にハイパーリンクを作成する方法が二通りある。一つはopenpyxl.worksheet.hyperlinkモジュールを使う方法で、もう一つはExcelのHYPERLINK関数をそのまま書き下す方法である。これらを使うと外部Excelファイルの所望のセルにリンクを貼ることができ、たとえばある数値の元データがどのExcelのどのセルなのかを明示できる。

ただ前者は、リンク先ファイルを絶対パスで指定するとなぜか機能しない(相対パス指定ならOK)。というわけで後者を採ることになる。

 

というかなんで同じ機能を実現するのに二通りの方法が用意されているんだ。Python的には整理した方がいいんじゃないのか。

ハイパーリンクに見えるような書式設定方法

ハイパーリンクを作成すると、一般的には参照名の文字列に「未アクセスのリンク先は青色、アクセス済みのリンク先は紫色」といった色分けがなされる。当該文字列に下線が引かれることもある。また当然、当該文字列のフォントや文字サイズは自由に設定できる。

ところがopenpyxlでHYPERLINK関数を作らせると、これがなかなかうまくいかない。先ほど却下したhyperlinkモジュールを使えば、色分けはされるもののフォント関連のスタイル指定ができない。あろうことかMSゴシックとかになる。というわけで試行錯誤。

- ビルトインスタイルを指定してみる→NG

openpyxlにはビルトインスタイルがあって、一般的な書式は'Title'だとか'Accent1'だとかのキーワードを使って

% target_cell = ws.cell(row=row_num, column=column_num)     # 行列座標指定

% target_cell.style = 'Accent1'

といった按配で指定できる。で、このキーワードの中に'Hyperlink'というのがあるので使ってみたところ、色分けはできたがフォント指定が結局できなかった。NGである。

- セルのフォント設定を細かく指定する→OK

ビルトインスタイル探しにちょっと眺めたopenpyxl.stlyesモジュールと関連ソースコードをたどっていくと、リンク風味の色分けはフォントカラーの"theme"として設定できるようである。そこでメイリオUIの10ptでハイパーリンクを作成するには以下のように指定する。

from openpyxl.styles import Font
from openpyxl.styles.colors import Color

target_cell.value = '=HYPERLINK("[linked_file.xlsx]!A1", "参照名")'    # A1セルにリンク
target_cell.font  = Font(name="Meiryo UI", size=10, color=Color(rgb=None, indexed=None, auto=None, theme=10, tint=0.0, tpye="theme"))

 

やれやれ。 ようやくOKである。

■ 雑感

openpyxl、軽いノリで周囲におすすめするにはまだ早いな。影響大きそうなworksheet.cell()のパラメータの渡し方が2.5.0で変わるなど、安定的とも言えない気がする。現段階でがんばって関連コードを量産しても、早々に負債化する恐れ大なので、まあ手元でちまちまいじるにとどめておくのが無難なように思える。