OpenPyXL всегда возвращает None для ячейки с гиперссылкой

(Моя конечная цель — 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.


person smwikipedia    schedule 23.01.2016    source источник


Ответы (1)


К сожалению, это ошибка.

Это ошибка в 2012 году. ..

Некоторая связанная тема:

Извлечение гиперссылок из Excel (.xlsx) с помощью Python

Некоторые детали моего эксперимента с гиперссылкой. Я использую OpenPyXL 2.3.3.

  1. Я могу добавлять гиперссылки в ячейки.
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, ВСЕ существующие гиперссылки будут потеряны. Ага!

from openpyxl import load_workbook

xlsFile='hello.xlsx'
wbook = load_workbook(xlsFile)
wbook.save(xlsFile)

Обходной путь!

Используйте формулу с OpenPyXL.

Моя цель - append clickable cells to existing XLSX file. Так как hyperlink не работает. Вместо этого я использую формулу =HYPERLINK(url, displayText). И, к счастью, формула не теряется, как в предыдущем эксперименте 3.

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. Но он явно говорит не может изменить существующий файл XLSX. Поэтому его нельзя использовать для добавления.

Я также просмотрел xlrd/xlwt/xlutils, к сожалению, если вы хотите отредактировать существующий Excel, вам нужно использовать xlrd, чтобы загрузить его как книгу только для чтения, а затем использовать xlutils, чтобы преобразовать (скопировать) ее в книгу с возможностью записи. И БАХ! во время копирования что-то будет потеряно, включая формулу HYPERLINK. Согласно строке документа, это известное ограничение:

# 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. Это еще одна причина, по которой я решил не использовать его.

person smwikipedia    schedule 23.01.2016