gpt4 book ai didi

Python 3.4 : Unable to read value from Excel Formula

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:38 28 4
gpt4 key购买 nike

我尝试使用 Python 3.4 获取 Excel 文件的单元格 C1 的值。单元格 C1 是一个公式:=A1+B1。注意:A1 和 B1 的值正在变化,因此 C1 中的返回值必须相应地自动变化。

在Python 3.4中,我使用以下代码:

import openpyxl
from openpyxl import Workbook

wb = openpyxl.load_workbook('test.xlsx')
sheet1 = wb['Sheet1']
C1Value = sheet1['C1'].value
print('C1: ', C1Value)

======

运行python程序时,我得到:C1:=A1+B1

我想要获得的是:

A1=1,B1=2 那么C1:3(而不是C1:=A1+B1)

和A1=10,B1=20 然后自动C1:30(而不是C1:=A1+B1)

任何帮助、想法将不胜感激。谢谢。

最佳答案

快速浏览 openpyxl docs你可能会发现this page

openpyxl never evaluates formula

在继续之前,应该注意的是,可能的重复链接具有与其他模块相关的答案,这些通常是可接受的答案。使用这些模块,您不必实现自己的解析。对于更复杂的系统来说,这可能是具有挑战性的,甚至是几乎不可能的。

如果您正在做非常简单的事情,那么 Tokenizer class 并不是非常困难。 。用法:

>>> from openpyxl.formula import Tokenizer
>>> tok = Tokenizer("""=IF($A$1,"then True",MAX(DEFAULT_VAL,'Sheet 2'!B1))""")
>>> print("\n".join("%12s%11s%9s" % (t.value, t.type, t.subtype) for t in tok.items))
IF( FUNC OPEN
$A$1 OPERAND RANGE
, SEP ARG
"then True" OPERAND TEXT
, SEP ARG
MAX( FUNC OPEN
DEFAULT_VAL OPERAND RANGE
, SEP ARG
'Sheet 2'!B1 OPERAND RANGE
) FUNC CLOSE
) FUNC CLOSE

特别注意,一切都是字符串,因此计算公式最好使用 eval() 来完成

因此,如果您对代码进行了一些编辑(用 # 标记新的/更改的行),

import openpyxl
from openpyxl import Workbook
from openpyxl.formula import Tokenizer #

wb = openpyxl.load_workbook('test.xlsx')
sheet1 = wb['Sheet1']
C1Formula = sheet1['C1'].value #
C1Token = Tokenizer(C1Formula) #
C1Value = handle_token(sheet1, C1Token) #
print('C1: ', C1Value)

handle_token() 的位置取决于您想要的复杂程度。几个简单的,也许是 hack-y 的 C1: =A1 + B1 和其他二元运算符的例子:(这些不适用于 ^ 因为 python 使用它按位 XOR )

def handle_token(sheet, token):
formula = ""
for t in token.items:
if t.type is 'OPERAND':
formula += str(sheet[t.value])
else:
formula += str(t.value)
return eval(formula)

或者,如果您愿意(可以将其转换为单行代码,不推荐)使用生成器:

def handle_token(sheet, token):
parsed = str(sheet[t.value].value) if t.type is 'OPERAND' else t.value for t in token.items
formula = "".join(parsed)
return eval(formula)

关于Python 3.4 : Unable to read value from Excel Formula,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688677/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com