Openpyxl执行delete_rows()后超链接未同步移动问题如何解决?
openpyxl删除行时超链接不同步问题的解决方法
问题原因
openpyxl原生的delete_rows()方法仅会同步更新单元格的数值、样式等基础属性,并不会同步调整工作表中存储的超链接对象的坐标,所以删除行后,后续行上移时超链接仍停留在原来的坐标位置,导致值和超链接不匹配。
解决方案
我们可以封装自定义的删除行方法,在调用原生删除行逻辑后,手动修正所有受影响的超链接坐标:
def delete_rows_with_hyperlink(ws, row_idx, amount=1): """ 支持超链接同步偏移的删除行方法 :param ws: openpyxl工作表对象 :param row_idx: 要删除的起始行号 :param amount: 要删除的连续行数,默认删除1行 """ # 执行原生删除行逻辑 ws.delete_rows(row_idx, amount) # 遍历所有超链接,调整受影响的坐标 for hyperlink in ws._hyperlinks: link_row = hyperlink.ref.row # 仅调整位于被删行之后的超链接 if link_row >= row_idx: hyperlink.ref.row = link_row - amount
使用示例
将原有代码中的原生delete_rows调用替换为上述自定义方法即可:
from openpyxl import load_workbook destExcelName = r'd:\Temp\hello.xlsx' wb = load_workbook(destExcelName) ws = wb.active # 构造测试数据 ws['A1'].value = 'Google' ws['A1'].hyperlink = 'https://www.google.com' ws['A1'].style = 'Hyperlink' ws['A2'].value = 'Apple' ws['A2'].hyperlink = 'https://www.apple.com/' ws['A2'].style = 'Hyperlink' ws['A3'].value = 'StackOverflow' ws['A3'].hyperlink = 'https://stackoverflow.com' ws['A3'].style = 'Hyperlink' # 调用自定义方法删除第2行 delete_rows_with_hyperlink(ws, 2) wb.save(destExcelName) wb.close()
补充说明
- 如果需要处理删除列的场景,逻辑完全一致,只需要将上述代码中的行坐标判断修改为列坐标判断、调整
hyperlink.ref.col即可。 - 方案中用到的
_hyperlinks是openpyxl工作表的内置属性,目前所有公开稳定版本均支持该属性,可正常使用。
内容的提问来源于stack exchange,提问作者Eric Sun
相关产品推荐
相关产品推荐

