用于将 excel 电子表格编译为 python 代码并将它们可视化为图形的库
项目描述
皮塞尔
Pycel 是一个小型 python 库,可以将 Excel 电子表格转换为可执行的 python 代码,可以独立于 Excel 运行。
python 代码基于图形并使用缓存和延迟评估来确保(相对)快速执行。可以使用Gephi等工具导出和分析图表。请参阅包含的示例以获取说明。
- 所需的python库:
dateutil、 networkx、 numpy、 openpyxl、 ruamel.yaml和可选: matplotlib、 pydot
此博客文章中描述了 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] - (未发布)
支持 Python 2
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。