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

如何用openpyxl正确读取跨工作簿的单元格引用公式?

解决openpyxl读取Excel跨工作簿引用时路径被替换的问题

当你用openpyxl读取包含跨工作簿引用的Excel文件时,出现=B2 + '[1]Sheet1'!$B$1这类占位符式引用,是因为openpyxl在加载主工作簿时,若对应的外部工作簿未被加载或无法访问,会自动将外部文件路径替换为[索引]格式的占位符。以下是两种可行的解决方法:

方法一:同时加载关联的外部工作簿

如果外部工作簿文件可正常访问,可在加载主工作簿前先加载外部文件,让openpyxl自动解析完整的引用路径:

import pandas as pd
from openpyxl import load_workbook

# 先加载外部工作簿(路径需替换为实际文件路径)
external_wb = load_workbook(r'C:\path\to\file\example2.xlsx')
# 加载主工作簿
main_wb = load_workbook('example1.xlsx', data_only=False)
sheet = main_wb[sheet_name]

# 直接读取单元格公式,此时会保留原始跨工作簿路径
data = []
for row in sheet.iter_rows(values_only=False):
    row_data = [cell.formula if cell.data_type == 'f' else cell.value for cell in row]
    data.append(row_data)

df = pd.DataFrame(data)

方法二:手动映射外部链接替换占位符

若无法加载外部工作簿,可通过主工作簿的external_links属性获取外部文件的实际路径,再替换公式中的占位符:

import pandas as pd
from openpyxl import load_workbook

main_wb = load_workbook('example1.xlsx', data_only=False)
sheet = main_wb[sheet_name]

# 构建占位符与实际路径的映射表
external_map = {}
for idx, link in enumerate(main_wb.external_links, start=1):
    # 提取外部工作簿路径,不同Excel版本可能需调整属性获取方式
    if hasattr(link, 'target'):
        # 还原Excel公式中路径的格式(带单引号和方括号)
        full_path = f"'{link.target}'"
        external_map[f'[{idx}]'] = full_path

# 遍历单元格处理公式
data = []
for row in sheet.iter_rows(values_only=False):
    row_data = []
    for cell in row:
        if cell.data_type == 'f':
            formula = cell.formula
            # 替换所有占位符
            for placeholder, actual_path in external_map.items():
                formula = formula.replace(placeholder, actual_path)
            row_data.append(formula)
        else:
            row_data.append(cell.value)
    data.append(row_data)

df = pd.DataFrame(data)

注意:部分Excel文件的外部链接路径可能存储在link.file_link.target等其他属性下,若上述代码无法正确获取路径,可打印main_wb.external_links的结构来调整属性访问逻辑。

内容的提问来源于stack exchange,提问作者Brayan Muñoz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:30:19