我正在使用 python 从电子表格 xml 构建公式参考图。公式就像
=IF(AND(LEN(R[-2]C[-1])>0,R[-1]C),WriteCurve(OFFSET(R16C6, 0,0,R9C7,R10C7),R15C6,R10C3, R8C3),"NONE")
我只对获取 writecurve 函数的第 n 个参数感兴趣。这里我提出了一个非常C风格的程序,基本上计算不在括号内的彗差。有很多嵌套公式
def parseArguments(t, func, n):
start=t.find(func)+len(func)+1
bracket = 0
ss = t[start:]
lastcomma = 0
for i, a in enumerate(ss):
if a=="(":
bracket +=1
elif a==")":
if bracket==0:
break
bracket-=1
elif a == ",":
if bracket==0 and n==0:
break
elif bracket ==0:
if n-1==0:
lastcomma = i
n-=1
if lastcomma == 0:
return ss[:i]
else:
return ss[lastcomma+1:i]
有Pythonic的方法可以做到这一点吗?或者是否有更好的递归方法来解析整个公式?非常感谢
我所知道的最好的 Excel 公式解析器是 E。 W. Bachtal 算法。 Robin Maccharg 有一个 Python 移植版;我所知道的最新版本是 pycel 项目的一部分,但它可以独立使用 - ExcelFormula。解析你的公式没有问题:
from pycel.excelformula import ExcelFormula, FunctionNode
formula = ExcelFormula('=IF(AND(LEN(R[-2]C[-1])>0,R[-1]C),WriteCurve(OFFSET(R16C6, 0,0,R9C7,R10C7),R15C6,R10C3, R8C3),"NONE")')
>>> formula.ast
FunctionNode<IF>
然后您可以遍历 AST 来查找 WriteCurve 节点并检查其参数:
write_curve = next(node for node, _ in formula.ast.descendants if isinstance(node, FunctionNode) and node.value.strip('(') == 'WriteCurve')
>>> write_curve.children[2].value
'R10C3'