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
相关产品推荐
相关产品推荐

