有一种方法可以翻译问题中提出的函数,而不必自己编写 Python。
PyCel、Formulas、xlcalculator 和 Koala 等库使用 AST 将 Excel 公式转换为 Python。
我是 xlcalculator 的项目所有者,所以我将在演示中使用该库。也就是说,其他库完全能够胜任这项特定任务。每个图书馆都有不同的遗产,因此它们有不同的优势。
通常,上述库读取 Excel 文件,将公式转换为 Python,然后提供评估功能。 Xlcalculator 还可以解析特制的字典,这正是我在这里利用的。
from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator
input_dict = {
"Sheet1!B16" : "Column1",
"Sheet1!B17" : 512.96,
"Sheet1!B18" : 307.41,
"Sheet1!B19" : 413.76,
"Sheet1!B20" : 323.65,
"Sheet1!B21" : 376.84,
"Sheet1!B22" : 368.79,
"Sheet1!B23" : 367.77,
"Sheet1!B24" : 345.65,
"Sheet1!C16" : "OP results",
"Sheet1!C17" : 10,
"Sheet1!C18" : 3,
"Sheet1!C19" : 7,
"Sheet1!C20" : 4,
"Sheet1!C21" : 5,
"Sheet1!C22" : 5,
"Sheet1!C23" : 5,
"Sheet1!C24" : 4,
"Sheet1!D16" : "Actual Output (Parfait)",
"Sheet1!D17" : '=IF(B17="", "", MIN(MAX(CEILING((B17-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D18" : '=IF(B18="", "", MIN(MAX(CEILING((B18-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D19" : '=IF(B19="", "", MIN(MAX(CEILING((B19-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D20" : '=IF(B20="", "", MIN(MAX(CEILING((B20-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D21" : '=IF(B21="", "", MIN(MAX(CEILING((B21-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D22" : '=IF(B22="", "", MIN(MAX(CEILING((B22-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D23" : '=IF(B23="", "", MIN(MAX(CEILING((B23-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )',
"Sheet1!D24" : '=IF(B24="", "", MIN(MAX(CEILING((B24-MIN(B$17:B$46))/((MAX(B$17:B$46)-MIN(B$17:B$46))/10),1),1),10) )'
}
compiler = ModelCompiler()
my_model = compiler.read_and_parse_dict(input_dict)
evaluator = Evaluator(my_model)
print(evaluator.evaluate("Sheet1!C16"))
print("Sheet1!C17", evaluator.evaluate("Sheet1!C17"))
print("Sheet1!C18", evaluator.evaluate("Sheet1!C18"))
print("Sheet1!C19", evaluator.evaluate("Sheet1!C19"))
print("Sheet1!C20", evaluator.evaluate("Sheet1!C20"))
print("Sheet1!C21", evaluator.evaluate("Sheet1!C21"))
print("Sheet1!C22", evaluator.evaluate("Sheet1!C22"))
print("Sheet1!C23", evaluator.evaluate("Sheet1!C23"))
print("Sheet1!C24", evaluator.evaluate("Sheet1!C24"))
print()
print(evaluator.evaluate("Sheet1!D16"))
print("Sheet1!D17", evaluator.evaluate("Sheet1!D17"))
print("Sheet1!D18", evaluator.evaluate("Sheet1!D18"))
print("Sheet1!D19", evaluator.evaluate("Sheet1!D19"))
print("Sheet1!D20", evaluator.evaluate("Sheet1!D20"))
print("Sheet1!D21", evaluator.evaluate("Sheet1!D21"))
print("Sheet1!D22", evaluator.evaluate("Sheet1!D22"))
print("Sheet1!D23", evaluator.evaluate("Sheet1!D23"))
print("Sheet1!D24", evaluator.evaluate("Sheet1!D24"))
>python stackoverflow.py
OP results
Sheet1!C17 10
Sheet1!C18 3
Sheet1!C19 7
Sheet1!C20 4
Sheet1!C21 5
Sheet1!C22 5
Sheet1!C23 5
Sheet1!C24 4
Actual Output (Parfait)
Sheet1!D17 10.0
Sheet1!D18 1
Sheet1!D19 6.0
Sheet1!D20 1.0
Sheet1!D21 4.0
Sheet1!D22 3.0
Sheet1!D23 3.0
Sheet1!D24 2.0