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

时间:2013-05-21 18:12:48

标签: python hyperlink xlrd openpyxl

我一直在寻找用于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)文件中提取超链接信息?

8 个答案:

答案 0 :(得分:4)

现在应该可以使用openpyxl:

import openpyxl

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

答案 1 :(得分:3)

仅供参考,openpyxl的问题是实际的bug

并且,是的,xlrd无法在没有formatting_info的情况下阅读超链接,xlsx目前不支持该超链接。

答案 2 :(得分:2)

根据我的经验,获得良好的.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

答案 3 :(得分:2)

从至少版本openpyxl-2.4.0b1开始,修复了此错误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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

对于直接操作Excel文件,还值得查看优秀的XlWings库。

答案 6 :(得分:0)

如果不是 .hyperlink ,那么 .hyperlink.target 应该有效。我得到了一个没有'只使用" .hyperlink"在此之前的单元格对象上。

答案 7 :(得分:0)

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 块中使用它。因此,即使给定单元格中没有可用的超链接,它也会打印单元格中包含的内容。