You can do this with the XlsxWriter Worksheet write_url() method using the internal: URI. See the XlsxWriter docs on write_url().
You can do this with the XlsxWriter Worksheet write_url() method using the internal: URI. See the XlsxWriter docs on write_url().
To put a "Friendly Name" in the hyperlink use the string argument of write_url() method. For example, I did the following after setting the variable sheet_name, which in this case is both the name of the sheet to link to and the friendly name:
write_url(row, col, f"internal:'{sheet_name}'!A1", string=sheet_name)
I found a way to do it.
Assuming one .xlsx file named 'workbookEx.xlsx' with two sheets named 'sheet1' and 'sheet2' and needing a link from one cell(A1) of the 'sheet1' to another cell(E5) of the 'sheet2':
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)
The secret was the "#", Excel do not shows you but it uses the '#' for same file links, I just had to copy a same file link created in Excel to a Word document to see the '#'.
It is also possible to omit the filename, i.e. to link against a sheet of the active document just use: _cell.hyperlink = '#sheetName!A1'.
To name the link you just created, just set the cell value to the desired string: _cell.value = 'Linkname'.
As an addendum to Marcus.Luck's answer, if wanting to use Excel's built-in hyperlink function directly, you may need to format as:
'=HYPERLINK("{}", "{}")'.format(link, "Link Name")
Without this formatting, the file didn't open for me without needing repair, which removed the cell values when clicking the links.
e.g. ws.cell(row=1, column=1).value = '=HYPERLINK("{}", "{}")'.format(link, "Link Name")
Showing a friendly name does not seem to work with write_url()'s 'internal:...' keyword.
It does:
import xlsxwriter
wb = xlsxwriter.Workbook('Wrap.xlsx')
ws = wb.add_worksheet('Test1')
wrap = wb.add_format({'text_wrap': True})
ws.write_url('A1', 'internal:Sheet1!A1', wrap,
"A really long name here that does not wrap")
ws.write('B1', 'Bye')
wb.add_worksheet('Sheet1')
wb.close()
Output:

You can use the worksheet.write_url() method and then use worksheet.write() to add formatting and text while preserving the hyperlink.
The code below produces the wrapped text.
import xlsxwriter
wb = xlsxwriter.Workbook('Wrap.xlsx')
ws = wb.add_worksheet('Test1')
wrap = wb.add_format({'text_wrap': True})
ws.write_url('A1', 'internal:Sheet1!A1')
ws.write('A1', "A really long name here that does not wrap", wrap)
ws.write('B1', 'Bye')
wb.add_worksheet('Sheet1')
wb.close()
Expected Output:


