You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas读写含本地文件夹超链接的Excel表格问题

如何在Pandas DataFrame中保留Excel的本地超链接

嘿,这个问题我之前处理Excel数据时也踩过坑!默认情况下pd.read_excel()确实只会读取单元格的显示文本,不会把超链接这类附加属性带进来,但咱们完全有办法解决——核心思路是用专门的Excel处理库(比如openpyxl)先手动提取超链接信息,再构建DataFrame,导出时再把超链接写回去。

第一步:读取Excel时提取超链接

我们需要用openpyxl来加载工作簿,因为它能直接访问单元格的超链接属性。先确保你已经安装了它:

pip install openpyxl

然后用下面的代码提取数据,包括显示文本和超链接:

import pandas as pd
from openpyxl import load_workbook

# 加载Excel文件,注意data_only=False才能读取超链接(默认就是False,但最好显式指定)
wb = load_workbook('你的Excel文件路径.xlsx', data_only=False)
ws = wb['Sheet1']  # 替换成你的工作表名称

# 先定位"Archive"列的位置
archive_col_idx = None
for col in ws.iter_cols(min_row=1, max_row=1):  # 遍历表头行
    if col[0].value == 'Archive':
        archive_col_idx = col[0].column - 1  # 转成0-based索引,方便后续遍历行时使用
        break

# 提取所有行的数据:包含Archive的显示文本、超链接,以及其他列
data_rows = []
for row in ws.iter_rows(min_row=2):  # 从第二行开始,跳过表头
    # 获取Archive列的单元格
    archive_cell = row[archive_col_idx]
    # 提取显示文本和超链接目标
    display_text = archive_cell.value
    hyperlink = archive_cell.hyperlink.target if archive_cell.hyperlink else None
    
    # 收集当前行的所有数据:这里根据你的表格结构调整其他列的提取
    row_data = {
        'Archive': display_text,  # 保留原列名,后续导出时用来显示
        'Archive_Link': hyperlink,  # 单独存超链接地址,方便后续写入
        # 示例:提取其他列,比如第1列是"站点名称",第2列是"城市"
        '站点名称': row[0].value,
        '城市': row[1].value
    }
    data_rows.append(row_data)

# 构建DataFrame
df = pd.DataFrame(data_rows)

现在你的DataFrame里就同时有了超链接的显示文本和对应的链接地址,后续更新数据时也能保留这两个字段。

第二步:导出Excel时恢复超链接

如果直接用df.to_excel()导出,还是只会显示文本,所以需要用xlsxwriter引擎来手动设置超链接。先安装xlsxwriter:

pip install xlsxwriter

然后用下面的代码导出,把超链接写回Excel:

# 创建Excel写入器,指定xlsxwriter引擎
writer = pd.ExcelWriter('更新后的文件.xlsx', engine='xlsxwriter')
df.to_excel(writer, index=False, sheet_name='Sheet1')

# 获取工作簿和工作表对象
workbook = writer.book
worksheet = writer.sheets['Sheet1']

# 设置超链接的格式(蓝色下划线,和Excel默认超链接样式一致)
hyperlink_format = workbook.add_format({
    'font_color': '#0000FF',
    'underline': 1
})

# 找到Archive列和Archive_Link列的索引(xlsxwriter用1-based索引)
archive_col = df.columns.get_loc('Archive') + 1
archive_link_col = df.columns.get_loc('Archive_Link') + 1

# 遍历数据行,给Archive列的单元格设置超链接
for row_num in range(2, len(df) + 2):  # 表头在第1行,数据从第2行开始
    # 获取当前行的显示文本和链接
    display_text = df.iloc[row_num - 2]['Archive']
    link = df.iloc[row_num - 2]['Archive_Link']
    
    if link:  # 如果有超链接,就设置
        # write_url(行号, 列号, 链接地址, 格式, 显示文本)
        worksheet.write_url(row_num - 1, archive_col - 1, link, hyperlink_format, display_text)

# 隐藏用来存链接的Archive_Link列(可选,如果你不想让用户看到这个列)
worksheet.set_column(archive_link_col - 1, archive_link_col - 1, None, None, {'hidden': True})

# 保存文件
writer.close()

为什么默认的pd.read_excel做不到?

因为pandas读取Excel时,默认只提取单元格的“值”(也就是你看到的显示文本),而超链接属于单元格的属性信息,不是值的一部分,所以需要用openpyxl这类底层库去访问这些属性。

对于几千条记录的表格,这个方法完全够用,openpyxl的遍历效率处理几千行数据毫无压力。

内容的提问来源于stack exchange,提问作者Create Tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:07:42