将MS Excel公式转换为Python并计算它们。
项目描述
Excel 计算器
xlcalculator 是一个 Python 库,它读取 MS Excel 文件,并在支持的功能范围内将 Excel 函数转换为 Python 代码,然后评估生成的 Python 代码。本质上是在不使用 Excel 的情况下执行 Excel 计算。
xlcalculator 是对 koala2 库的现代化。
xlcalculator 目前支持
将 Excel 文件加载到 Python 兼容状态
保存 Python 兼容状态
加载 Python 兼容状态
忽略工作表
提取模型的部分。 “关注”提供的单元格地址或定义的名称
评估
单个单元格
定义的名称(一个“命名的单元格”或范围)
范围
共享公式 非数组公式
操作数(+,-,/,*,==,<>,<=,>=)
仅对单元格
设置单元格值
获取单元格值
-
代码在 examples\third_party_datastructure 目录中
函数在 README 的底部
- LN
Python Math.log() 与 Excel LN 不同。目前返回 Math.log()
VLOOKUP - 仅精确匹配
YEARFRAC - 基础 1,实际/实际,仅在三位小数内
目前不支持
数组公式或 CSE 公式(不是一个共享公式):https://stackoverflow.com/questions/1256359/what-is-the-difference-between-a-shared-formula-and-an-array-formula 或 https://support.office.com/en-us/article/guidelines-and-examples-of-array-formulas-7d94a64e-3ff3-4686-9372-ecfd5caa57c7#ID0EAAEAAA=Office_2013_-_Office_2019)
根据 Microsoft Office 帮助网站,需要完成测试的函数
EXP
DB
运行测试
设置您的环境
virtualenv -p 3.10 ve ve/bin/pip install -e .[test]
从 xlcalculator 目录的根目录
ve/bin/py.test -rw -s --tb=native
或简单地使用 tox
tox
运行示例
从 examples\common_use_case 目录
python use_case_01.py
添加/注册 Excel 函数
Excel 函数支持可以轻松添加。
基本函数支持位于 xlfunctions 目录。函数按主题组织在模块中。
可以使用 xlfunctions.xl.register() 装饰器将 Excel 函数添加到任何代码中。以下是一个简单的示例
from xlcalculator.xlfunctions import xl
@xl.register()
@xl.validate_args
def ADDONE(num: xl.Number):
return num + 1
@xl.validate_args 装饰器将确保注释的参数被转换并验证。例如,即使您传递一个字符串,它也会被转换为数字(以典型的 Excel 方式)
>>> ADDONE(1):
2
>>> ADDONE('1'):
2
如果您想贡献函数,请创建一个 pull request。所有新函数都应该附有足够的测试来覆盖功能。需要为函数的 Python 实现编写测试(tests/xlfunctions)以及与 Excel 的比较测试(tests/xlfunctions_vs_excel)。
Excel 数字精度
Excel 数字精度是一个复杂的话题。
它已经在 维基百科页面 上进行了讨论。
基本原理归结为浮点数以及它们在内存中的表示与它们在磁盘上的存储以及它们在屏幕上的显示之间的争议。一篇 Microsoft 文章 解释了争议。
该项目试图在读取Excel文件中的数字时进行管理,以尝试消除各种表示错误。
还需要进一步的工作来确保数字在不同转换过程中与Excel保持一致。
据我所知,这需要一个低级实现数字数据类型(C或C++,Cython??)来复制其行为。Python内置的数字类型无法适当复制这些行为。
直接从工作簿中对Excel公式进行单元测试。
如果您对在您的工作簿中测试公式感兴趣,可以使用FlyingKoala。示例可以在这里找到。
待办事项
不要将范围视为粒度AST节点,而将其视为两个单元格引用的“:”操作,以创建范围。这将使实现类似A1:OFFSET(...)的功能变得容易。
支持替代范围评估:通过引用(指针)、通过表达式(懒加载评估)和当前评估模式。
指针将允许轻松实现OFFSET()等函数。
懒加载评估将允许高效地实现IF(),因为真值和假值表达式的执行可以延迟到决定需要哪个表达式时。
实现数组函数。一旦实现了可以在其上轻松使用标量函数的适当RangeData类,这实际上并不难。
改进测试
重构模型和评估器,以使用按对象引用传递单元格值,然后由范围、定义的名称和公式“使用”/引用
处理多文件地址
改进与pyopenxl的集成,用于读取和写入文件 示例问题空间
支持的功能
兼容性
函数
xlcalculator
PyCel
公式
Koala
FLOOR
日期和时间
函数
xlcalculator
PyCel
公式
Koala
DATE
DATEDIF
DATEVALUE
DAY
DAYS
EDATE
EOMONTH
HOUR
ISOWEEKNUM
MINUTE
MONTH
NOW
SECOND
TIME
TIMEVALUE
TODAY
WEEKDAY
YEAR
YEARFRAC
工程
函数
xlcalculator
PyCel
公式
Koala
BIN2DEC
BIN2HEX
BIN2OCT
DEC2BIN
DEC2HEX
DEC2OCT
HEX2BIN
HEX2DEC
HEX2OCT
OCT2BIN
OCT2DEC
OCT2HEX
金融
函数
xlcalculator
PyCel
公式
Koala
IRR
NPV
PMT
PV
SLN
VDB
XIRR
XNPV
信息
函数
xlcalculator
PyCel
公式
Koala
ISBLANK
ISERR
ISERROR
ISEVEN
ISNA
ISNUMBER
ISODD
ISTEXT
NA
逻辑
函数
xlcalculator
PyCel
公式
Koala
AND
FALSE
IF
IFERROR
IFS
NOT
OR
SWITCH
TRUE
XOR
查找和引用
函数
xlcalculator
PyCel
公式
Koala
CHOOSE
COLUMN
COLUMNS
HLOOKUP
INDEX
INDIRECT
LOOKUP
MATCH
OFFSET
ROW
ROWS
VLOOKUP
数学和三角学
函数
xlcalculator
PyCel
公式
Koala
ABS
ACOS
ACOSH
ACOT
ACOTH
ARABIC
ASIN
ASINH
ATAN
ATAN2
ATANH
CEILING
CEILING.MATH
CEILING.PRECISE
COS
COSH
COT
COTH
CSC
CSCH
DECIMAL
DEGREES
EVEN
EXP
FACT
FACTDOUBLE
FLOOR.MATH
FLOOR.PRECISE
GCD
INT
ISO.CEILING
LCM
LN
LOG
LOG10
MOD
MROUND
奇数
圆周率
功率
弧度
随机数
随机数范围
罗马数字
四舍五入
向下取整
向上取整
秒
双曲正割
符号
正弦
双曲正弦
平方根
π的平方根
求和
求和条件
求和条件(多个条件)
求和乘积
正切
双曲正切
截断
统计
函数
xlcalculator
PyCel
公式
Koala
平均值
平均值A
条件平均值
条件平均值(多个条件)
计数
计数A
计数空单元格
条件计数
条件计数(多个条件)
最大值(第k大值)
线性回归
最大值
最大值A
条件最大值
最小值
最小值A
条件最小值
最小值(第k小值)
文本
函数
xlcalculator
PyCel
公式
Koala
连接
连接(多个字符串)
完全匹配
查找
左
长度
小写
中间
替换
右
修剪
大写
数值
变更
0.5.0 (2023-02-06)
增加对Python 3.10的支持,删除了3.8。
将requirements.txt升级到最新版本。
yearfrac==0.4.4与最新setuptools不兼容。
openpyxl进行了API更改,并解决了相关问题,测试已修复。
0.4.2 (2021-05-17)
确保十进制舍入仅设置在上下文中,而不是整个系统中。
0.4.1 (2021-05-14)
修复了跨工作表引用。
0.4.0 (2021-05-13)
从read_and_parse_archive()传递ignore_hidden到parse_archive()
为IF()添加Excel测试。
添加NOT()函数。
实现了BIN2OCT()、BIN2DEC()、BIN2HEX()、OCT2BIN()、OCT2DEC()、OCT2HEX()、DEC2BIN()、DEC2OCT()、DEC2HEX()、HEX2BIN()、HEX2OCT()、HEX2DEC()。
删除Python 3.7支持。
0.3.0 (2021-05-13)
增加对跨工作表引用的支持。
使*IF()函数不区分大小写,以正确符合Excel规范。
支持Python 3.9。
0.2.13 (2020-12-02)
添加函数:FALSE()、TRUE()、ATAN2()、ACOS()、DEGREES()、ARCCOSH()、ASIN()、ASINH()、ATAN()、CEILING()、COS()、RADIANS()、COSH()、EXP()、EVEN()、FACT()、FACTDOUBLE()、INT()、LOG()、LOG10()、RAND()、RANDBETWRRN()、SIGN()、SIN()、SQRTPI()、TAN()
0.2.12 (2020-11-28)
添加函数:PV()、XIRR()、ISEVEN()、ISODD()、ISNUMBER()、ISERROR()、FLOOR()、ISERR()
需要修复一元运算符,以便正确处理双重使用的情况,例如;双重负号.. –4 == 4
0.2.11 (2020-11-16)
添加函数:DAY()、YEAR()、MONTH()、NOW()、WEEKDAY()、EDATE()、EOMONTH()、DAYS()、ISOWEEKNUM()、DATEDIF()、FIND()、LEFT()、LEN()、LOWER()、REPLACE()、TRIM()、UPPER()、EXACT()
0.2.10 (2020-10-30)
支持CONCATENATE
更新setup.py分类器、许可证和关键词
0.2.9 (2020-09-26)
修复了ModelCompiler.read_and_parse_dict()中的错误,当一个字典被ModelCompiler解析为Model时,会触发xlcalculator.xlfunctions.xl的AttributeError。这是在将xlfunctions移动到xlcalculator时留下的。已包含测试。
0.2.8 (2020-09-22)
修复了ISNA()和NA()的实现。
实现MATCH()。
0.2.7 (2020-09-22)
添加函数:ISBLANK()、ISNA()、ISTEXT()、NA()
0.2.6 (2020-09-21)
添加COUNTIIF()和COUNTIFS()函数支持。
0.2.5 (2020-09-21)
添加SUMIFS()支持。
0.2.4 (2020-09-09)
更新README,包含支持的函数。
修复ModelCompiler提取方法中的错误,其中定义的名称单元格被公式中包含的术语之一中的单元格覆盖。为此添加了一个测试。
将yearfrac的版本移动到0.4.4。该项目已删除对six包的依赖。
0.2.3 (2020-08-18)
引入xlfunctions。
修复COUNTA错误。
现在支持256个参数。
更新README。包括关于xlfunction的内容。
将许可证从GPL-3风格更改为MIT风格。
0.2.2 (2020-05-28)
将依赖关系解析作为执行的一部分。
AST评估处理依赖关系解析。
提供循环检测和报告。
实现特定的评估上下文。这使得缓存控制、命名空间定制和数据封装变得更加容易。
添加更多分词器测试以增加覆盖率。
0.2.1 (2020-05-28)
使用更少侵入性的方式修补openpyxl。不是永久性地修补读取器以支持缓存公式值,而是使用mock在读取工作簿时仅修补读取器。
这样,修补就不会干扰其他不期望这些新类的包。
0.2.0 (2020-05-28)
通过将它们包装到表达式中来支持延迟节点评估。函数将在需要时评估表达式。
支持原生Excel数据类型。
启用并更新Excel文件基于函数测试,现在它们可以正常工作了。
Flake8源代码。
0.1.0 (2020-05-25)
重构xlcalculator类型以使其更紧凑。
重新实现了评估引擎,不再生成Python代码,而是从AST节点构建正确的AST。每个AST节点都支持一个eval()函数,该函数知道如何计算结果。
这消除了在代码创建时确定评估上下文的许多复杂性,并将上下文作为生成代码的一部分进行编码。
移除所有特殊函数处理。
使用新的xlfunctions实现。
使用Openpyxl加载Excel文件。这提供了免费的共享公式支持。
0.0.1b (2020-05-03)
初始版本。
项目详情
xlcalculator-0.5.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5ea7337c3a86b0efcc1508d96345bf417387181344428be0a745e80a1fe9d1fc |
|
MD5 | 51a974dcc080edc4bd73ac5236dd2595 |
|
BLAKE2b-256 | de0788e3f269c032c089636176ae97d8915e2390312413a2df8f6809d6ccd784 |