多年来我一直想学VBA——微软Visual
Basic的改造版、用来编写excel宏的编程语言,但由于各种原因一直拖延着没学。它并不是一种很难学的语言,只是因为它不是我的主要工作内容,我一直没腾出时间来学它。昨晚,我跟随着Twitter上的一个链接发现了
DataNitro,五分钟后我学会了VBA。

前言

从网页爬下来的大量数据需要excel清洗
成堆的科学实验数据需要导入excel进行分析
作为一名面向逼格的Python程序员
该如何合理而又优雅的选择生产力工具呢?

得益于辛勤劳作的python大神们,处理excel已经有大量python包,主流代表有:

  • xlwings:简单强大,可替代VBA

  • openpyxl:简单易用,功能广泛

  • pandas:使用需要结合其他库,数据处理是pandas立身之本

  • win32com:不仅仅是excel,可以处理office;

  • Xlsxwriter:丰富多样的特性,直接创造一份美观大方的excel,代码即一切;

  • DataNitro:作为插件内嵌到excel中,可替代VBA,在excel中优雅的使用python

  • xlutils:结合xlrd/xlwt,老牌python包,需要注意的是你必须同时安装这三个库

面对形形色色的扩展包,有时候会感到困惑,到底哪个包才是最适合自己的呢?
本文将从配置环境、文档操作、基本功能等方面比较以上扩展,让您能结合自己的生产环境,选择最适合自己的Excel操作库,同时自信的对其他库:你是个好扩展,可我们不合适!
下面,我们通过多方面的比较,让您对这些扩展有一个基础的了解。


转载请注明,来自微信公众号:以为以为

DataNitro是个excel插件,能够让你在Excel里运行Python脚本,因为我在某种程度上算是擅长Python,我根本不需要使用VBA。也许这并不是在5分钟内学会了VBA,而是成功的完全绕过了它。对于我来说,这跟学会了它一样有效。

1.环境配置

再好的模块,也需要在正确的 Python 版本以及 Excel 版本才可运行。

Paste_Image.png

所有库都支持Python2和python3。
需要注意的是Xlutils仅支持xls文件,即2003以下版本。同时win32com与DataNitro仅支持windows

编程往往不是人们感兴趣的话题。但它很有价值,除了专业的软件开发工程师,也就是所谓的程序员,很多人在工作中其实都会不同程度的涉及到。即使没有刚性的需求,很多工作若以编程适当助力,往往可以提升效率。并且,不仅仅是工程技术人员可以从中受益,早在
1980
年代,作家王小波就自己写程序满足日常写作的需求以及提高创作效率了。

大家是否还记得在《骇客帝国》里的那个DVD播放器?它能连接到你的大脑来教会你功夫。DataNitro就像那个东西,只是它是给Excel笨蛋准备的。它很可能帮我节省了数百小时在VBA里面挣扎、自学、尝试、纠错的时间。

2.文档操作

由于设计模式的不同,导致基本的新建文件、修改文件、保存文件等功能在不同的库中存在着一定差异,比如xlsxwriter并不支持打开或修改现有文件,xlwings不支持对新建文件的命名等等,DataNitro作为excel插件依托于excel本身的操作。详见下图

Paste_Image.png

我们今天要展开的就是针对「非程序员」编程的话题,让我们一项一项讨论。

图片 1

3.基本功能

由于设计目的不同,每个模块通常着重于某一方面功能,各有所长。

xlwings

可结合 VBA 实现对 Excel
编程,强大的数据输入分析能力,同时拥有丰富的接口,结合
pandas/numpy/matplotlib 轻松应对 Excel 数据处理工作。

openpyxl

简单易用,功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护等等功能应有尽有,图表功能是其一大亮点,缺点是对
VBA 支持的不够好。

pandas

数据处理是 pandas 的立身之本,Excel 作为 pandas 输入/输出数据的容器。

win32com

