因为开发的应用项目中经常需要导入数据到excel表,再基于excel表生成不同的数据透视表,以满足演示、检查以及详情查看的需求。
当然数据透视表也可以手动操作,但繁琐且经常容易出错的是,每次导入excel的数据表列数可能不用,而更新数据之后每次都要重新确定数据源然后更新,一旦忘记了数据透视表就会显示错误或错误的数据。
最近几天研究了一些朋友写的文章如一篇文章教你用python玩转数据透视表PivotTable_python数据透视表-优快云博客、10 - Python调用Excel创建数据透视表 win32com_sourcedata:=ws.range("a1")-优快云博客等等,受到很大启发,自己也照着做了尝试,有几点补充如下,供有需要的朋友借鉴:
1、win32的调用
如果用下列代码,可能会出现错误:pywintypes.com_error: (-2147417848, '被调用的对象已与其客户端断开连接。', None, None)
xls_app = win32.gencache.EnsureDispatch('Excel.Application')
在这种情况下,可以试试如下替代代码
xls_app = win32.DispatchEx('Excel.Application')
具体上面两行代码有何区别,我也不是很清楚,有了解的大神可以帮忙补充一下。
2、引用数据源
之前的帖子里面引用数据源往往用类似如下的代码
SrcData = ws.Range("A1:D5")
但实际应用场景中我们往往直接引用若干整列,比如从A列到D列,此时代码可以考虑如下:
SrcData = ws.Range(f'A:D')
进一步地,我们的数据源可能列数不同,需要根据数据源的列数来指定,此时代码可以考虑如下:
SrcData = ws.Range(f'B:{endcols}')
此处endcols是数据源最后一列的列字母,比如Z、AT等,我们往往可以通过df.shape[1]得到列数,但没法直接得到列字母,关于这个问题,我在下篇文章中说明。
3、添加行列标签
之前的帖子里面添加行列标签往往用类似如下的代码,第1行为添加行标签,第2行为添加列标签
pt.AddFields(RowFields=['a','b'])
pt.AddFields(ColumnFields=['c','d'])
我尝试后发现,第2行运行后,第1行似乎被替代了,原因不明,有了解的大神可以帮忙补充一下。
我保留了上面第1行,第2行换成了如下代码就ok了,但比较烦人的是如果需要添加多个列标签,则需要重复多个语句,这样不利于写成函数。
field = pt.PivotFields('c')
field.Orientation = constants.xlColumnField
field = pt.PivotFields('d')
field.Orientation = constants.xlColumnField
上述尝试供朋友们参考,如果错误或不当,欢迎拍砖。