Skip to main content

用于将 excel 电子表格编译为 python 代码并将它们可视化为图形的库

项目描述

皮塞尔

构建状态 代码覆盖率 需求状态

最新发布的 pypi-pyversions 回购规模 代码大小

Pycel 是一个小型 python 库,可以将 Excel 电子表格转换为可执行的 python 代码,可以独立于 Excel 运行。

python 代码基于图形并使用缓存和延迟评估来确保(相对)快速执行。可以使用Gephi等工具导出和分析图表。请参阅包含的示例以获取说明。

所需的python库:

dateutilnetworkxnumpyopenpyxlruamel.yaml和可选: matplotlibpydot

此博客文章中描述了 pycel 背后的全部动机,包括一些示例和屏幕截图。

用法

下载库并运行示例文件。

快速入门: 您可以使用 binder 在浏览器中以交互方式快速查看和探索该工具:打开笔记本

好的:

支持所有主要的数学函数(sin、cos、atan2、...)和运算符(+、/、^、...)以及范围 (A5:D7),以及 MIN、MAX、INDEX、LOOKUP 和 LINEST 等函数。

代码库很小,速度相对较快,应该易于理解和扩展。

我已经在包含 10 张表格和超过 10000 个公式的电子表格上对其进行了广泛的测试。在这种情况下,方程的计算大约需要 50 毫秒,并且与 Excel 一致,最多保留 5 个小数位。

坏处:

我的开发是由我需要处理的特定电子表格驱动的,所以我只添加了对我需要的功能的支持。但是,添加对其他人的支持应该很简单。

该代码当前确实支持单元格引用,因此像 OFFSET 这样的函数可以工作,但会遇到这样一个事实,即如果尚未编译单元格,则该函数可能会失败。此外,出于显而易见的原因,任何 VBA 代码都没有被编译,但需要在 python 端手动重新实现。

丑陋的:

生成的基于图形的代码对于我的目的来说足够快,但要使其真正快速,您可能会用基于稀疏矩阵或类似的依赖跟踪器替换图形。

Excel 插件

可以使用PyXLL将 pycel 作为 excel 插件 运行。只需将 pyxll.xll 和 pyxll.py 放在 lib 目录中,并将 xll 文件添加到 Excel 插件列表中,如 pyxll 文档中所述。

致谢

由于 Robin Macharg 的 Eric Bachtal 的Excel 公式解析代码的 python 端口,此代码最初成为可能 。

该代码当前使用来自 openpyxl 库的类似来源的标记器。

更改日志

[1.0b30] - 2021-10-13

改变了

  • 更好地处理编译工作簿中的间接单元格

  • 更好地处理已编译工作簿中的 numpy 浮点数

[1.0b29] - 2021-09-13

添加

  • 添加对 openpyxl >= 3.0.8 的支持

[1.0b28] - 2021-08-31

添加

  • 添加对networkx 2.6的支持

改变了

  • 迭代计算的一些小改进

[1.0b27] - 2021-07-10

添加

  • 添加了 CHOOSE() 函数

  • 添加了 FORECAST() 函数

  • 添加了 INTERCEPT() 函数

  • 添加了 IFNA() 函数

  • 添加了 ISBLANK() 函数

  • 添加了 ISLOGICAL() 函数

  • 添加了 ISNONTEXT() 函数

  • 添加了 N() 函数

  • 添加了 NA() 函数

  • 添加了 SLOPE() 函数

  • 添加了 SUBSTITUTE() 函数

  • 添加了 TEXT() 函数(谢谢,Luckykarter)

  • 添加 TREND() 函数

  • 为 INDEX() 添加了参考表格

  • 将 str_params 添加到 excel_helper()

  • 添加 ExcelCompiler.validate_serialized()

改变了

  • 提高与 Excel 的 LINEST() 兼容性

  • 使用 Excel 改进 TEXT() 兼容性

  • 改进某些文本函数中的错误和数字处理

  • 改进 IFS() 以支持数组上下文

  • 来自 INDIRECT() 和 OFFSET() 的缺失引用更频繁地解决

固定的

  • 修复 #111,YEARFRAC 的错误实现

  • 修复了 LINEST() 中的一些异常

  • 使用公式修复序列化范围

  • 修复了 DATE() 中的一个小错误

  • 修复了经过时间的 TIMEVALUE() 解析

[1.0b26] - 2021-06-18

添加

  • 现在支持 Python 3.9

  • 添加按位函数:bitand、bitor、bitxor、bitlshift 和 bitrshift(感谢 bogdan-oprescu-nxp)

  • 添加 PV 功能(谢谢,estandiaa-marin)

改变了

  • 允许将插件传递给反序列化函数 from_file()(谢谢,nanaposo)

已移除

  • 放弃对 Python 3.5 的支持