从命名上就可以看出,这是一个处理 windows 应用的扩展,Excel
只是该库能实现的一小部分功能。该库还支持 office
的众多操作。需要注意的是,该库不单独存在,可通过安装 pypiwin32 或者
pywin32 获取。

xlsxwriter

拥有丰富的特性,支持图片/表格/图表/筛选/格式/公式等,功能与openpyxl相似,优点是相比
openpyxl 还支持 VBA
文件导入,迷你图等功能,缺点是不能打开/修改已有文件,意味着使用
xlsxwriter 需要从零开始。

DataNitro

作为插件内嵌到 Excel 中,可完全替代 VBA,在 Excel 中使用 python
脚本。既然被称为 Excel 中的 python,协同其他 python
库亦是小事一桩。然而,这是付费插件…

xlutils

基于 xlrd/xlwt,老牌 python
包,算是该领域的先驱,功能特点中规中矩,比较大的缺点是仅支持 xls 文件。

  1. 以解决问题为目的

我写这篇文章不是来为DataNitro做广告的,而是想谈谈对编程这种工作发展方向的思考。几天前,Brooklyn
Bridge Ventures的Charlie
O’Donnell写了一篇非常好的博客叫做“最后一个程序员”,文章里他预测前端开发平台终有一天会致使整个软件开发部门废弃。当这些平台不断的增多不断的传播后,强大的软件开发需要的编码工作越来越少,越来越多的人能够参与进来。

4.性能

我们对几个库做了最基本的写入和读取测试,分别使用不同库进行添加及读取
1000行 * 700列
数据操作,得到所用时间,重复操作取平均值。另外在不同的电脑配置,不同的环境下结果肯定会有出入,数据仅供参考。

Paste_Image.png

编程不是说非要做一个什么系统出来,我们的目的是要解决问题,所以首先要想清楚解决的是什么问题。大多数情况,可以归结为两类:一类是,我们希望把那些重复的工作交给软件去完成,从而节约人的时间;另一类是,我们要针对特定领域进行特殊的计算和分析,我们对这个领域很熟悉,但需要借助软件解决这个领域的一些问题。

程序员因此会消失吗?

这要看你如何定义程序员。如果这样说,那些每天花15小时在黑屋子里堆砌0和1的人才算是程序员,那我支持Charlie的论断,这种职业最终会被一点点的侵蚀掉,因为越来越优秀的“前端”平台会排挤掉众多的编码工程。

但从另外一个视角来看,我是一个“程序员”,因为这些平台能使我更快的开发出软件,而且不需要经过正规的培训,我想程序员的数量在很长的一段时间里都会不断的增加。

曾经有个时期,即使在MD-DOS上开发一个很简单的程序也要经过相当漫长陡峭的学习曲线过程。这越来越平坦的学习曲线归功于Apple和
Windows开放的个人电脑走向大众。类似的,当各种平台使开发工作越来越容易后,越来越多的人能轻松的上手编程,而不需要花3或6个月的时间去学
VBA。

除此以外,具有相同道理的是,科学家不会因为科学的进步而丢掉他们的工作,软件开发平台的进步会使人成为“真正的编程者”——他们不想要去码字符,他们能更多的专注于复杂的、富有挑战的、能产生重大影响的工程项目上。如果你是一个专业的程序员,这不正是你所期望的吗?

DataNitro只是成千上万的推进这种趋势前进的平台中的一个。粗略的想了一下,这里还有四个年轻的公司充当着这种“更少代码”的接口服务,它们使众多的项目避免了开发的痛苦:

  • FRAPI – 即时生成API
  • Monetate – 轻松A-B测试和 MVT网站测试(an
    OpenView portfolio company)
  • IFTTT – Instant mashups of your favorite
    personal programs
  • Zapier – 企业版IFTTT

[本文英文原文链接:Coding is Dead. Long Live the
Coders
]

本文转载自: 外刊IT评论

5.小结

