关于使用xlwings的一点心得
xlwings 的使用范围
xlwings工具的作用在于帮助会Python不会excel的VBA的人的一个便捷工具,其实主要是调用了pywin32的功能,使用win32com也是可以的,但是友好性就不如xlwings了。
我目前主要使用xlwings的地方在于公司存在加密的文件中,由于大量excel文件被加密,只能在公司的电脑上使用,我本人又不太会使用VBA,所以对于excel的自动化水平实在不高。
幸运的是,我会Python和Pandas,所以在某些方面,我是不需要excel的,但是为了能对公司日常办公的数据进行处理,不得不研究如何利用Python操作Excel,事实上,xlwings帮了我很大的忙,通过xlwings我能很方便的调用Excel打开我需要的Excel文件,然后利用Pandas进行数据处理。
我最近做的比较好的是,利用xlwings进行Excel文件的批量转制和大量Excel文件的合并。
文件的批量转制
我有很多具有相同类型的和格式的Excel表格,我需要把该Excel表格的指定位置的数据提取到另一个Excel表格中,其实就是批量转制了,难点主要有两点:
1.大致一致,存在细微的不同,处理时需要多次判断
2.要读取该表格的页眉信息
我的思路也很简单,找到需要转制的表格里信息,然后全部提取到内存中,利用Pandas进行处理,然后找到我要的信息的位置,然后将指定位置的信息提取到新的表格里。关键在于一个Excel文件中包含了很多sheet表,我需要用程序筛选出我想要的sheet表,而这个表目前存在多个名字,在这里处理上我还没有找到更好的办法。读取Excel指定Sheet表的页眉信息,由于之前也是没有接触过,所以也是看了好多文档,xlwings的文档里关于这一点写的不是很明白,API文档里是没有的,所以我是使用xlwings里调用宏的功能,然后写了一个读取页眉信息的宏,然后在程序里调用这个宏,读取我需要的页眉信息,确实是成功了,整体程序思路还是很清晰的,也比较简单。
文件的合并
同一个Excel文件中有很多Sheet表,利用Excel进行合并确实很费时间,需要把所有的表格合并到一起很费时间,当然也可能是我知不道有什么更高级的办法来做到这一点,我只能用我的“笨办法”了。我用xlwings读取该Excel文件,再利用Pandas将不同Sheet表合并到一起,最后再进行筛选和计算。当然这样写代码也很费时间,不过随着代码越来越多,重复利用率很高,相对Excel的一步步操作还是省了很多时间的。用宏的话应该也是可以的,不过我并不知道该怎样用,关键是宏对于文本的处理比较蠢,相对于Python的字符串工具,Excel就显得太笨重了。
最后就是关于脚本的改进了,也是今晚突然想到的办法,也确实是自己太愚蠢了。
代码的优化
1. 如何判断Sheet表是否可见
2. 如何读取Excel某一Sheet标的页眉信息
第一个问题,也是我在数据合并和选择我需要的Sheet表时遇到的最主要的问题,有很多Sheet表是不希望见到的,也是不希望读取到的,因此我希望选择表格是希望可见的,我只需要在可见的表格里找到我需要的表格就好了,因此对于Sheet表的是否隐藏,即Sheet表的可见性在这里的逻辑判断上显得尤为重要了。我之前采用的办法比较笨,找到一个Excel文件中所有的Sheet表,然后通过多重条件判断筛选出我需要的Sheet表,但是呢,面临的情况是很容易出错,尤其是在第二个问题上,我使用了宏,也是需要这样的,实在是经常出现bug,很让人苦恼。因为我需要读取指定Excel的指定Sheet表的页眉信息,Sheet表的选择也是页眉信息获取的前提了,该如何去做好这一点呢?
这个是我程序修改必须要克服的地方,经过今晚的思考,我找到了办法,通过pywin32的api调用excel的sheet表的可见属性
for i in xw.sheets:
if i.api.visible == -1:
print(i, 'is visible')
其实要说有多难吗,其实并没有,关键是我不知道设个api的作用是什么,今晚通过通读xlwings的API文档以及看了大神们写的文章后,仔细才明白这个其实就暗含了Excel的宏的功能,完全没有必要用xlwings调用宏了。
根据这一点,我对于读取指定Sheet表的页眉信息,也有了眉目,根据之前写的宏代码,其实页眉信息主要在sheet表的pagesetup对象中:
sht = xw.sheets[0]
sht.api.pagesetup.centerheader
xlwings的封装很完美,如果能够对于xlwings的API文档更加完善就好了,尤其是关于api的功能需要与pywin32的文档更加紧密的结合起来。
不得不说,Python真的很Python,人生苦短,我用Python