Как создать гиперссылку на другой лист Excel в той же книге

Я использую модуль openpyxl для Python и пытаюсь создать гиперссылку, которая приведет меня на другую вкладку в той же книге Excel. Выполнение чего-то похожего на следующее создает гиперссылку; однако, когда я нажимаю на него, он говорит мне, что не может открыть файл.

from openpyxl import Workbook

wb = Workbook()
first_sheet = wb.create_sheet(title='first')
second_sheet = wb.create_sheet(title='second')

first_sheet['A1'] = "hello"
second_sheet['B2'] = "goodbye"

link_from = first_sheet['A1']
link_to = second_sheet['B2'].value

link_from.hyperlink = link_to

wb.save("C:/somepath/workbook.xlsx")

Я предполагаю, что проблема заключается в значении 'link_to'; однако я не знаю, что нужно было бы изменить или какой путь мне пришлось бы написать.

Я использую Python 2.7.6 и Excel 2013.


person user2869231    schedule 07.05.2015    source источник
comment
Почему вы ссылаетесь на значение ячейки? Вы должны ссылаться только на диапазон.   -  person Mr. Mascaro    schedule 07.05.2015
comment
Я удалил это, но единственная причина была в том, что это сработало... (поскольку в нем была создана гиперссылка). Это просто не приводит меня к другому листу.   -  person user2869231    schedule 07.05.2015
comment
на самом деле, я держу его там; если я беру «.value», я получаю сообщение об ошибке...: «невозможно сериализовать ‹Cell second.B2› ‹type Cell›   -  person user2869231    schedule 07.05.2015
comment
Из исходного кода видно, что .hyperlink предназначен только для внешних ссылок в openpyxl.   -  person Mr. Mascaro    schedule 07.05.2015
comment
ну, это был бы облом ... вы знаете что-нибудь вокруг этого?   -  person user2869231    schedule 07.05.2015
comment
Используйте .Net с Interop или VBA. Проблема в том, что в объекте гиперссылки есть два свойства: одно — SubAddress, а другое — Address. SubAddress используется для внутренних ссылок, а openpyxl записывается только в свойство Address.   -  person Mr. Mascaro    schedule 07.05.2015
comment
Думаю, это имеет смысл. Я не думаю, что буду добавлять гиперссылки. Я добавил достаточно внешних инструментов как есть. Спасибо.   -  person user2869231    schedule 07.05.2015
comment
Модуль XlsxWriter поддерживает гиперссылки на ячейки книги через write_url() и internal: URI.   -  person jmcnamara    schedule 08.05.2015


Ответы (5)


Поддержка гиперссылок в openpyxl в настоящее время находится в зачаточном состоянии и в основном ограничивается чтением ссылок в существующих файлах.

person Charlie Clark    schedule 08.05.2015

Я нашел способ сделать это.

Предположим, что один файл .xlsx с именем «workbookEx.xlsx» содержит два листа с именами «лист1» и «лист2» и нуждается в ссылке из одной ячейки. (A1) "лист1" в другую ячейку (E5) "лист2":

from openpyxl import load_workbook

wb = load_workbook(workbookEx.xlsx) 
ws = wb.get_sheet_by_name("sheet1")

link = "workbookEx.xlsx#sheet2!E5"

ws.cell(row=1, column=1).hyperlink = (link)

Секрет был «#», Excel не показывает вас, но использует «#» для тех же ссылок на файлы, мне просто нужно было скопировать ту же ссылку на файл, созданную в Excel, в документ Word, чтобы увидеть «#».

Также можно опустить имя файла, т.е. для ссылки на лист активного документа просто используйте: _cell.hyperlink = '#sheetName!A1'.

Чтобы назвать ссылку, которую вы только что создали, просто установите значение ячейки в нужную строку: _cell.value = 'Linkname'.

person lomelisan    schedule 24.08.2015
comment
Хорошая работа! И если вы просто имеете в виду текст, который вы видите в ячейке, содержащей гиперссылку, просто добавьте: ws.cell(row=1, column=1).value = текст, который вы хотите - person user2869231; 25.08.2015
comment
Именно это я и имел в виду. Спасибо, просто и работает очень хорошо. - person lomelisan; 31.08.2015
comment
Если имя листа содержит пробелы, оно не будет работать без кавычек*. Например: cell.hyperlink = '#\'my sheet name\'!E5' (* Я пробовал только одинарные кавычки, и они работают) - person Neofish; 15.07.2019
comment
Добавление в @Neofish: я обнаружил, что всегда должен добавлять одинарные кавычки вокруг имени листа. Причина в том, что если имя листа выглядит как адрес ячейки (например, C60r1, потому что C60 — правильный адрес ячейки), то Excel за кулисами заключает имя в одинарные кавычки. Кажется, они не причиняют вреда, когда имя листа не нуждается в одинарных кавычках. - person Marc Meketon; 01.10.2020
comment
Чтобы ячейка отображалась как гиперссылка, добавьте ws.cell(row=1, column=1).style = "Hyperlink" - person Marc Meketon; 01.10.2020

В качестве дополнения к ответу Marcus.Luck, если вы хотите напрямую использовать встроенную функцию гиперссылки Excel, вам может потребоваться отформатировать как:

'=HYPERLINK("{}", "{}")'.format(link, "Link Name")

Без этого форматирования файл не открывался у меня без необходимости восстановления, которое удаляло значения ячеек при переходе по ссылкам.

e.g. ws.cell(row=1, column=1).value = '=HYPERLINK("{}", "{}")'.format(link, "Link Name")

person Phillip    schedule 06.03.2017
comment
это действительно отлично. Ссылка не подчеркнута, но работает! спасибо - person Jean-François Fabre; 15.11.2017

Другим рабочим решением является использование встроенной в Excel функции ГИПЕРССЫЛКА. Он не превращает значение в ячейке в гиперссылку, а помещает формулу в ячейку и действует как гиперссылка.

ws.cell('A1').value = '=HYPERLINK("#sheet2!E5","Link name")'
person Marcus.Luck    schedule 12.03.2016

В дополнение к предыдущим ответам также полезно отформатировать ячейку, чтобы она выглядела как гиперссылки, созданные в Excel. Для этого используйте стиль Excel с именем «Гиперссылка», как показано в примере ниже, который также включает использование одинарных кавычек вокруг имен листов, если они содержат пробелы (как указано Neofish).

cell(row, col).value = '=HYPERLINK("#\'{}\'!A1", "{}")'.format(sheet_name_with_spaces, "Link Name")
cell(row, col).style = 'Hyperlink'
person rosshug    schedule 17.06.2020