作者lihgong ( )
看板Python
标题[心得] PyXLL
时间Fri Mar 30 14:24:53 2012
*Motivation
微软虽然邪恶, 但是Excel真的是好物, 他让资料可视化, 很方便能做分析
在工程资料分析时, 比如我有一大笔资料, 想要取出每笔数值的 bit[15:10]
我当然能利用Excel内建的函数, 组合出我需要的功能, 但是就觉得有点难用
如果处理的方式很复杂, 拼凑出来的公式会很难读
另外一个方案是使用Excel内建的VBA, 这个就能写程式了, 也有bit-wise操作
利用VBA在後端做计算, 在前端使用Excel把资料漂亮的show出来
我曾经想要学VBA, 无奈写C/Python习惯了, 看到VB的语法实在很不习惯
我投资不少时间在Python上, 如果能连结Excel和Python
就能达成後端使用Python, 前端使用Excel的理想境界...
*Solution: PyXLL
1. Excel的XLL介面能呼叫外部的DLL, third-party能为Excel开发新的程式
2. PyXLL实做了Excel XLL介面, 他会唤醒Python interpretor
把来自Excel的资料, 放到Python domain
3. PyXLL也能把Python运算结果, 回传给Excel使用
PyXLL是卖钱的工具, 不过试用不用钱, 只是开档要等15秒看log
原理其实如上面所述, 喜欢的话也可以自己写一个
http://www.pyxll.com/
*Install
1. 首先到他的网站抓安装包, 然後解压缩到任何地方, 假设是C:\PyXLL
2. 顺便在网站里, 把文件抓回来
3. 参考这个网站, 安装PyXLL:
http://www.codecho.com/execute-python-script-in-excel-using-pyxll/
4. 阅读C:\PyXLL\pyxll.cfg, 理论上不用改, 不懂的地方请参考文件
5. 编辑C:\PyXLL\examples\worksheetfuncs.py, 这里就是主菜了 !!
*worksheetfuncs.py -- basic_pyxll_function_1(), part1
废话不多说, 这个范例宣告一个函数 basic_pyxll_function_1()
@xl_func("int x, int y, int z: int")
def basic_pyxll_function_1(x, y, z):
"""returns (x * y) ** z """
return (x * y) ** z
第一行是PyXLL定义的Declarator, PyXLL的任务是沟通Excel-XLL和Python
所以一定要解决的问题是资料如何传递, 答案是@xl_func()
请参考文件, 这个declarator有专门的写法, 支援的资料型别也有限
上面的写法表示 x/y/z 是 int, 回传值在冒号以後, 也是 int
函数的本体和原本的Python没有两样, 这个函数会计算 (x*y) ^ z
Python的语法部份, 我想这里就不多说了
接下来是实际在Excel呼叫这个函数看看, 随便找个储存格输入
=basic_pyxll_function(2,2,2), 答案应该是(2*2)^2 = 16
如果看到这个数值, 恭喜, 表示已经成功打通 Python/Excel 两个世界
*worksheetfuncs.py -- basic_pyxll_function_1(), part2
这个范例说明, 怎麽重新载入PyXLL, 重新执行更新过 Python script
毕竟写程式, 没有不改source code
对这个function动点手脚, 让他呼叫另外一个函数看看
def zzz():
return 100
@xl_func("int x, int y, int z: int")
def basic_pyxll_function_1(x, y, z):
return zzz()
点选到Excel的Add-ins选单, 里面会有PyXLL, 选择Reload PyXLL
然後到储存格里, 点两下按Enter, 让他重算过, 数值就会变成100
*Document
文件的第三章, writing user defined functions, 里面有详细的叙述
记载上面提到的Declarator要怎麽写, 对应的语法, 建议看
3.1 Exposing functions UDFs
3.2 Standard argument and return types
3.3 The var type
3.4 Using arrays
第四章, 介绍PyXLL能在Excel的选单里加入一些按钮, 满酷的功能
我个人比较用不到, 不过也可以大概看一下
see also @
http://lihgong.blogspot.com/2012/03/pyxll.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.61.82.125
1F:推 timTan:看起来很不错 03/30 14:38
2F:推 Jason1122:推一下 03/30 20:31
3F:推 littleshamoo:推 03/30 22:14
4F:推 dSnAil:Oh,no没办法在非windows平台上用 orz 本来想用来export资料 03/31 03:02
5F:→ dSnAil:不过还是感谢分享,推 03/31 03:02
6F:→ uranusjr:楼上可以试试 UNO, 这是 OO.o 的套件, 有 Python binding 03/31 11:21
7F:→ ykjiang:如果只是读写 Excel cell资料,可以用 xlrd, xlwt 就好 03/31 12:38
8F:→ ykjiang:还跨平台 03/31 12:39