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

求助:Pandas读取Excel超链接返回None,合并文件异常

解决Pandas+openpyxl提取Excel超链接返回None的问题

问题根源

Pandas的read_excel默认仅读取单元格的显示值或公式文本,不会加载单元格的超链接属性;对于=HYPERLINK()公式生成的链接,Pandas也不会自动解析公式中的目标地址,导致目标列返回None。

解决方案

通过openpyxl直接操作Excel工作簿,分别处理手动插入的内置超链接和HYPERLINK公式生成的链接,再整理为DataFrame合并,最后用openpyxl写入保留超链接。

步骤1:导入依赖库

import os
import re
import pandas as pd
from openpyxl import load_workbook, Workbook

步骤2:编写提取超链接的函数

该函数兼容两种超链接类型,同时记录文件名、工作表名、显示文本和链接地址:

def extract_hyperlinks(file_path, target_col):
    # 加载工作簿,data_only=False保留公式
    wb = load_workbook(file_path, data_only=False)
    data = []
    # 匹配HYPERLINK公式的正则
    link_pattern = re.compile(r'=HYPERLINK\("([^"]+)"(?:, "([^"]+)")?\)')
    
    col_idx = ord(target_col.upper()) - ord('A')  # 转换列字母为索引
    
    for ws in wb.worksheets:
        # 从第2行开始遍历(假设第1行是表头)
        for row in ws.iter_rows(min_row=2):
            cell = row[col_idx]
            hyperlink = None
            display_text = cell.value
            
            # 处理手动插入的内置超链接
            if cell.hyperlink:
                hyperlink = cell.hyperlink.target
            # 处理HYPERLINK公式生成的链接
            elif isinstance(display_text, str) and display_text.startswith('=HYPERLINK('):
                match = link_pattern.match(display_text)
                if match:
                    hyperlink = match.group(1)
                    # 公式中有显示文本则替换
                    if match.group(2):
                        display_text = match.group(2)
            
            data.append({
                '文件名': os.path.basename(file_path),
                '工作表': ws.title,
                '显示文本': display_text,
                '超链接地址': hyperlink
            })
    return pd.DataFrame(data)

步骤3:遍历目录提取并合并数据

INPUT_DIR = "./你的输入目录路径"
all_data = []

# 遍历目录下所有xlsx文件
for filename in os.listdir(INPUT_DIR):
    if filename.lower().endswith('.xlsx'):
        file_path = os.path.join(INPUT_DIR, filename)
        # 替换为你的目标列(如'B')
        df = extract_hyperlinks(file_path, target_col='B')
        all_data.append(df)

# 合并所有DataFrame
merged_df = pd.concat(all_data, ignore_index=True)

步骤4:保存合并结果并保留超链接

直接用Pandas的to_excel无法保留超链接,需用openpyxl手动写入:

def save_with_hyperlinks(df, output_path):
    wb = Workbook()
    ws = wb.active
    
    # 写入表头
    ws.append(df.columns.tolist())
    
    # 获取列索引
    display_col_idx = df.columns.get_loc('显示文本') + 1
    link_col_idx = df.columns.get_loc('超链接地址') + 1
    
    # 写入数据并设置超链接
    for row_num, (_, row) in enumerate(df.iterrows(), start=2):
        # 写入整行数据
        ws.append(row.tolist())
        # 设置显示文本单元格的超链接
        display_cell = ws.cell(row=row_num, column=display_col_idx)
        link = row['超链接地址']
        if link:
            display_cell.hyperlink = link
            display_cell.style = 'Hyperlink'  # 应用超链接样式
    
    wb.save(output_path)

# 保存合并后的文件
save_with_hyperlinks(merged_df, "./合并后的超链接文件.xlsx")

关键注意事项

  • 确保目标列参数target_col为正确的列字母(如'A'、'B')
  • 若Excel表头不是第1行,需调整iter_rows的min_row参数
  • 相对路径超链接会被原样保留,打开时会基于输出文件的路径解析

内容的提问来源于stack exchange,提问作者Hugh Ricardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:53:14