对于具有超链接的单元格,OpenPyXL始终返回None

时间:2016-01-23 13:48:55

标签: xlrd openpyxl xlwt xlsxwriter xlutils

(我的最终目的是append clickable cells to existing XLSX。)

我使用下面的代码来提取单元格的显示值和超链接。

from openpyxl import load_workbook

xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wsheet1= wbook.get_sheet_by_name('mysheet')
cell1 = wsheet1.cell('A1')

print cell1.value
print cell1.hyperlink
print wsheet1['A1'].value
print wsheet1['A1'].hyperlink

但它返回以下内容:

URL1
None
URL1
None

为什么hyperlink总是None?我确实手动为单元格A1添加超链接,超链接在Excel 2013中工作。

1 个答案:

答案 0 :(得分:1)

不幸的是,这是一个错误。

2012年是bug ......

一些相关主题:

Extracting Hyperlinks From Excel (.xlsx) with Python

我的超链接实验的一些细节。我正在使用OpenPyXL 2.3.3

  1. 我可以向单元格添加超链接
  2. from openpyxl import load_workbook
    
    xlsFile='hello.xlsx'
    wbook = load_workbook(xlsFile)
    wsheet1= wbook.get_sheet_by_name('mysheet')
    cell1 = wsheet1.cell('A1')
    cell1.hyperlink = r'http://www.example.com'
    cell1.value=r'XXX'
    wbook.save(xlsFile)
    
    1. 但我不能加载XLSX文件并阅读超链接就像我的问题所说的那样。

    2. 如果我只是加载并重新保存XLSX文件,则所有现有的超链接都将丢失。 呀!

    3. from openpyxl import load_workbook
      
      xlsFile='hello.xlsx'
      wbook = load_workbook(xlsFile)
      wbook.save(xlsFile)
      

      解决方法!

      Use the formula with OpenPyXL

      我的目的是append clickable cells to existing XLSX file。由于hyperlink不起作用。我改为使用公式=HYPERLINK(url, displayText)。幸运的是,公式并没有像以前的实验那样丢失。

      from openpyxl import load_workbook
      
      xlsFile='hello.xlsx'
      wbook = load_workbook(xlsFile)
      wsheet1= wbook.get_sheet_by_name('mysheet')
      cell1 = wsheet1.cell('A2')
      cell1.value=r'=HYPERLINK("http://www.example.com","XXX")'
      wbook.save(xlsFile)
      

      我试过的其他(失败的)选项:

      我调查了XlsxWriter。但它明确地说it cannot modify existing XLSX file。所以它不能用于追加。

      我还查看了xlrd/xlwt/xlutils,遗憾的是,如果要编辑现有的Excel,则必须使用xlrd将其作为只读工作簿加载,然后使用xlutils转换(复制)它进入一个可写的工作簿。而且好!在复制过程中,会丢失一些包含HYPERLINK公式的内容。根据其doc字符串,这是一个已知的限制:

      # Copyright (c) 2009-2012 Simplistix Ltd
      #
      # This Software is released under the MIT License:
      # http://www.opensource.org/licenses/mit-license.html
      # See license.txt for more details.
      
      from xlutils.filter import process,XLRDReader,XLWTWriter
      
          def copy(wb):
              """
              Copy an :class:`xlrd.Book` into an :class:`xlwt.Workbook` preserving as much
              information from the source object as possible.
      
              See the :doc:`copy` documentation for an example.
              """
              w = XLWTWriter()
              process(
                  XLRDReader(wb,'unknown.xls'),
                  w
                  )
              return w.output[0][1]
      

      而且,xlwt不支持XLSX,只支持XLS。这是我决定不使用它的另一个原因。