Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.4:无法从Excel公式中读取值_Python_Excel_Openpyxl - Fatal编程技术网

Python 3.4:无法从Excel公式中读取值

Python 3.4:无法从Excel公式中读取值,python,excel,openpyxl,Python,Excel,Openpyxl,我尝试使用Python3.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

我尝试使用Python3.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从不计算公式

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

若你们正在做一些非常简单的事情,那个么使用它并不是非常困难。用法:

请特别注意,所有内容都是字符串,因此计算公式最好使用

因此,如果您稍微编辑了代码(用
#
标记的新的/更改的行)

其中,
handle\u token()
取决于您想要它的复杂程度。关于
C1:=A1+B1
和其他二进制运算符的两个简单且可能是hack-y示例:(这些运算符不适用于
^
,因为python将其用于按位

或者,如果您愿意(可以将其转换为单缸套,不推荐)使用发电机:

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)

它的可能副本通过使用:wb=openpyxl.load\u工作簿('test.xlsx',data\u only=True)像一个符咒一样工作
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)
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)