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

