2013-05-21 362 views
7

我一直在寻找主要用于Excel文件操作的xlrd和openpyxl库。但是,xlrd目前不支持.xlsx文件的formatting_info=True,所以我不能使用xlrd hyperlink_map函数。所以我转向了openpyxl,但也没有运气从excel文件中提取超链接。下面的测试代码(测试文件包含一个简单的超链接设置为“测试”超链接文本谷歌):使用Python从Excel中提取超链接(.xlsx)

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)文件中提取超链接信息?

+0

Openpyxl对格式的支持是现在相当完整。超链接得不到很好支持的原因是历史,也是它们在Excel 2010规范中的实施方式,它有很多间接性。 –

+0

下面是一些使用超链接对OpenPyXl进行限制的更多实验。 http://stackoverflow.com/questions/34964255/openpyxl-always-return-none-for-a-cell-with-hyperlink/34964292#34964292 – smwikipedia

回答

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 
3

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

而且,是的,xlrd无法读取超链接没有formatting_info,目前xlsx不支持。

+1

这是2016年,有什么改变? –

+0

@ivan_bilan看起来像问题仍然是开放的,是的,3年.. – alecxe

1

一个成功的解决方案,我曾与是在服务器上安装unoconv和实施 方法是通过subprocess模块调用这个命令行工具将文件从XLSX转换为XLS,因为hyperlink_map.get()作品与xls

1

对于直接操纵Excel文件,它也值得看看优秀的XlWings库。

2

从至少版本的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 
0

相反,如果只是.hyperlink,做.hyperlink.target应该工作。在此之前,我在单元格对象上使用了“.hyperlink”,我得到了'None'。

2

这应该是可能的openpyxl现在:

import openpxyl 

wb = openpyxl.load_workbook('yourfile.xlsm') 
ws = wb.get_sheet_by_name('Sheet1') 
print(ws.cell(row=2, column=1).hyperlink.target)