Extraer hipervínculos de Excel (.xlsx) con Python

He estado buscando sobre todo las bibliotecas xlrd y openpyxl para la manipulación de archivos de Excel. Sin embargo, actualmente xlrd no admite formatting_info=True para archivos .xlsx, por lo que no puedo usar la función xlrd hyperlink_map . Así que recurrí a openpyxl, pero tampoco tuve la suerte de extraer un hipervínculo de un archivo de Excel con él. Código de prueba a continuación (el archivo de prueba contiene un hipervínculo simple a google con el texto del hipervínculo establecido en “prueba”):

 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 

Salida:

 test None 

¿Supongo que openpyxl actualmente no admite el formato completamente tampoco? ¿Hay alguna otra biblioteca que pueda usar para extraer información de hipervínculos de archivos de Excel (.xlsx)?

En mi experiencia, conseguir una buena interacción .xlsx requiere moverme a IronPython. Esto le permite trabajar con Common Language Runtime (clr) e interactuar directamente con 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 

Para su información, el problema con openpyxl es un error real.

Y, sí, xlrd no puede leer el hipervínculo sin formatting_info , que actualmente no es compatible con xlsx .

Esto debería ser posible con openpyxl ahora:

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

A partir de al menos la versión openpyxl-2.4.0b1, se corrigió este error https://bitbucket.org/openpyxl/openpyxl/issue/152/hyperlink-returns-empty-string-instead-of . Ahora es el retorno para el objeto de hipervínculo de celda:

 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 

Una solución exitosa con la que he trabajado es instalar unoconv en el servidor e implementar un método que invoque esta herramienta de línea de comandos a través del módulo de subproceso para convertir el archivo de xlsx a xls ya que hyperlink_map.get () funciona con xls .

Para la manipulación directa de archivos Excel, también vale la pena mirar la excelente biblioteca XlWings .

Si en lugar de simplemente .hyperlink , hacer .hyperlink.target debería funcionar. Antes de eso estaba obteniendo un ‘Ninguno’ por usar solo “.hyperlink” en el objeto de la celda.