【问题标题】:How to create a hyperlink to a different Excel sheet in the same workbook如何在同一工作簿中创建指向不同 Excel 工作表的超链接
【发布时间】:2015-07-18 14:00:14
【问题描述】:

我正在使用 Python 的 openpyxl 模块,并尝试创建一个超链接,将我带到同一个 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。

【问题讨论】:

  • 为什么要链接到单元格值?您应该只链接到该范围。
  • 我删除了它,但唯一的原因是因为它有效......(因为它创建了一个超链接)。它实际上并没有把我带到另一张纸上。
  • 实际上,我把它放在那里;如果我取出'.value',我会得到错误...:'cannot serialize
  • 使用带有 Interop 或 VBA 的 .Net。问题是超链接对象中有两个属性,一个是SubAddress,另一个是AddressSubAddress 用于内部引用,openpyxl 仅写入 Address 属性。
  • XlsxWriter 模块通过write_url() 方法和internal: URI 支持到工作簿中单元格的超链接。

标签: python excel hyperlink openpyxl


【解决方案1】:

我找到了一种方法。

假设一个名为“workbookEx.xlsx”的 .xlsx 文件包含两个名为“sheet1”和“sheet2”的工作表,并且需要一个链接从“sheet1”的一个单元格(A1)到“sheet2”的另一个单元格(E5) :

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'

【讨论】:

  • 干得好!如果您只是指在包含超链接的单元格中看到的文本,只需添加: ws.cell(row=1, column=1).value = "text you want"
  • 这正是我的意思。谢谢,很简单,效果很好。
  • 如果工作表名称中有空格,则没有引号将无法工作*。例如:cell.hyperlink = '#\'my sheet name\'!E5'(* 我只尝试过单引号,它们有效)
  • 添加到@Neofish :我发现我总是必须在工作表名称周围添加单引号。原因是如果工作表名称看起来像一个单元格地址(例如:C60r1,因为 C60 是一个正确的单元格地址),那么 Excel 在后台用单引号将名称括起来。当工作表名称不需要单引号时,这些似乎没有害处。
  • 要让单元格显示为超链接,请添加ws.cell(row=1, column=1).style = "Hyperlink"
【解决方案2】:

作为 Marcus.Luck 回答的补充,如果想直接使用 Excel 的内置超链接功能,您可能需要格式化为:

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

如果没有这种格式,文件在不需要修复的情况下无法为我打开,这会在单击链接时删除单元格值。

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

【讨论】:

  • 这真的很棒。该链接没有出现下划线,但它有效!谢谢
【解决方案3】:

另一个可行的解决方案是使用 Excel 内置函数 HYPERLINK。 它不会将单元格中的值变成超链接,而是将公式放入单元格中并起到超链接的作用。

ws.cell('A1').value = '=HYPERLINK("#sheet2!E5","Link name")'

【讨论】:

    【解决方案4】:

    openpyxl 中对超链接的支持目前非常初级,很大程度上仅限于读取现有文件中的链接。

    【讨论】:

      【解决方案5】:

      除了前面的答案之外,格式化单元格使其看起来像在 Excel 中创建的超链接也很有用。为此,请使用名为“超链接”的 Excel 样式,如下例所示,其中还包括在工作表名称周围使用单引号,以防它们包含空格(如 Neofish 所述)。

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

      【讨论】:

        【解决方案6】:
        import openpyxl as opxl
        import pandas as pd
        def hyperlinking(New_file_path):
            xls = pd.ExcelFile(New_file_path)
            sheets = xls.sheet_names
            wb = opxl.load_workbook(New_file_path)
            ws = wb.create_sheet("Consolitated_Sheet")
            ws['A1'] = "Sheet_Name"; ws['B1'] = "Active_link"
            for i, j in enumerate(sheets):
                # print('A'+str(i+2) + ' value is: ' + j)
                ws['A' + str(i + 2)] = j
                ws['B' + str(i + 2)].value = '=HYPERLINK("%s", "%s")' % ('#' + str(j) + '!A1', 'Clickhere')
            wb.save(New_file_path)
            wb.close()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-18
          • 2019-02-11
          • 2017-06-14
          • 2021-05-31
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          相关资源
          最近更新 更多