Очень быстрый взгляд на 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()
зависит от вас за то, насколько сложно вам это хотелось. Пара простой и, возможно, взломать, у примеров C1: =A1 + B1
и другие бинарных операторов: (они не работают для ^
, как питон использует это для побитового 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)
Возможная дубликат [значения ячейки чтения Excel, а не формула вычисления это -openpyxl] (http://stackoverflow.com/q/28517508/1072229) –
Возможный дубликат [openpyxl error: "can n ot convert string to float "] (http://stackoverflow.com/questions/41449712/openpyxl-error-could-not-convert-string-to-float) – e4c5
Возможный дубликат [Читать значение ячейки Excel, а не вычисление формулы it -openpyxl] (http: // stackoverflow.com/questions/28517508/read-excel-cell-value-and-not-the-formula-computing-it-openpyxl) – Mxt