通过以上的分析,相信大家对几个库都有了简单的了解。在编写文章的过程中,笔者也在思考各个库最适合的应用场景。

  1. 不想使用 GUI 而又希望赋予 Excel 更多的功能,openpyxl 与
    xlsxwriter,你可二者选其一;
  2. 需要进行科学计算,处理大量数据,建议 pandas+xlsxwriter 或者
    pandas+openpyxl;
  3. 想要写 Excel 脚本,会 Python 但不会 VBA 的同学,可考虑 xlwings 或
    DataNitro;
  4. 至于 win32com,不管是功能还是性能都很强大,有 windows
    编程经验的同学可以使用。不过它相当于是 windows COM
    的封装,自身并没有很完善的文档,新手使用起来略有些痛苦。

你可根据自己的需求和生产环境,选择合适的 Python-Excel 模块。


当面对的问题,没有成熟的软件帮我们解决时,我们可以考虑通过适当的编程工作来解决。问题分析清楚,解决问题的道路就会平坦一些。

6.代码

  1. 如何选择编程语言

6.1 xlwings基本代码

import xlwings as xw

#连接到excel
workbook = xw.Book(r'path/myexcel.xlsx')#连接excel文件
#连接到指定单元格
data_range = workbook.sheets('Sheet1').range('A1')
#写入数据
data_range.value = [1,2,3]
#保存
workbook.save()

编程语言的选择取决于要解决的问题。编程语言没有好坏,更没有尊卑,只有合适不合适,能解决问题的语言就是好的语言,这是大的原则。

6.2 xlsxwriter基本代码

import xlsxwriter as xw
#新建excel
workbook  = xw.Workbook('myexcel.xlsx')
#新建工作薄
worksheet = workbook.add_worksheet()
#写入数据
worksheet.wirte('A1',1)
#关闭保存
workbook.close()

在这个大的原则基础上,我们可以考虑以下几个方面:

6.3 xlutils基本代码

import xlrd #读取数据
import xlwt #写入数据
import xlutils #操作excel
-----#xlrd库
#打开excel文件
workbook = xlrd.open_workbook('myexcel.xls')
#获取表单
worksheet = workbook.sheet_by_index(0)
#读取数据
data = worksheet.cell_value(0,0)
----#xlwt库
#新建excel
wb = xlwt.Workbook()
#添加工作薄
sh = wb.add_sheet('Sheet1')
#写入数据
sh.write(0,0,'data')
#保存文件
wb.save('myexcel.xls')
-----#xlutils库
#打开excel文件
book = xlrd.open_workbook('myexcel.xls')
#复制一份
new_book = xlutils.copy(book)
#拿到工作薄
worksheet = new_book.getsheet(0)
#写入数据
worksheet.write(0,0,'new data')
#保存
new_book.save()

学习曲线:学习曲线过于陡峭的语言显然不适合「非程序员」,主要是考虑投入的时间和获得的效果,同样的条件下要选那些易于使用上手的语言开始。

6.4 win32com基本代码

import win32com.client as wc
#启动Excel应用
excel_app = wc.Dispatch('Excel.Application')
#连接excel
workbook = excel_app.Workbooks.Open(r'e:/myexcel.xlsx' )
#写入数据
workbook.Worksheets('Sheet1').Cells(1,1).Value = 'data'
#关闭并保存
workbook.SaveAs('newexcel.xlsx')
excel_app.Application.Quit()

成熟度:不要赶时髦选择那些新推出的,尚未成熟的语言,往往有很多「坑」,会有很多不必要的麻烦。

6.5 openpyxl基本代码

 import openpyxl
 # 新建文件
 workbook = openpyxl.Workbook() 
 # 写入文件
 sheet = workbook.activesheet['A1']='A1'
 # 保存文件 
 workbook.save('test.xlsx')

欢迎加入 Crossin的编程教室
crossincode.com
新手入门QQ群:522415386
微信请加 crossin11 留言入群(新手/进阶)