固定的

  • 修复 openpyxl >= 3.0.4(谢谢,ckp95)

  • 修复 HLOOKUP row_index_num 验证以使用 num 行(谢谢,nanaposo)

  • 修复 #86, tokenize.TokenError: ('EOF in multi-line statement',

  • 修复 #88,在工作簿中处理 calcPR(谢谢,andreif)

  • 修复 #89,通过现金流范围时 NPV 函数失败(感谢 jpp-0)

  • 修复 #93,set_value() 期间的 AssertionError,通过添加更好的错误消息

  • 修复 #99,Pycel 在矩形范围内引发 NotImplementedError(谢谢,rmorel)

  • 修复 #103,连接 AddressCell 对象时 build_operator_operand_fixup() 抛出 #VALUE 错误(谢谢,nboukraa)

  • 修复 #104,最近合并后覆盖和测试不足

  • 修复 #105,带有连续否定的表达式的 RPN 不正确(感谢 victorjmarin)

  • 修复 #109,特定情况下字符串连接失败(感谢 bogdan-oprescu-nxp)

  • 修复 =IF() 与 numpy 结果比较时的问题

  • 在 CSE 上下文中修复 MID() 和 REPLACE() 和 LEN()

  • 修复 INDEX() 错误处理

  • 修复查找变体的错误处理

[1.0b22] - 2019-10-17

固定的

  • 修复 #80,与 networkx 2.4 不兼容

[1.0b21] - 2019-10-13

改变了

  • 加速编译

  • 在多号范围内实现定义的名称

  • 将相邻函数用作中缀运算符时标记“:”

  • 准备中的各种变化以改进参考,包括

  • 向函数助手添加引用扩展

  • 将工作表添加到indirect() 并将ref_param=0 添加到offset()

  • 实现 is_address() 助手

  • 为 AddressCell 实现交集和并集

固定的

  • 修复 #77,IFERROR() 中的空 arg

  • 修复 #78,各种 IFS() 函数的无比较和清理错误处理

[1.0b20] - 2019-09-22

改变了

  • 实现多冒号范围

  • 添加对缺失(空)函数参数的支持

固定的

  • 修复迭代评估器中的线程问题

  • 修复 ROW 和 COLUMN 的范围交集与空结果

  • 修复 #74 - 计数不适用于范围

[1.0b19] - 2019-09-12

改变了

  • 实施间接和偏移

  • 实施 SMALL、LARGE 和 ROUNDDOWN(谢谢,nanaposo)

  • 为未处理的缺失函数参数添加错误消息

固定的

  • 使用 CSE 评估器修复线程问题

[1.0b18] - 2019-09-07

改变了

  • 实施 CEILING_MATH、CEILING_PRECISION、FLOOR_MATH 和 FLOOR_PRECISION

  • 实施 FACT & FACTDOUBLE

  • 实施 AVERAGEIF、MAXIFS、MINIFS

  • 实施 ODD、EVEN、ISODD、ISEVEN、SIGN

固定的

  • 修复 #67 - 无限范围的评估

  • 修复 xIFS 函数的单个单元格的错误

[1.0b17] - 2019-09-02

改变了

  • 为已定义名称的多区域范围添加公式支持

  • 允许从 openpyxl 工作簿初始化 ExcelCompiler

  • 实现 LOWER()、REPLACE()、TRIM() 和 UPPER()

  • 实现 DATEVALUE()、IFS() 和 ISERR()(感谢 int128t)

  • 重新组织时间和时间实用程序和文本功能

  • 添加 excelutil.AddressMultiAreaRange。

  • 将 abs_coordinate() 属性添加到 AddressRange 和 AddressCell

  • 清理导入语句

固定的

  • 解决了 travis 上的 tox 版本问题

  • 使用多区域范围修复定义的名称

[1.0b16] - 2019-07-07

改变了

  • 添加十二个日期和时间功能

  • 序列化工作簿文件名并使用它而不是序列化文件名(谢谢,nanaposo)

[1.0b15] - 2019-06-30

改变了

  • 实施 AVERAGEIFS()

  • 从工作簿中获取迭代计算参数默认值

固定的

  • #60,Binder Notebook 示例不工作

[1.0b14] - 2019-06-16

改变了

  • 添加了评估一个或多个单元格的条件格式(公式)的方法

  • 添加 ExcelCompiler(...,cycles=True) 以允许 Excel 迭代计算

[1.0b13] - 2019-05-10

改变了

  • 实现 VALUE()

  • 改进 CSE 工作的编译性能恢复

固定的

  • #54,在 normalize_year() 中,month % 12 可以为 0 -> IllegalMonthError

[1.0b12] - 2019-04-22

改变了

  • 添加库插件支持

  • 改进无界行/列的评估(即:A:B)

  • 修复 1.0b11 的一些回归

[1.0b11] - 2019-04-21

