Openpyxl 1.8.5:使用openpyxl读取单元格中的公式结果

35 投票
4 回答
47115 浏览
提问于 2025-04-18 04:38

我在一个Excel表格里打印一些公式:

wsOld.cell(row = 1, column = 1).value = "=B3=B4"

但是我不能用它的结果来实现其他逻辑,因为:

if((wsOld.cell(row=1, column=1).value)='true'):
    # copy the 1st row to another sheet

即使我试着在命令行打印结果,我最后打印出来的还是公式:

>>> print(wsOld.cell(row=1, column=1))
>>> =B3=B4

我该怎么才能得到单元格里的公式结果,而不是公式本身呢?

4 个回答

4

Openpyxl这个库在计算Excel里的公式方面并不是100%支持,它只支持一些非常基础的公式。如果你想要计算工作簿里所有的公式,建议使用xlwings这个库(这个库只支持MacOS和Windows系统)。

5

我用openpyxl和pandas这两个工具结合起来解决了这个问题:

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


source_file = "Test.xlsx"
# write to file
wb = load_workbook (source_file)
ws = wb.active
ws.title = "hello world"
ws.append ([10,10])
wb.save(source_file)

# read from file
df = pd.read_excel(source_file)
sum_jan = df ["Jan"].sum() 
print (sum_jan)
10

xlwingsPyXllFlyingKoala 和 DataNitro 都是通过 Excel 来使用 Python 的工具。

如果你想用 Python 的库,可以试试 PyCelxlcalculatorFormulasSchedula

我是 xlcalculator 项目的负责人。

xlcalculator 使用 openpyxl 来读取 Excel 文件,并增加了将 Excel 公式转换为 Python 的功能。

下面是一个使用 xlcalculator 和 Excel 文件的例子:

from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator

filename = r'use_case_01.xlsm'
compiler = ModelCompiler()
new_model = compiler.read_and_parse_archive(filename)
evaluator = Evaluator(new_model)
val1 = evaluator.evaluate('First!A2')
print("value 'evaluated' for First!A2:", val1)

下面是一个使用 xlcalculator 和字典的例子:

input_dict = {
    "B4": 0.95,
    "B2": 1000,
    "B19": 0.001,
    "B20": 4,
    # B21
    "B22": 1,
    "B23": 2,
    "B24": 3,
    "B25": "=B2*B4",
    "B26": 5,
    "B27": 6,
    "B28": "=B19*B20*B22",
    "C22": "=SUM(B22:B28)",
  }

from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator

compiler = ModelCompiler()
my_model = compiler.read_and_parse_dict(input_dict)
evaluator = Evaluator(my_model)

for formula in my_model.formulae:
    print("Formula", formula, "evaluates to", evaluator.evaluate(formula))

# cells need a sheet and Sheet1 is default.
evaluator.set_cell_value("Sheet1!B22", 100)
print("Formula B28 now evaluates to", evaluator.evaluate("Sheet1!B28"))
print("Formula C22 now evaluates to", evaluator.evaluate("Sheet1!C22"))
55

openpyxl可以处理公式或者公式的计算结果。你可以在打开工作簿的时候,通过设置data_only这个选项来选择你想要的内容。不过,openpyxl并不会计算公式的结果,也不会在将来实现这个功能。有一些其他的库,比如pycel,声称可以做到这一点。

撰写回答