Excel python插件简评
VBA是MS Office的杀手锏,它在办公自动化、数据处理等方面的强大功能目前几乎无法替代,这也是我们没办法抛弃MS office转用更轻巧的WPS等其他办公软件的原因。但是VBA诞生已有二十多年,我从office 2003开始学习使用VBA,到现在的office 2016,这十年来基本没感觉出它有什么变化。时代在发展,现在的VBA实在是显得有些老迈了,在用过Python后再写VBA总会觉得是种煎熬。
最近有新闻说微软考虑将Python引入Excel,让它成为官方支持的脚本语言。由于新闻来源只是微软的一个反馈调查而已,所以我对这个事情并不太乐观,即使微软真要支持Python,估计也不是短期内可以实现的。不过话说回来,不管是不是真的靠谱,这个前景还是非常值得期待的。
虽然微软官方还没有支持Python,但实际上民间早就有许多支持在Excel里面用Python进行数据操作的插件了。去年做论文的时候试用过两个最有名的:xlwings和DataNitro,当时体验并不太好,但是现在已时隔一年多,或许它们都有所改进,所以有必要再试试。
1. 简介
1.1 DataNitro
DataNitro是MIT的学生于2012年启动的一个项目,目前是收费软件,价格相当贵——最便宜的Essential版都要99美元,支持30天试用。
在功能上,DataNitro集成有一个交互式命令行工具(Python Shell),可以直接在Shell中编写Python代码与Excel进行交互。此外, DataNitro还支持加载、运行外部Python脚本文件,并能在Excel中调用外部脚本中的Python函数,实现扩充Excel公式的效果。
安装DataNitro后会自动在Excel中新建一个选项卡,可以直接通过选项卡打开Python Shell,进行Python脚本的导入、运行、停止等操作。
1.2 xlwings
xlwings是一个开源的Excel Python插件。xlwings的功能和DataNitro大同小异。根据官方介绍,xlwings支持Python脚本与Excel的交互;其语法接近VBA;可以“替代(Excel的)VBA宏”;支持用户自定义函数(即Excel中的自定义公式)等。
xlwings可以直接使用pip来安装,非常方便。通过pip安装xlwings后即可通过Python代码直接与Excel进行交互,但是pip安装并不会在Excel中添加扩展和选项卡页扩展(当然这不是必须的,只是方便设置环境变量等而已),Excel 扩展可单独另行安装,扩展安装后界面如下。
2. 主要功能对比
DataNitro和xlwings在功能上相差不大。二者都能打开Excel文件;都能对已打开的工作簿进行读写操作;都能修改单元格及单元格区域(Cell和Range)的颜色;都能添加超链接;都支持对指定单元格设置公式等。此外,二者都支持pandas、numpy等第三方Python包,可以极大的增强Excel的数据处理能力。
两个软件也有一些功能差异(见下表)。这些功能差异中比较重要的大概有两点:
- Python版本支持: 由于Python 2的字符编码让人非常头疼(Unicode和str转换永远搞不清楚怎么回事),而我要处理的又全是文本数据,所以现在已经转用对Unicode天然支持得极好的Python 3了,因此这两个插件能否支持Python 3对我而言非常重要。DataNitro官方声称支持Python 3,但是虽然我系统中安装的是Python 3,默认安装DataNitro后还是只支持Python 2.7,这一点很不友好。xlwings在这方面做得就好得多了,pip安装后即完美支持Python 3。
- Range格式支持: 根据各自官方文档的描述,DataNitro和xlwings对与Excel格式的支持有些区别:前者支持对单元格(及Range)的颜色、字体、字号、加粗、斜体、下划线、上下标、对齐方式等常用格式属性进行修改。xlwings的官方文档中Range对象则只有一个color属性,用来修改Range的背景色。但是,因为xlwings其实是pywin32的一个封装,所以我们可以通过Range的api属性来访问所有VBA自带的属性(如
sht.range('A1').api.Font.ColorIndex = 3
可以把A1单元格的字体颜色改为红色),理论上也就可以修改所有Excel中的格式信息了(官方并不推荐这种做法,因为api调用的VBA语法丑陋且不符合Python风格)。
功能 | DataNitro | xlwings |
---|---|---|
Python版本支持 | 默认Python2.7 | Python 2.7/3.3+ |
自带编辑器 | √ | —— |
自带Shell | √ 使用系统Shell操作当前Excel似乎并不方便 | 无自带Shell,但使用系统Shell操作Excel非常方便 |
修改字体、字号等格式信息 | √ | 通过api支持 |
形状 | —— | √ |
图表 | —— | √ |
两个插件在脚本运行方式上也有比较明显的区别。DataNitro有Shell直接运行代码
和加载外置py文件
两种模式;xlwings则可以脱离Excel直接运行外置py代码,也就是说你可以使用任何第三方编辑器或IDE编写、运行和调试相关代码,也可以通过直接在文件管理器中直接运行写好的py文件来控制Excel。DataNitro和xlwing运行代码的方式各有优劣:前者的Shell模式可以非常方便的编写一些小程序,并迅速在Excel中执行,但是缺点是不方便调试(它的加载外置py文件模式也有调试不便的问题);后者没有内置Shell和编辑器,必须使用第三方编辑器编写代码,但是优点是调试非常方便。于我而言,后者更加合适。当然,如果微软真能把Python内置到Excel里面,可以把Python代码像VBA代码一样存储在xls、xlsm等文件内部,那就更方便了!
3. 性能测试
众所周知,VBA的运算速度相当慢,并且一旦处理的数据量稍大(运算时间超过几秒钟)就会使VBE(代码编辑器)连同主程序(Excel、Word等)一起失去响应而假死,体验非常差。
Python虽不以速度见长,但是和VBA相比也几乎是飞机和马车的差别了。当然,具体到这两个插件上,它们的运行效率可以分两个方面来看:一是Python内部的运算速度,二者当然都比VBA快;二是与Excel的交互速度(即读取、修改Excel表格内容的速度),由于二者都是通过Excel提供的API与之交互的,因此这个速度应该会慢于VBA直接处理表格内容的速度。事实上,根据我的测试,无论是DataNitro还是xlwings,它们读取和写入表格内容的速度也确实都比VBA要慢,当处理的数据量较大的时候,速度差别也会更加明显。当然,在许多时候,我们可以通过减少读写Excel内容的方法来规避交互速度慢的缺点。比如,可以一次性将要处理的数据区域的内容读取到内存中(两个插件都可以把一个连续的Range中的值读取并存储为一个二维列表,也可以把一个二维列表一次性写入表格中的指定区域),然后通过Python对数据进行处理并将处理结果打包为一个二维列表,最后一次性写入Excel中,这样程序只需要和Excel进行两次交互就能完成任务,可以极大程度的减少程序所耗费的时间。经过测试,一个使用VBA需要一分多钟才能完成的任务,使用xlwings只需3-4秒即可完成。
DataNitro和xlwings在速度上也有些差异,这主要体现在Python的加载速度上。DataNitro在这方面更有优势,无论是使用内置Shell还是加载外部脚本,都可以在1秒内完成初始化过程,而xlwings则至少需要两三秒钟。当然,初始化完成后,后面的运行速度应该不会有什么区别,DataNitro的优势也只体现在这两三秒上而已。
4. 小结
和去年相比,这两个插件似乎都有明显的进步,一定程度上来说它们都可以替代VBA的绝大部分工作了。两个软件也各有优劣势,DataNitro在速度上小有优势,语法似乎也更为简洁,内置支持的Excel特性也更丰富,但是调试不便,对Python 3 的支持也不够人性化,更致命的是99刀起步的售价实在是太贵。xlwings虽在速度上略逊一筹,但原生支持Python 3,调试更是非常方便,最关键的是开源免费!所以如果要二选一,我选xlwings!