添加

  • 实现 LEFT()

  • 实施 ISERROR()

  • 实现 FIND()

  • 实施 ISNUMBER()

  • 实施 SUMPRODUCT()

  • 实施 CEILING()

  • 实现 TRUNC() 和 FLOOR()

  • 添加对 LOG() 的支持

  • 改进 ABS()、INT() 和 ROUND()

  • 将quoted_address() 方法添加到AddressRange 和AddressCell

  • 添加公共接口以获取 formula_cells() 列表

  • 为“链接”工作表名称添加 NotImplementedError

  • 将参考 URL 添加到功能信息

  • 为 CSE 数组公式支持添加了大量扩展
    • 将 CSE 数组处理添加到 excelformula 和 excelcompiler

    • 仅将行、列和索引更改为矩形数组

    • 添加 in_array_formula_context

    • 添加 cse_array_wrapper() 以允许在数组上下文中调用函数

    • 添加 error_string_wrapper() 以检查 excel 错误

    • 将 math_wrap() 移至 function_helpers。

    • 处理单元格中的直接 CSE 数组

    • 在 excelwrapper 中重新组织 CSE 数组公式处理

    • 对于小于目标填充的 CSE 阵列(无)

    • 修剪过大的数组结果以适应目标范围

    • 从 python 代码改进所需的地址解析器

    • 改进 CSE 数组的 _coerce_to_number() 和 _numerics()

    • 从 excelwrapper._OpxRange() 中删除公式

改变了

  • 重构 ExcelWrapper、ExcelFormula 和 ExcelCompiler 以允许……

  • 重构 function_helpers 以添加装饰器以优化库函数

  • 改进了 validate_calcs() 和 trim_graph() 中的各种消息和异常

  • 改进一些 NotImplementedError() 消息

  • 只构建编译器评估上下文一次

固定的

  • 地址范围 Union 和 Intersection 需要 sheet_name

  • 修复来自同一行的配对函数的函数信息

  • 修复范围交点

  • 修复空单元格上的一元减号

  • 修复 ISNA()

  • 修复 AddressCell 从元组创建

  • Power(0,-1) 现在返回 DIV0

  • 清理索引()

[1.0b8] - 2019-03-20

添加

  • 实现数组公式的运算符

  • 实现连接和连接

  • 实施小计

  • 添加对扩展数组公式的支持

  • 添加对表相对引用的支持

  • 添加功能信息方法

改变了

  • 改进 validate_calcs 和未实现功能的消息

固定的

  • 修复数组公式的列和行

[1.0b7] - 2019-03-10

添加

  • 实现数组 (CSE) 公式

固定的

  • 修复 #45 - 无限范围地址(即:A:B 或 1:2)损坏

[1.0b6] - 2019-03-03

固定的

  • 修复 #42 - 'ReadOnlyWorksheet' 对象没有属性 'iter_cols'

  • 修复 #43 - 修复前导/尾随空格的错误

[1.0b5] - 2019-02-24

添加

  • 实现 XOR()、NOT()、TRUE()、FALSE()

  • 改进 AND()、OR() 的错误处理

  • 实现 POWER() 函数

[1.0b4] - 2019-02-17

改变了

  • 移至 openpyxl 2.6+

已移除

  • 删除对 Python 3.4 的支持

[1.0b3] - 2019-02-02

改变了

  • 解决 openpyxl 返回日期时间

  • 固定到 openpyxl 2.5.12 以避免 2.5.14 中的错误(在 PR #315 中修复)

[1.0b2] - 2019-01-05

改变了

  • 为更好地匹配 Excel 错误处理做了大量工作

  • 扩展 validate_calcs() 以允许测试整个工作簿

  • match() 的改进,包括通配符支持

  • 完成了match()、lookup()、vlookup()和hlookup()的实现

  • 实现 COLUMN() 和 ROW()

  • 实现 % 运算符

  • 实现 len()

  • 实现二进制基数 Excel 函数(hex2dec 等)

固定的

  • 修复 PI()

[1.0b0] - 2018-12-25

添加

  • 转换为 Python 3.4+

  • 删除了 Windows Excel COM 驱动程序(openpyxl 用于所有 xlsx 读取)

  • 添加对已定义名称的支持

  • 添加对结构化引用的支持

  • 修复对相对公式的支持

  • set_value() 和 evaluate() 支持范围和列表

  • 添加更多库函数

  • 添加 AddressRange 和 AddressCell 类来封装地址计算

  • 添加 validate_calcs() 以帮助调试 excellib 函数

  • 添加构建功能,可以将重新编译限制为仅在 excel 文件更改时

改变了

  • 改进了#DIV0 的处理!和#VALUE!

  • 测试在 Python 3.4、3.5、3.6、3.7 上运行(通过 tox)

  • 大量重构 ExcelCompiler

  • 将所有公式评估、解析等代码移至 ExcelFormula 类

  • 转换为使用 openpyxl 分词器

  • 将打印转换为记录调用

  • 转换为使用 pytest

  • 添加对 travis 和 codecov.io 的支持

  • 100% 单元测试覆盖率(大部分)

  • 添加可调试的公式评估

  • 清理生成的 Python 代码,使其更易于阅读

  • 添加文本格式(yaml 或 json)序列化格式

  • 添加了 flake8 (pep8) 检查

  • pip 现在处理可以使用哪些 Python 版本

  • 发布到 PyPI

  • 文档已更新

已移除

  • 不再支持 Python 2

固定的

  • 很多的

[0.0.1] - (未发布)

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

pycel-1.0b30.tar.gz (117.3 kB 查看哈希

已上传 source

内置分布

pycel-1.0b30-py3-none-any.whl (114.1 kB 查看哈希

已上传 py3