使用Python从Excel(.xlsx)中提取超链接

18

我一直在研究Excel文件处理的xlrd和openpyxl库。然而,xlrd目前不支持.xlsx文件的formatting_info=True,所以我无法使用xlrd的hyperlink_map函数。因此我转向了openpyxl,但是我也没有成功从Excel文件中提取超链接。下面是测试代码(测试文件包含一个指向谷歌的简单超链接,超链接文本设置为“test”):

import openpyxl

wb = openpyxl.load_workbook('testFile.xlsx')

ws = wb.get_sheet_by_name('Sheet1')

r = 0
c = 0

print ws.cell(row = r, column = c). value
print ws.cell(row = r, column = c). hyperlink
print ws.cell(row = r, column = c). hyperlink_rel_id

输出:

test

None

我猜openpyxl目前也不完全支持格式化?有没有其他库可以用来提取Excel(.xlsx)文件中的超链接信息?


Openpyxl对格式的支持现在非常完整。超链接不太受支持的原因是历史原因以及它们在Excel 2010规范中实现的方式,这种方式具有很多间接性。 - Charlie Clark
这里有一些关于OpenPyXl超链接限制的实验。http://stackoverflow.com/questions/34964255/openpyxl-always-return-none-for-a-cell-with-hyperlink/34964292#34964292 - smwikipedia
这里有多个答案,但是使用openpyxl Python包时,必须将“read_only”参数设置为False(或者保持空白,因为它是构造函数中的默认参数值),才能提取cell.hyperlink对象...wb_source = openpyxl.load_workbook(filename, read_only=True) - Entree
8个回答

30

您可以使用openpyxl实现这一点:

import openpyxl

wb = openpyxl.load_workbook('yourfile.xlsm')
ws = wb['Sheet1']
# This will fail if there is no hyperlink to target
print(ws.cell(row=2, column=1).hyperlink.target)

1
我认为这应该是被接受的答案。一行代码完美地实现了预期效果。 - Ben Jones
超链接目标可能无法正常工作。打印(ws.cell(2,1).value) - sunnyinho

4

从openpyxl-2.4.0b1版本开始,这个bug已经得到了修复:https://bitbucket.org/openpyxl/openpyxl/issue/152/hyperlink-returns-empty-string-instead-of。现在单元格中的超链接对象将能够正确返回内容。

hl_obj = ws.row(col).hyperlink  # getting Hyperlink object for Cell
#hl_obj = ws.cell(row = r, column = c).hyperlink This could be used as well.
if hl_obj:
    print(hl_obj.display)
    print(hl_obj.target)
    print(hl_obj.tooltip) # you can see it when hovering mouse on hyperlink in Excel
    print(hl_obj) # to see other stuff if you need

3

提醒一下,openpyxl存在一个实际的bug问题。

同时,xlrd不能读取没有formatting_info的超链接,而目前xlsx不支持此项功能。


2
这是2016年,有什么变化吗? - Ivan Bilan
如果我能找到GitHub存储库,我会在今天发布的软件错误问题下面发表评论并提出修复建议。 - Entree
由于旧的代码库不可用,有人创建了一个克隆版本。https://github.com/ericgazoni/openpyxl - Entree

1
根据我的经验,想要获得良好的.xlsx交互体验需要转向IronPython。这样可以使用公共语言运行时(clr)并直接与Excel进行交互。

http://ironpython.net/

import clr
clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel
excel = Excel.ApplicationClass()

wb = excel.Workbooks.Open('testFile.xlsx')
ws = wb.Worksheets['Sheet1']

address = ws.Cells(row, col).Hyperlinks.Item(1).Address

使用IronPython需要安装他们的Python发行版,对吧?我从来没有尝试过,因为我一直使用其他发行版,比如pythonxy、anaconda和纯Python安装。 - wordsforthewise

1
我曾使用过的成功解决方案是在服务器上安装unoconv并实现一种方法,通过subprocess模块调用此命令行工具将文件从xlsx转换为xls,因为hyperlink_map.get()xls兼容。

1

如果需要直接操作Excel文件,值得看看优秀的XlWings库。


1
import openpyxl

wb = openpyxl.load_workbook('yourfile.xlsx')
ws = wb['Sheet1']

try:
    print(ws.cell(row=2, column=1).hyperlink.target)

#This fail if their is no hyperlink
except:
    print(ws.cell(row=2, column=1).value)

为了处理异常 'message': "'NoneType' object has no attribute 'target'",我们可以在try/except块中使用它。因此,即使给定单元格中没有可用的超链接,它也会打印该单元格中包含的内容。

0

如果使用.hyperlink.target而不是只用.hyperlink,也可以起作用。在此之前,我只使用".hyperlink"在单元格对象上得到了一个'None'。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接