Python读取Excel单元格中PDF超链接实际文件路径失败的问题
Python读取Excel单元格中PDF超链接实际文件路径失败的问题
你遇到的这个问题我之前也碰到过,大概率是因为你的Excel单元格里的超链接是用HYPERLINK函数创建的(比如=HYPERLINK("实际路径", "001")这种形式),而不是直接右键插入的超链接。openpyxl在处理这种函数生成的超链接时,cell.hyperlink.target并不会返回实际的文件路径,反而会把函数里设置的显示文本(也就是"001"对应的数值1.0)返回给你,这就是你看到奇怪输出的原因。
给你两个可行的解决方案:
方案一:用xlwings读取(更简单可靠)
既然你已经导入了xlwings,不如直接用它来读取,因为xlwings是调用Excel的原生API来操作的,不管超链接是函数创建的还是直接插入的,都能准确获取到实际路径。修改后的代码如下:
import xlwings as xw path = r"C:\Users\JCP2\demo\demo.xlsm" # 打开Excel文件(会启动Excel进程,用完自动关闭) with xw.Book(path) as wb: ws = wb.sheets["Sheet1"] # 获取第2行第1列单元格的超链接地址 file_path = ws.range(2, 1).hyperlink.address print(file_path)
运行这段代码应该就能得到你想要的PDF文件路径了。
方案二:用openpyxl解析HYPERLINK公式(如果你坚持用openpyxl)
如果不想切换库,那我们可以手动解析单元格里的HYPERLINK函数,提取出里面的文件路径。代码示例如下:
import openpyxl path = r"C:\Users\JCP2\demo\demo.xlsm" wb = openpyxl.load_workbook(path) ws = wb["Sheet1"] cell = ws.cell(2, 1) file_path = None # 判断单元格是否是HYPERLINK公式 if cell.data_type == 'f' and cell.value.startswith('=HYPERLINK('): # 去掉公式前后的=HYPERLINK(和),然后分割成路径和显示文本两部分 formula_content = cell.value[11:-1] # 按第一个逗号分割,避免路径里有逗号的情况 path_part, _ = formula_content.split(',', 1) # 去掉路径两边的引号 file_path = path_part.strip('"') if file_path: print(file_path) else: # 处理直接插入的超链接情况 if cell.hyperlink: print(cell.hyperlink.target) else: print("该单元格没有超链接")
这个方法会先判断单元格是不是HYPERLINK公式,然后手动提取路径部分,同时也兼容直接插入的超链接场景。
备注:内容来源于stack exchange,提问作者Jon Percival




