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

33

我正在一个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个回答

53

openpyxl 支持公式或者公式的值。当打开工作簿时,你可以使用 data_only 标记来选择其中一个。然而,openpyxl 不会计算公式结果,并且也不会计算公式结果。有一些像 pycel 这样的库声称可以完成这个任务。


19
据“openpyxl.load_workbook()”文档记录,使用“data_only=True”打开工作簿时获得的值是“Excel上次读取工作表时存储的值”。这依赖于.xls[x/m/...]文件的缓存功能(有文档记录但似乎在微软网站上找不到)。 - user948581

8

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"))

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)

3

Openpyxl不支持完全计算Excel的公式,它只支持非常基本的公式。如果您想在工作簿中计算所有公式,则应使用xlwings库(仅受支持的操作系统为MacOS和Windows)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接