库资源:要和想解决的问题匹配,不要企图自己重造轮子,一个语言的背后就是一个工具体系,要看这个工具体系里是不是涵盖了你的需求。除了语言本身的库,还要考虑整个语言生态上提供了哪些软件包可以直接拿来用,这往往是最有价值的部分。

文档和社区:文档是否全面详尽,是否有活跃的社区也很重要。当你需要帮助时,详尽的文档是最好资料,活跃的社区可以提供丰富的经验资料,当遇到疑难问题也更容易找到渠道去讨论。

  1. 快速取得进展

明确了问题,选择好语言和相应的库、软件包等。然后,最重要的是以最快的速度写出第一个可以运行的程序,哪怕只是简单的输出一些信息。

因为走完第一步,才表明你选择的语言和工具等已经安装和配置完好,是可以实际运行起来的,有了这个基础,后续的所有步骤才会顺利。

然后,最好把你要解决的问题的关键部分提取出来,简化一下,写程序去验证下是不是可以达到预想的效果。用最简化的方式去验证最关键的部分,写出可以运行的程序。

在这个基础上去逐步完善,一小步一小步去丰富和验证,只到最终达到满意的效果。

不要一开始就大而全,不要过度设计,把问题的关键点找到,从这里开始,然后去不断的迭代完善。

  1. 获取高质量的网络资源

最好从原始的文档入手,不要急于求成去看那些二手资料。大多数语言都有官方网站和官方文档,这些是最有效的学习资料。另外,还要推荐一个网站:

stackoverflow.com

这是一个软件开发的问答社区,人们开始用一个新的语言遇到的问题,在这个网站上几乎都有人问过,并且得到了很好的回答。如果需要,去相应的语言目录下去找即可。当然,也可以搜索想要的内容,如果需要可以开新的问题提问。

如果一定要用搜索引擎去查询一些问题,这里分享一个经验,通常,来自这两个源的内容质量还可以:

一个是来自网易博客,网址里含有:blog.163.com
;另一个是博客园,网址里含有:cnblogs.com
。这里还有一批软件开发业者坚持更新他们的 blog ,积累了一些优质内容。

  1. 常见语言的特点和适用场景

VBA – 是微软 Office 系列内嵌的脚本语言,如果面对的问题和 Excel 、Word
相关,并且已有的功能解决不了这样的问题,那么可以考虑用 VBA
来写一些扩展来解决问题。

更多信息参见:

Windows Batch Script – 是 Windows
平台上的批处理语言。适合完成一些需要重复操作的任务,比如批量的文件处理,把不同命令行工具整合起来完成特定的任务等。

更多信息参见:

Python –
适用范围很广,学习曲线也比较平滑。拥有丰富的库和开源资源供选择,并且安装、运行都比较方便。

更多信息参见:

Java –
拥有广泛和成熟的资源,文档和社区也比较健全。唯一的缺点是,对于非工程化的应用场景显得过于繁琐,不像
Python 那么简单易于部署。

更多信息参见:

C 语言 –
有着广泛的适用性,很成熟的一门语言。在用它之前,要彻底想清楚,用它解决什么样的问题。因为,大多数需要用
C 实现的事情都已经有了对应的其他解决方案了,也就是不需要重新造轮子了。

不过 C 可以写比较原始的数据运算,编译成命令行程序,和 Windows
批处理脚本结合起来应用是一个不错的选择。

更多详细信息参见:

R 语言 –
一种针对统计分析的编程语言。之前的文章里提到过,适用于做数据分析的场景。

更多信息:

Lua – 一种小型脚本语言,很多游戏引擎里应用的就是 Lua
这种小而精悍的语言。Lua 可以和 C
语言无缝结合,是一种很灵活的解决方案,这个语言的接受度和普及度要小一些,但很成熟,也很实用。不过,学习曲线稍微陡峭一些。

更多详细信息参见:

更多其他语言我就不再列举了,下面这个网址列车了 2016 年的 20
大编程语言排行,有兴趣可以去了解下:

转载请注明,来自微信公众号:以为以为