如何使用 Python openpyxl 包操作 Excel 链接?openpyxl Hyperlink 对象介绍
阅读本节的前提是已经了解 Excel 单元格对象Cell
,你可以查看如何使用 Python openpyxl 包操作 Excel 单元格?openpyxl Cell 对象介绍一节来获取相关信息。
Python openpyxl 包中的 Excel 链接对象 Hyperlink
Pythonopenpyxl
包中的Hyperlink
类,属于模块openpyxl.worksheet.hyperlink
,用于表示 Excel 单元格中的链接。
什么是 Excel 链接?
在 Excel 文件中,Excel 链接类似于网页中的超链接,当你点击他们时,Office 软件会通过浏览器打开某个网址,或者定位至某个工作表的 Excel 单元格或区域,采取哪种操作取决于 Excel 链接的设置。
使用 Python openpyxl 包的 Hyperlink 对象创建 Excel 链接
使用 Pythonopenpyxl
包的Hyperlink
对象的构造器,你可以创建新的 Excel 链接,这些链接可被设置到工作表的某个 Excel 单元格中。
Hyperlink(ref=None, location=None, tooltip=None, display=None, id=None, target=None)
- ref 参数
ref
参数是一个字符串,表示含有 Excel 链接的单元格的地址,比如'A1'
。通过该参数赋值的ref
变量,可能会被openpyxl
修改,因此,这里的ref
参数是无关紧要的,如果开发人员自行创建Hyperlink
对象的话。- location 参数
location
参数是一个字符串,表示 Excel 链接指向的 Excel 单元格或区域的地址,其格式为worksheet!address
(比如,SheetB!A1
),其中worksheet
为工作表名称,address
为地址,如果指向的是本工作表中的单元格或区域,则worksheet
和!
可以省去(比如,A1:B2
)。- tooltip 参数
tooltip
参数是一个字符串,他表示 Excel 链接对应的工具提示。需要说明的是,即便设置了tooltip
,一些 Office 软件也不会按照tooltip
给出的值来显示工具提示。- display 参数
display
参数是一个字符串,他表示 Excel 链接在其对应的单元格中应该显示的文本,需要指出,Excel 单元格中最终显示的内容是由Cell
对象的value
属性来决定的。- id 参数
id
参数是一个字符串,用于标识 Excel 链接。如果链接对应的target
变量不为None
,那么通过参数id
赋值的id
变量,可能会被openpyxl
包在保存 Excel 文件时修改,当id
变量为None
,或者id
变量的值不符合要求时。- target 参数
target
参数是一个字符串,他可能是某个网络地址(比如,以http
,https
,mailto
开头的地址),或者是某个 Excel 文件的路径(可以是相对路径或绝对路径)。
在读取 Excel 文件时,openpyxl
包会创建 Excel 链接对象Hyperlink
。如果 Excel 链接并未指向单元格或区域,那么Hyperlink
对象的location
变量可能为 Python 空值None
。如果 Excel 链接指向 Excel 单元格或区域,那么Hyperlink
对象的id
变量可能为 Python 空值None
。如果 Excel 链接指向本工作表中的单元格或区域,那么Hyperlink
对象的target
变量可能为 Python 空值None
。
Python openpyxl 包的 Hyperlink 对象的变量
Pythonopenpyxl
包的Hyperlink
对象拥有变量ref
,location
,tooltip
,display
,id
和target
,在未作出修改时,他们的值与传递给Hyperlink
构造器的实参的值相同。
使用 Python openpyxl 包的 Cell 对象获取和设置 Excel 链接
Pythonopenpyxl
包的Cell
对象的hyperlink
属性,可用于获取或设置 Excel 单元格中的链接。hyperlink
属性的返回值是一个Hyperlink
对象,如果 Excel 单元格未包含链接,则Cell
对象的hyperlink
属性返回空值None
。
cell.hyperlink
cell.hyperlink = link
- link 值
link
是一个表示 Excel 链接的Hyperlink
对象,或者是一个表示链接目标的字符串(他将对应Hyperlink
对象的target
变量),比如'https://www.bing.com/'
。要移除 Excel 单元格中的链接,link
应该为空值None
。
openpyxl 包的 Hyperlink 对象的 display 变量可能不会影响 Cell 对象的 value 属性
当你通过openpyxl
包的Cell
对象的hyperlink
属性来设置 Excel 链接时,给出的Hyperlink
对象的display
变量无法影响 Excel 单元格的值,即便是空单元格,Cell
对象也仅会将Hyperlink
对象的target
或location
变量的值设置为单元格的内容。
在 Excel 文件Link.xlsx
的工作表Hyperlinks
中,单元格A1
拥有指向https://www.bing.com/
的链接,单元格A2
拥有指向工作表Other
的区域B1:B4
的链接。
我们为单元格B1
设置了新的 Excel 链接,虽然给出了参数display
,但单元格B1
并不会显示Google
,而是显示https://www.google.com/
。
# 打开 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
wb = openpyxl.load_workbook('Link.xlsx')
ws = wb['Hyperlinks']
# 显示区域 A1:A2 中的单元格的链接
for row in ws['A1:A2']:
for cell in row:
print(f'{cell.hyperlink}, {cell.hyperlink.target}')
from openpyxl.worksheet.hyperlink import Hyperlink
# B1 单元格不会显示为 Google,而是 https://www.google.com/,参数 ref 并不正确,但没有关系
ws['B1'].hyperlink = Hyperlink('XXXX', display='Google', target='https://www.google.com/')
# 直接通过网址来设置 Excel 链接
ws['C1'].hyperlink = 'https://www.python.org'
# 指向工作表 Other 的 A1 单元格的链接
ws['D1'].hyperlink = Hyperlink('D1', location='Other!A1')
# 指向本工作表的 A1 单元格的链接
ws['E1'].hyperlink = Hyperlink('E1', location='A1')
wb.save('Google.xlsx')
…
ref='A1', location=None, tooltip=None, display='Bing', id='rId1', https://www.bing.com/
…
ref='A2', location='Other!B1:B4', tooltip=None, display='Other 的 B1:B4 区域', id=None, None
openpyxl 包的 Cell 对象的 hyperlink 属性仅适用于包含一个 Excel 链接的单元格
虽然在一些 Office 软件中,一个单元格可以包含多个 Excel 链接,但openpyxl
的Cell
对象的hyperlink
属性仅适用于包含一个 Excel 链接的单元格,如果单元格包含多个链接,那么hyperlink
属性会返回空值None
。
使用 Python openpyxl 包的 Cell 对象修改 Excel 链接
对于 Pythonopenpyxl
包的Cell
对象的hyperlink
属性所返回的Hyperlinks
对象,你可以通过其变量来达到修改 Excel 链接的目的。
在下面的示例中,我们修改了单元格A2
中的 Excel 链接,将其指向的单元格的地址修改为Other
工作表的A1
单元格。由于修改display
变量不会影响单元格的内容,因此需要修改Cell
对象的value
属性来更新单元格显示的信息。
# 打开 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
workbook = openpyxl.load_workbook('Link.xlsx')
worksheet = workbook['Hyperlinks']
link = worksheet['A2'].hyperlink
# 修改工具提示和指向的单元格地址
link.tooltip = '一个大概不会显示的工具提示'
link.location = 'Other!A1'
# 修改 display 不影响单元格的内容,因此修改 value 属性
worksheet['A2'].value = '指向 Other 的 A1'
link.display = '不影响单元格内容'
workbook.save('Modify.xlsx')
当 Excel 链接所在的单元格移动时需要修改对应 Hyperlink 对象的 ref 变量
openpyxl
包的Hyperlink
对象的ref
变量是含有 Excel 链接的单元格的地址,因此,当单元格移动时,Excel 链接对应的Hyperlink
对象的ref
变量应该被修改。以上工作需要由开发人员自行编写代码完成。
当然,上述现象也意味着你不能随意的修改Hyperlink
对象的ref
变量。
在下面的示例中,我们移动了单元格A1
和A2
,由于之后仅修改了D1
单元格中的链接的ref
,因此,Excel 文件Move.xlsx
中的D2
单元格中的链接将失效。
# 打开 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
workbook = openpyxl.load_workbook('Link.xlsx')
worksheet = workbook['Hyperlinks']
# 移动单元格 A1,A2 至 D1,D2
worksheet.move_range('A1:A2', cols=3)
# 修改 D1 单元格的链接的 ref
worksheet['D1'].hyperlink.ref = 'D1'
workbook.save('Move.xlsx')
使用 Python openpyxl 包的 Cell 对象移除 Excel 链接
你可以通过将 Pythonopenpyxl
包的Cell
对象的hyperlink
属性设置为None
,来移除对应 Excel 单元格中的链接,但链接的相关信息(比如,某个网址或显示文本)可能会被保留在单元格中,因为将hyperlink
设置为None
并不影响Cell
的value
属性。
在下面的例子中,虽然我们删除了单元格A1
中的链接,但 Excel 文件Remove.xlsx
的Hyperlinks
工作表的A1
单元格依然显示为Bing
。
# 打开 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
workbook = openpyxl.load_workbook('Link.xlsx')
worksheet = workbook['Hyperlinks']
# 删除 A1 单元格中的链接
worksheet['A1'].hyperlink = None
workbook.save('Remove.xlsx')
源码
src/zh/openpyxl/cells/hyperlinks·codebeatme/office-programming·GitHub