excel 公式作为算法程序,可行吗?

2022-02-16 17:34:22 +08:00
 wxiao333

有这么一个需求: 把一个巨复杂的 excel 里面的公式代码化,这个 excel 有多复杂呢,大概 10 几个 sheet ,每个 sheet 里面都有大量公式计算,一共有 50 多个输入参数,50 多个输出量,中间环节变量超过 1000 个。。。

现在要把这个 excel 代码化,工作量是蛮大的,想到一个办法:

能不能把这个 excel 当做一个计算程序,参数丢给 execl 输入数据的相应位置,立马就能出计算结果,去相应位置获取结果即可,省去了编码。

这个需求 python 或其他语言下 有可以实现的库吗 或者有其他更好的解决方案吗?

4661 次点击
所在节点    Python
28 条回复
ttys001
2022-02-16 17:41:16 +08:00
你说的这些大量公式是指什么?如果是加减乘除三角函数对数和幂这类初等运算,python 搞这种不要太轻松~
lyquan
2022-02-16 17:46:38 +08:00
R 语言处理可能会简单点,读取,计算,输出都有相应的包
czfy
2022-02-16 17:49:32 +08:00
excel 做计算,理论上应该会很慢
ospider
2022-02-16 17:58:05 +08:00
完全可以搞啊,如果你这个每分钟请求在个位数的话。估计得用一台 Windows 的机器,然后用 COM 操纵 Excel 就行了。如果要转 Python 代码的话,你可能需要把这些公式都转换成 AST ,然后再生成 Python……相当于写了一个 Excel 到 Python 的编译器
wxiao333
2022-02-16 18:07:52 +08:00
@ttys001 现在的痛点其实是不想写这么多业务代码,excel 相当于已经有了业务代码,就想直接用这个东西。
wxiao333
2022-02-16 18:08:27 +08:00
@ospider 谢谢哈,请问下 AST 全称叫什么,我研究下
Origami404
2022-02-16 18:08:29 +08:00
我觉得要是不怕麻烦的话,可以写一个工具来总结这些单元格的依赖,比如 a3=a1+a2 之类的;然后这就是一颗表达式树,下次输入直接表达式求值就可以了。但是如果 excel 里使用了很多 excel 函数的话可能还得造很多轮子,而且一些依赖(比如 vlookup )不是那么好总结的
wxiao333
2022-02-16 18:08:48 +08:00
@czfy 慢点没关系,能实现功能就行,这个需求对速度要求一般
lntouchables
2022-02-16 18:12:52 +08:00
可以做,我们这边刚开始做对速度要求不高的时候就是起一个 windows 服务器,在上面操作 excel 算的,最后拿个结果
gengchun
2022-02-16 18:13:51 +08:00
Python 的话,有一个叫 formulas 的包,干这个事情的。不过有些学习成本。

https://formulas.readthedocs.io/en/stable/doc.html
czfy
2022-02-16 18:16:24 +08:00
@wxiao333 呃为什么不考虑把数据 import 到 python 做完计算再导出 excel ?
kkocdko
2022-02-16 18:22:10 +08:00
@wxiao333 AST 是“抽象语法树”

低性能+高兼容性:建议还是依赖 Excel 裹一层会比较好,如 4# 所说的方案。

中等性能+一般兼容性:openpyxl ,相当于一个特殊的 Excel 实现,不支持某些犄角旮旯的公式。
ttys001
2022-02-16 18:54:24 +08:00
@wxiao333
你的意思是现在这个 excel 已经弄好了这一堆乱七八糟的计算公式了,有没有什么包能够把 excel 表导入进 python 后自动生成这些计算公式的 py 代码?
听上去是个不错的需求🤔
ttys001
2022-02-16 18:57:04 +08:00
wxiao333
2022-02-16 19:06:25 +08:00
@czfy 计算过程太复杂,上千个步骤和中间变量,不想去写这些业务代码,而且还要先花时间去理解这个流程,理解错了的话还容易出 bug 。
secondwtq
2022-02-16 19:24:42 +08:00
理论上当然可行,但是你在什么场景下用呢,比如你要放 Linux 服务器上跑那可能有些库就没法用
Jooooooooo
2022-02-16 19:28:22 +08:00
肯定是可以的, 因为 excel 图灵完备.
kilasuelika
2022-02-16 20:28:06 +08:00
@wxiao333 没必要搞 AST 那些,这个是计算机科学领域比较专业的东西。

你的需求实现是很简单的,首先用 python 操作 excel 文件(比如 openpyxl )在指定位置写入数据。然后在 python 中调用函数用 excel 打开这个文件( win32com.client ),excel 会自动进行计算,再保存这个文件。接着再打开这个文件读取指定位置的数据就可以了。
kilasuelika
2022-02-16 21:00:35 +08:00
@wxiao333 给你一段测试代码:

# 处理路径
from pathlib import Path

# 创建一个带公式 Excel
from openpyxl import Workbook

wb = Workbook()
excel_file = 'original_book.xlsx'
calculate_excel_file="cal_book.xlsx"

ws = wb.create_sheet(title="NewSheet")
ws['A1']=5
ws['A2']=7
ws['A3']="=A1+A2" #创建一个公式

wb.save(excel_file)

#调用 win32com 进行计算
import win32com.client as win

excel=win.Dispatch('Excel.Application')
excel.DisplayAlerts = False
target_wb=excel.Workbooks.Open(str(Path(excel_file).absolute())) #注意要完整路径
target_wb.SaveAs(Filename=str(Path(calculate_excel_file).absolute()))
target_wb.Close()


# 打开计算过的文件
from openpyxl import load_workbook
wb = load_workbook(filename = calculate_excel_file, data_only=True) #要加 data_only ,要不然输出的还是公式。
sheet = wb['NewSheet']
print(sheet['A3'].value) #输出 12
a132811
2022-02-16 21:26:46 +08:00
可以,你要先熟悉一下关于 excel 的 sdk (主要是 openpyxl ),就是 @kilasuelika 给的例子那样

另外我写过一个 excel 解析、保存工具: https://github.com/ahuigo/xlparser 或许对你有帮助

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834309

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX