很久之前就想学习个关于python操作Excel文件的模块,虽然个人觉得处理EXCEL方面vba目前仍然是适合的,但是Python在处理数组上的强大(方便),以及在其它文件的操作上比vba强大不是一点两点,代码方面也要轻松简捷不少。只是由于个人各种原因给忽略了。直到遇到了Xlwings这个传说中跟VBA长的很像的模块出现。不是说其它处理EXCEL的模块功能不好,不好学习,或者什么原因(我也压根没仔细了解过),一个是缘分吧,另外一个是我除了C 这个在学校里面学过以外,就数Vba这个最熟悉了。既然碰到对的,就赶紧学起来。

再粗略地对比了一下xlwings 和vba对EXCEL的一些操作。
Xlwings | vba | ||
打开EXCEL程序 | import xlwings as xw | ||
app = xw.App(visible=False) | |||
窗口提示关闭 | app.display_alerts = False | Application.DisplayAlerts = False | |
屏幕更新关闭 | app.screen_updating = False | Application.ScreenUpdating = False | |
版本信息 | xw.App().version | application.Version | |
工作簿 | 新建工作簿 | wb = app.books.add() | Set wb = Application.Workbooks.Add |
保存工作簿 | wb.save(r'D:\test.xlsx') | wb.SaveAs ("test.xlsx") | |
关闭工作簿 | wb.close() | wb.Close | |
打开已有工作簿 | wb = xw.Book(r'D:\test.xlsx') | Set wb = Application.Workbooks.Open("test.xlsx") | |
工作表 | 第一个工作表 | sht = wb.sheets[0] | set sht= wb.sheets(1) |
单元格 | 一个单元格 | sht.range('A1').value = 'abc' | sht.range('A1').value = 'abc' |
连续单元格 | sht.range((1,1),(3,3)).value='c'sht[1:5,1:5].value = 'bb' | sht.Range("a1:b4").Value = 1 | |
按行输入列表 | sht.range('A1').value = [1,2,3] | sht.range("a1:c1").value=(1,2,3) | |
按列输入列表 | sht.range('A1').options(transpose=True).value = [1,2,3] | arr = Array(1, 35, 2) | |
读取 | arr = sht.range('B2:D5').value | arr= sht.range('B2:D5').value | |
填充颜色 | sht[2,2].color=(146, 208, 80) | Range("d25").Interior.Color= RGB(146, 208, 80) | |
最后一个非空单元格 | row1= sht.range('A50').end('up').row | row1=range("a50").end(xlup).row |
由上面的表可以看到,xlwings其实函数的很多设置上跟vba近乎一致,只是又加入了一些python的风格,另外在此基础上又做了简化。下面再介绍一下,学习过程中碰到的一些需要注意的地方:
一、函数首字母的大小写在使用xlwings的时候,函数的大小写是有严格要求的,如App、apps、Book、book、Range、range等首字母的大小写不一样,代表的函数功能是不一样的,这里大写不能用小写来代替,否则会提示找不到相关函数,或者得到不一样的结果。这个与我们VBA就不一样,vba的函数是不区分大小写的。
二、打开Excel程序。import xlwings as xw #导入模块app =xw.App(visible=False,book_add=False) app.quit() #退出EXCLEL软件
visible=False程序不可见,你已经打开了文件,但是EXCEL窗口不显示出来。book_add=False不新建工作表。
三、对象操作习惯 由我们一开始看到的xlwings的基本对象的图片,按我们正常的理解,我们需要操作工作簿,应该是通过app来打开,我们需要操作单元格,应该是取某个工作簿的工作表的某个range。在vba中,如果没有特殊指定的情况下,我们可以跳过workbook和sheet,直接用range就行了。看上面的对照表,我们可以发现,xlwings在对象这里的要求也不严格。比如说我们可以跳开app,直接通过Book打开工作簿。A、app =xw.App(visible=False,add_book=False)
wb =xw.Book(r'D:\test.xlsx')
B、
app =xw.App(visible=False,add_book=False)wb2=app.books.open(r'D:\test.xlsx')
1、这两句的打开效果是一样的。当然这里A如果不执行app这一行,直接用Book打开的话,那效果可能就不一样了,可能会有多个EXCEL程序出现。2、app.books.open 是在app = xw.App(visible=False)执行后才可以执行的,但是xw.App.books.open是不可以执行的。两个的属性是一样的。具体原因还没学习上,有兴趣的可以自行了解下。我的理解是在赋值前和赋值后,两个对象已经是完全不一样的东西了,那他们的属性当然也就不一样了(有点牵强是吧,聊胜于无呗)。
四、编号及列号
1、 在引用工作表的时候,Xlwings与vba都可以按表的编号和表名来引用,但不一样的是,xw的工作表编号是从0开始的,而vba是从1开始的。当然,单元格的编号表示就不存在这样的情况了,大家都是从1开始的。
2、 range(“a”&n),在Vba中,n必须是数值。但是,在xlwings中,n必须是一个字符串,所以如果n是数值的话,还需要进行转换,str(n)。
五、Numpy聊到数组,必须提一下numpy,由numpy产生的数组,可以直接的赋值输入到EXCEL当中。Pandas 也是可以的,只不过还没有认真学习过这模块这里就不提了。
import numpy as np
arr=np.random.random((3,3))
sht.range('A1').value=arr
除了以上提到的这些,xlwings还有很多其他的函数,后面我们可以用python的dir(),和help(),再了解一下模块都有哪些函数,根据已经看到过的文档,以及python的一些函数使用习惯,看看帮助文档里面有没有例子,逐个自行学习,补充。