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

Python如何通过openpyxl等模块读取Excel中代码生成公式的计算值

问题根本原因

openpyxl 本身不具备 Excel 公式的计算能力,仅支持读写公式、读取文件中已经由 Excel 生成的公式计算缓存值。你在代码里刚写入的公式还没有经过 Excel 引擎计算,不存在缓存值,所以直接读取只能拿到公式文本,data_only=True 参数也无效——这个参数只能读取文件保存时已经存在的计算结果缓存。


可行解决方案

方案1:Windows 环境安装了 Excel,调用 COM 接口计算(公式兼容性100%)

该方案直接调用本地 Excel 程序完成计算,不需要把文件存到本地磁盘再重新打开,计算结果和手动打开 Excel 看到的完全一致。
首先安装依赖库:

pip install pywin32

调整后的代码示例:

import openpyxl
import win32com.client as win32
from io import BytesIO

# 原有写入公式的逻辑
wb = openpyxl.load_workbook('currency.xlsx')
ws = wb['KrediGeriOdeme']
first_column = ws['B']

for x in range(2, len(first_column)):
    # 原代码里的format是多余的,公式里没有占位符可以直接赋值
    first_column[x].value = "=VLOOKUP(E:E, F3:G1500, 2, 0)"

# 将内存中的工作簿写入字节流,不需要落地到本地磁盘
virtual_workbook = BytesIO()
wb.save(virtual_workbook)
virtual_workbook.seek(0)

# 后台调用Excel完成公式计算
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False
wb_com = excel.Workbooks.Open(virtual_workbook)
wb_com.Worksheets('KrediGeriOdeme').Calculate()

# 读取计算后的结果
print(wb_com.Worksheets('KrediGeriOdeme').Range('B3').Value)

# 清理后台残留的Excel进程
wb_com.Close(SaveChanges=False)
excel.Quit()
del excel

方案2:无 Excel 环境,使用纯 Python 公式计算库

如果是 Linux/macOS 环境没有安装 Excel,可以用 xlcalculator 这类纯Python实现的Excel公式计算库,支持大部分常用公式(包含VLOOKUP)。
首先安装依赖库:

pip install xlcalculator

调整后的代码示例:

import openpyxl
from xlcalculator import ModelCompiler, Evaluator

# 原有写入公式的逻辑
wb = openpyxl.load_workbook('currency.xlsx')
ws = wb['KrediGeriOdeme']
first_column = ws['B']

for x in range(2, len(first_column)):
    first_column[x].value = "=VLOOKUP(E:E, F3:G1500, 2, 0)"

# 编译工作簿内容并计算
compiler = ModelCompiler()
model = compiler.read_and_parse_openpyxl(wb)
evaluator = Evaluator(model)

# 读取计算后的结果
print(evaluator.evaluate('KrediGeriOdeme!B3'))

注意:方案2对复杂、冷门Excel函数的兼容性不如方案1,仅用常用函数的场景可以满足需求。

内容的提问来源于stack exchange,提问作者Eren RT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:36:03