如何使用 openpyxl 处理 Excel 链接?Hyperlink 对象介绍
关注 1800
阅读本节的前提是已经了解 Excel 单元格对象Cell,你可以查看如何使用 openpyxl 处理 Excel 单元格?Cell 对象介绍一节来获取相关信息。
openpyxl Excel 链接对象 Hyperlink
openpyxl包中的Hyperlink类,属于模块openpyxl.worksheet.hyperlink,用于表示 Excel 单元格中的链接。
什么是 Excel 链接?
Excel 链接类似于网页中的超链接,当你点击他们时,Office 软件会通过浏览器打开某个网址,或者定位至某个工作表的单元格或区域,采取哪种操作取决于 Excel 链接的设置。
创建 Excel 链接
使用Hyperlink对象的构造器,你可以创建新的 Excel 链接,这些链接可被设置到工作表的某个单元格中。
Hyperlink(ref=None, location=None, tooltip=None, display=None, id=None, target=None)
- ref 参数
ref参数是一个字符串,表示含有链接的单元格的地址,比如'A1'。通过该参数赋值的ref变量,可能会被openpyxl修改,因此,这里的ref参数是无关紧要的,如果开发人员自行创建Hyperlink对象的话。- location 参数
location参数是一个字符串,表示链接指向的单元格或区域的地址,其格式为worksheet!address(比如,SheetB!A1),其中worksheet为工作表名称,address为地址,如果指向的是本工作表中的单元格或区域,则worksheet和!可以省去(比如,A1:B2)。- tooltip 参数
tooltip参数是一个字符串,他表示链接对应的工具提示。需要说明的是,即便设置了tooltip,一些 Office 软件也不会按照tooltip给出的值来显示工具提示。- display 参数
display参数是一个字符串,他表示链接在其对应的单元格中应该显示的文本,需要指出,单元格中最终显示的内容是由Cell对象的value属性来决定的。- id 参数
id参数是一个字符串,用于标识链接。如果链接对应的target变量不为None,那么通过参数id赋值的id变量,可能会被openpyxl包在保存 Excel 文件时修改,当id变量为None,或者id变量的值不符合要求时。- target 参数
target参数是一个字符串,他可能是某个网络地址(比如,以http,https,mailto开头的地址),或者是某个 Excel 文件的路径(可以是相对路径或绝对路径)。
在读取 Excel 文件时,openpyxl包会创建链接对象Hyperlink。如果链接并未指向单元格或区域,那么Hyperlink对象的location变量可能为 Python 空值None。如果链接指向单元格或区域,那么Hyperlink对象的id变量可能为 Python 空值None。如果链接指向本工作表中的单元格或区域,那么Hyperlink对象的target变量可能为 Python 空值None。
Hyperlink 对象的变量
Hyperlink对象拥有变量ref,location,tooltip,display,id和target,在未作出修改时,他们的值与传递给Hyperlink构造器的实参的值相同。
获取和设置 Excel 链接
Cell对象的hyperlink属性,可用于获取或设置 Excel 单元格中的链接。hyperlink属性的返回值是一个Hyperlink对象,如果单元格未包含链接,则Cell对象的hyperlink属性返回空值None。
cell.hyperlink
cell.hyperlink = link
- link 值
link是一个表示链接的Hyperlink对象,或者是一个表示链接目标的字符串(他将对应Hyperlink对象的target变量),比如'https://www.bing.com/'。要移除单元格中的链接,link应该为空值None。
Hyperlink 对象的 display 变量可能不会影响 Cell 对象的 value 属性
当你通过Cell对象的hyperlink属性来设置链接时,给出的Hyperlink对象的display变量无法影响单元格的值,即便是空单元格,Cell对象也仅会将Hyperlink对象的target或location变量的值设置为单元格的内容。
在 Excel 文件Link.xlsx的工作表Hyperlinks中,单元格A1拥有指向https://www.bing.com/的链接,单元格A2拥有指向工作表Other的区域B1:B4的链接。
我们为单元格B1设置了新的链接,虽然给出了参数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, NoneCell 对象的 hyperlink 属性仅适用于包含一个链接的单元格
虽然在一些 Office 软件中,一个单元格可以包含多个链接,但Cell对象的hyperlink属性仅适用于包含一个链接的单元格,如果单元格包含多个链接,那么hyperlink属性会返回空值None。
修改 Excel 链接
对于Cell对象的hyperlink属性所返回的Hyperlinks对象,你可以通过其变量来达到修改 Excel 链接的目的。
在下面的示例中,我们修改了单元格A2中的链接,将其指向的单元格的地址修改为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')当链接所在的单元格移动时需要修改对应 Hyperlink 对象的 ref 变量
Hyperlink对象的ref变量是含有链接的单元格的地址,因此,当单元格移动时,链接对应的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')移除 Excel 链接
你可以通过将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