用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=truefinish方法。

绘制描述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]])])

从具有固定输入和 输出,可以使用excelmodelcompile方法 返回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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何通过编程将Android置于待机状态?   java mavenjarsignerplugin在Jenkins构建期间失败,但不是在命令行上   java创建具有公共ipv4地址的HttpServer   将数据从jsp传递到servlet的java返回null   Web应用程序中的java JDBC数据库连接   java无法显示unicode字符   java webview应用程序未上载图片或视频   Android客户端Java服务器,如果订单处理方式不正确,客户端将无法连接   java在不复制备份表的情况下创建备份表   集合如何在Java中实现列表折叠   java如何配置在JBoss7中使用EntityListeners?   java JVM ClassUnloadingWithConcurrentMark标志   java如何在Maven中排除特定的单元测试   java线程在SynchronousQueue中执行put操作后挂起   java中的hibernate Comparator和可比较的负面场景   数组中的java连接元素   拖放Java,让面板落在鼠标事件上   java是一种事务管理应用程序,无需在方法上使用@transactional   java有没有办法从安卓的软键板上删除这一行?