用python代码解析和编译excel公式和工作簿。
formulas的Python项目详细描述
什么是公式?
formulas为excel公式实现一个解释器,它 分析和编译Excel公式表达式。
此外,它还将excel工作簿编译为python,并在没有 使用Excel COM服务器。因此,不需要excel。
安装
要安装它,请使用(具有根用户权限):
$ pip install formulas
或者下载最后一个git版本并使用(具有根权限):
$ python setup.py install
安装附加组件
已启用一些附加功能安装以下 附加服务:
- excel:允许将excel工作簿编译为python并执行
- 使用:ExcelModel。
- 打印:允许打印公式ast和excel模型。
要安装公式和所有附加程序,请执行以下操作:
$ pip install formulas[all]
基本示例
以下部分将演示如何:
- 分析Excel公式;
- 加载、编译和执行Excel工作簿;
- 从Excel工作簿中提取子模型;
- 添加自定义函数。
解析公式
下面是一个如何分析和执行Excel公式的示例:
>>> import formulas >>> func = formulas.Parser().ast('=(1 + 1) + B3 / A2')[1].compile()
要可视化公式模型并获取输入顺序,可以执行 以下内容:
>>> list(func.inputs) ['A2', 'B3'] >>> func.plot(view=False) # Set view=True to plot in the default browser. SiteMap([(=((1 + 1) + (B3 / A2)), SiteMap())])[graph]
最后执行公式并绘制工作流:
>>> func(1, 5) Array(7.0, dtype=object) >>> func.plot(workflow=True, view=False) # Set view=True to plot in the default browser. SiteMap([(=((1 + 1) + (B3 / A2)), SiteMap())])[graph]
excel工作簿
例如,如何加载、计算和编写Excel工作簿 以下内容:
>>> import formulas >>> fpath = 'file.xlsx' >>> xl_model = formulas.ExcelModel().loads(fpath).finish() >>> xl_model.calculate() Solution(...) >>> xl_model.write() {'EXCEL.XLSX': {Book: <openpyxl.workbook.workbook.Workbook ...>}}
- 提示:如果有或可能有循环引用,请添加
- circular=true到finish方法。
绘制描述excel之间关系的依赖关系图 单元格:
>>> dsp = xl_model.dsp >>> dsp.plot(view=False) # Set view=True to plot in the default browser. SiteMap([(ExcelModel, SiteMap())])[graph]
覆盖由excel文件定义的默认输入,或 对特定单元格施加某些值:
>>> xl_model.calculate( ... inputs={ ... "'[EXCEL.XLSX]DATA'!A2": 3, # To overwrite the default value. ... "'[EXCEL.XLSX]DATA'!B3": 1 # To impose a value to B3 cell. ... }, ... outputs=[ ... "'[EXCEL.XLSX]DATA'!C2", "'[EXCEL.XLSX]DATA'!C4" ... ] # To define the outputs that you want to calculate. ... ) Solution([("'[EXCEL.XLSX]DATA'!A2", <Ranges>('[EXCEL.XLSX]DATA'!A2)=[[3]]), ("'[EXCEL.XLSX]DATA'!A3", <Ranges>('[EXCEL.XLSX]DATA'!A3)=[[6]]), ("'[EXCEL.XLSX]DATA'!B3", <Ranges>('[EXCEL.XLSX]DATA'!B3)=[[1]]), ("'[EXCEL.XLSX]DATA'!B2", <Ranges>('[EXCEL.XLSX]DATA'!B2)=[[9.0]]), ("'[EXCEL.XLSX]DATA'!C2", <Ranges>('[EXCEL.XLSX]DATA'!C2)=[[9.0]]), ("'[EXCEL.XLSX]DATA'!C4", <Ranges>('[EXCEL.XLSX]DATA'!C4)=[[1.0]])])
从具有固定输入和 输出,可以使用excelmodel的compile方法 返回DispatchPipe。 这是一个函数,其中输入和输出由 数据节点ID(即单元引用)。
>>> func = xl_model.compile( ... inputs=[ ... "'[EXCEL.XLSX]DATA'!A2", # First argument of the function. ... "'[EXCEL.XLSX]DATA'!B3" # Second argument of the function. ... ], # To define function inputs. ... outputs=[ ... "'[EXCEL.XLSX]DATA'!C2", "'[EXCEL.XLSX]DATA'!C4" ... ] # To define function outputs. ... ) >>> func <schedula.utils.dsp.DispatchPipe object at ...> >>> [v.value[0, 0] for v in func(3, 1)] # To retrieve the data. [9.0, 1.0] >>> func.plot(view=False) # Set view=True to plot in the default browser. SiteMap([(ExcelModel, SiteMap())])[graph]
自定义函数
如何向公式分析器添加自定义函数的示例是 以下内容:
>>> import formulas >>> FUNCTIONS = formulas.get_functions() >>> FUNCTIONS['MYFUNC'] = lambda x, y: 1 + y + x >>> func = formulas.Parser().ast('=MYFUNC(1, 2)')[1].compile() >>> func() 4