社内で共有している URL 一覧や製品カタログの Excel は、作成した時点では正しく開いていたリンクも、しばらく経つとサイトの移転やページの廃止でリンク切れが混ざってきます。かといって、セルをひとつずつ右クリックして[リンクの編集]を開き、転送先を確かめていくのは現実的ではありません。
そこで本記事では、Spire.XLS for Python を使って、Excel ファイルに埋め込まれたハイパーリンクをまとめて取り出す・書き換える・外す方法を紹介します。リンク先だけを一覧に書き出して点検したり、移転した URL を一括で差し替えたりといったメンテナンス作業を、Python スクリプトで自動化できます。
クイックナビゲーション
- 実行環境を準備する
- リンクは「表示テキスト」と「アドレス」の 2 つでできている
- リンク先を一覧に取り出す(抽出)
- 表示テキストとリンク先を書き換える(変更)
- リンクだけを外す(削除)
- まとめ
- FAQ
実行環境を準備する
本記事のコードは Spire.XLS for Python(動作確認は 16.8.2)と plum-dispatch v1.7.4 で検証しています。Excel 本体は必要なく、次の pip コマンドだけで環境が整います。
pip install Spire.XLS
スクリプト側では、次の 2 行をインポートしてください。
from spire.xls import *
from spire.xls.common import *
リンクは「表示テキスト」と「アドレス」の 2 つでできている
操作に入る前に、ハイパーリンクが何で構成されているかを押さえておきます。セルに設定されたハイパーリンクは、大きく次の 2 つの情報を持っています。
- 表示テキスト — セルに見えている文字列(例:「お問い合わせ」)
- アドレス — クリックしたときに開く転送先(例:
https://jp.e-iceblue.com/misc/contact-us.html)
Spire.XLS for Python では、ワークシートの Worksheet.HyperLinks プロパティから HyperLinksCollection を取得し、その各要素(HyperLink オブジェクト)を操作します。よく使うメンバーは次のとおりです。
| メンバー | 内容 |
|---|---|
HyperLink.TextToDisplay |
セルに表示されている文字列 |
HyperLink.Address |
転送先の URL またはパス |
HyperLink.ScreenTip |
マウスを乗せたときに表示されるヒント |
HyperLink.SubAddress |
同一ブック内のジャンプ先(Sheet1!A1 など) |
HyperLink.Type |
リンクの種別(HyperLinkType 列挙体) |
HyperLink.Range |
リンクが設定されているセル範囲 |
HyperLink.Type が返す HyperLinkType 列挙体には、次の値が用意されています。
HyperLinkType |
値 | 用途 |
|---|---|---|
none |
0 | 種別なし |
Url |
1 | Web アドレス(mailto: もここに含まれる) |
File |
2 | ローカルファイル |
Unc |
3 | UNC パス(\\server\share) |
Workbook |
4 | 同一ブック内のセルへのジャンプ |
このうち本記事で扱うのは Url と File です。Type を見れば、一覧化したときにアドレスが Web のものかローカルのものかを振り分けられます。
リンク先を一覧に取り出す(抽出)
最初の作業は抽出です。対象は、セルにハイパーリンクが設定された Excel ファイル(ここでは Hyperlinks.xlsx)です。シートに設定されたすべてのハイパーリンクを走査し、リンク先のアドレスだけをテキストファイルに書き出します。リンク切れ点検のチェックリストとしても、外部のリンクチェッカーに渡す入力としても使えます。
手順はシンプルです。
- ブックを読み込む
Worksheet.HyperLinksでリンクのコレクションを取得する- コレクションをループして
HyperLink.Addressを取り出す - 取り出したアドレスをテキストファイルに書き出す
from spire.xls import *
from spire.xls.common import *
# Workbook オブジェクトを作成し、リンク付きのファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("Hyperlinks.xlsx")
# 最初のワークシートを取得
sheet = workbook.Worksheets.get_Item(0)
# ワークシートのハイパーリンク コレクションを取得
links = sheet.HyperLinks
# コレクションをループしてリンク先を集める
addresses = [link.Address for link in links]
# アドレス一覧をテキストファイルに書き出す
with open("ExtractHyperlinks.txt", "w", encoding="utf-8") as f:
for address in addresses:
f.write(address + "\n")
workbook.Dispose()
実行すると、ExtractHyperlinks.txt にアドレスが 1 行ずつ書き出されます。

HyperLinksCollection は Python の for 文でそのまま反復できます。件数だけが必要なときは Worksheet.HyperLinks.Count、インデックスで 1 件ずつ取り出したいときは Worksheet.HyperLinks[i] を使ってください。Address だけでなく TextToDisplay もあわせて書き出せば、「ラベルと転送先が食い違っていないか」を一覧で確認できます。
表示テキストとリンク先を書き換える(変更)
次は変更です。既存のリンクについて、表示テキストとリンク先の片方だけ、あるいは両方を書き換えます。Worksheet.HyperLinks[index] で目的のリンクを取得し、TextToDisplay と Address に新しい値を代入するだけです。
from spire.xls import *
from spire.xls.common import *
# Workbook オブジェクトを作成し、リンク付きのファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("Hyperlinks.xlsx")
# 最初のワークシートを取得
sheet = workbook.Worksheets.get_Item(0)
# 1 件目のハイパーリンクを取得
link = sheet.HyperLinks[0]
# 表示テキストとリンク先を書き換える
link.TextToDisplay = "E-iceblue 総合サイト(日本語)"
link.Address = "https://jp.e-iceblue.com/index.html"
# 書き換えたブックを保存
workbook.SaveToFile("ModifyHyperlink.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

表示テキストは変えずにリンク先だけを差し替えたい場合は、Address の代入だけで済みます。保存して読み込んだファイルのリンクは表示テキストが設定済みになっているため、あとから Address を書き換えても表示テキストはそのまま残ります。
link = sheet.HyperLinks[0]
# 読み込んだリンクは表示テキストが設定済みなので、この 1 行でリンク先だけが変わる
link.Address = "https://jp.e-iceblue.com/index.html"
アドレスを設定するメソッドとして HyperLink.SetAddress(アドレス, bSetText) もあります。第 2 引数には、表示テキストをあわせて更新するかを指定します。表示テキストを確実に変えたいときは、HyperLink.TextToDisplay に直接代入するのが分かりやすいでしょう。
リンクだけを外す(削除)
最後は削除です。Worksheet.HyperLinks.RemoveAt(index) で、指定した位置のハイパーリンクをコレクションから取り除きます。
from spire.xls import *
from spire.xls.common import *
# Workbook オブジェクトを作成し、リンク付きのファイルを読み込む
workbook = Workbook()
workbook.LoadFromFile("Hyperlinks.xlsx")
# 最初のワークシートを取得
sheet = workbook.Worksheets.get_Item(0)
# 1 件目のハイパーリンクを削除(セルの文字列は残る)
sheet.HyperLinks.RemoveAt(0)
# 保存
workbook.SaveToFile("RemoveHyperlink.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

RemoveAt() が外すのはあくまでリンクの設定で、セルに入っている文字列(表示テキスト)はそのまま残ります。図のとおり、「お問い合わせ」というラベルは残り、クリックしても移動しなくなります。ラベルごと消したい場合は、削除したうえで sheet.Range["B2"].ClearAll() などでセルをクリアしてください。
特定のリンクを狙って削除したいときは、Address を比較して目的のインデックスを自分で探し、RemoveAt() に渡します。
target = "https://jp.e-iceblue.com/misc/contact-us.html"
for i in range(sheet.HyperLinks.Count):
if sheet.HyperLinks[i].Address == target:
sheet.HyperLinks.RemoveAt(i)
break
まとめ
本記事で扱った 3 つの操作と、それぞれの要点を表に整理します。
| やりたいこと | 使う API | ポイント |
|---|---|---|
| リンク先を一覧化する | Worksheet.HyperLinks をループ → HyperLink.Address |
for 文でそのまま反復できる。件数は Count |
| 表示テキストを変える | HyperLink.TextToDisplay に代入 |
日本語ラベルを保ったまま更新できる |
| リンク先だけ変える | HyperLink.Address に代入 |
読み込んだリンクなら表示テキストは変わらない |
| リンクを外す | HyperLink.RemoveAt(index) / Clear() |
セルの文字列は残る |
| 範囲内のリンクだけ対象にする | HyperLinks.GetRangeHyperlinks(範囲) |
指定した範囲に設定されたリンクだけを取得 |
リンクの一覧化と一括更新をスクリプトにしておけば、URL の移転やドメイン変更のたびに、手作業で Excel を開いて回る必要はなくなります。
Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。なお無償の試用版では、保存したファイルに評価用の警告シートが追加されます。ライセンスを適用するとこれも出力されなくなります。
FAQ
表示テキストを変えずに、リンク先だけを差し替えるにはどうすればよいですか?
HyperLink.Address に新しい URL を代入するだけです。読み込んだファイルのリンクは表示テキストが設定済みなので、アドレスを変えても表示テキストはそのまま残ります。表示テキストもあわせて変えたいときは HyperLink.TextToDisplay に代入してください。
シート内のハイパーリンクをすべて一括で削除できますか?
はい。Worksheet.HyperLinks.Clear() を呼ぶと、コレクション内のリンクがまとめて外れます。セルに入っている文字列はそのまま残るので、ラベルだけを残してリンクを無効化したい場合に便利です。
特定のセル範囲にあるハイパーリンクだけを取り出せますか?
Worksheet.HyperLinks.GetRangeHyperlinks(範囲) を使うと、指定した範囲に設定されたハイパーリンクだけを含むコレクションを取得できます。たとえば GetRangeHyperlinks(sheet.Range["A2:B3"]) はその範囲内のリンクのみを返します。
リンクが Web の URL なのか、ローカルファイルなのかを判別できますか?
HyperLink.Type プロパティで判別できます。HyperLinkType.Url なら Web アドレス、HyperLinkType.File ならローカルファイル、HyperLinkType.Workbook なら同一ブック内のジャンプです。なお mailto: で始まるメールリンクも Url として返ります。
リンクに青い下線や文字色を付けるにはどうすればよいですか?
リンクを設定すると、セルはクリックできる状態になります。青い下線や文字色といった見た目はセルの書式として設定する形なので、CellRange.Style.Font.Underline や CellRange.Style.Font.Color をあわせて指定すると、Excel のハイパーリンクらしい表示になります。
リンク切れを見つけたあと、新しい URL に一括で置き換えられますか?
はい。Address を比較して対象を絞り、新しい URL を代入する処理をループにすれば、複数セルをまとめて更新できます。移転前と移転後の URL を対応表にして持っておくと、定期的な点検と更新をスクリプト 1 本で回せます。






