Python如何操作office实现自动化及win32com.client的运用


Posted in Python onApril 01, 2020

应用背景

工作中,由于需要出定期的report,需要用到office,主要是要用到excel表格,然后给各个team或者boss发email report。这里边就包含了不少重复性的工作,工作中常常有一个固定的模板来出report,而每次只需将相关的数据手动导入,如果将这些重复性的动作,实现自动化,无疑可以省去不少功夫。于是我就想到了用python来实现自动化生成表格。今天介绍的只是一部分,主要是excel表格自动修改生成。

似乎是一个很简单的活,调用常用的与excel相关的python模块xlrd, xlwd 或者 openpyxl即可,没错,这些对excel表格进行简单操作都很666,但是我的表格里边出现了透视表,这让我非常的痛苦,一下子发现上边的三个模块不好用,而且用着用着,我还发现,openpyxl似乎是没有直接删除行的功能函数,当你复制之前一个表格为基表,更改一部分内容保存后,透视表就消失了,内心是很崩溃的,在谷歌、百度上看了不少帖子,也没有很好的办法,最后还是stackoverflow上看到一个帖子里,用到了win32com.client,刚开始看不懂,里边好多函数都不知道哪里来的,也没有文档。

最后发现,win32com.client可以直接调用VBA的库,这可就强大了,VBA是包含record macro功能的,手动操作excel直接record,你就可以找到对应的函数,然后就可以调用,一下子很多的功能都实现了。

实例

先来看看案例表格:

Python如何操作office实现自动化及win32com.client的运用 

Python如何操作office实现自动化及win32com.client的运用

这里只介绍一部分功能实现,也是主要的部分,其余的部分sheet页操作是类似的,这里会介绍一部分模块使用的方法。

第一个表格,主要需要从内部共享的文件夹中,去下载需要的Cases,都是文档类型的文件,需要将它们写入到表一中的AllCases列中,这里比较简单,我们只需要用open和readlines(),用遍历的方式将其写入到excel表中即可。然后在表二中,刷新透视表。以下我截取部分的代码,路径自己构建输入即可,我将分块来介绍。

class AutomationReport(object):

  def __init__(self, excel, win32c, folder_src, folder_dst, src, src_G, src_failed, src_flip, filepath):
    self.excel = excel
    self.win32c = win32c
    self.folder_src = folder_src
    self.folder_dst = folder_dst
    self.src = src
    self.src_G = src_G
    self.src_failed = src_failed
    self.src_flip = src_flip
    self.filepath = filepath

   def write_AllCases(self):
     # open one file and write it into excel AllCases sheet
     with open(self.src, 'r') as f:
       wb = self.excel.Workbooks.Open(self.filepath)
       sheet_AllCases = wb.Worksheets('AllCases')
       i = 2
       for case in f.readlines():
         cel = 'K%d' % i
         sheet_AllCases.Range(cel).Value = case.strip()
         i = i + 1

       # open second file and write it into excel AllCases sheet
       with open(self.src_G, 'r') as fg:
         for case in fg.readlines():
           cel = 'K%d' % i
           sheet_AllCases.Range(cel).Value = case.strip()
           i = i + 1

       # copy format or delete redundant content
       cel = 'K%d' % i
       if sheet_AllCases.Range(cel).Value is None:
         rg = "A%s:J%s" % (i-1, i-1)
         selection = sheet_AllCases.Range("A29000:J29000").Select
         selection.AutoFill(Destination=sheet_AllCases.Range(rg), Type=xlFillDefault)

       else:
         # delete redundant content
         while sheet_AllCases.Range(cel).Value is not None:
           sheet_AllCases.Rows(i).Delete()

       wb.Save()


if __name__ == "__main__":

  excel = win32com.client.Dispatch('Excel.Application')
  win32c = win32com.client.constants

  # input your path
  folder_src = ...
  ...
  # Excel table file path
  filepath = ...

  # Object instance and invoke functions
  t = AutomationReport(excel, win32c, folder_src, folder_dst, src, src_G, src_failed, src_flip, filepath)
  t.copyFile()
  t.write_AllCases()
  t.write_ReportRaw()

遍历文件内容

遍历文件,写入cases,代码如下,用win32com.client模块(self.excel)打开我们需要修改的表格文件(self.filepath),用wb.Worksheets(‘AllCases')打开sheet页'AllCases',注意Worksheets的W是大写的,也记得加上s,用f.readlines()来读取每一行,将每一行用for in 遍历写入一个表格,这里边的Range(‘A1')表示单元格A1,加上.Value就是它的值。

with open(self.src, 'r') as f:
   wb = self.excel.Workbooks.Open(self.filepath)
   sheet_AllCases = wb.Worksheets('AllCases')
   i = 2
   for case in f.readlines():
     cel = 'K%d' % i
     sheet_AllCases.Range(cel).Value = case.strip()
     i = i + 1

强大的win32com.client

通过以下这种方式就可以调用VBA的函数模块了,如果你要用word,更改成 ' Word.Applicaiton ' 即可。第一个是启用excel,第二个用于调用一些VBA中固有的变量,比如调用某个属性,直接在其前边加上即可。

excel = win32com.client.Dispatch('Excel.Application')
win32c = win32com.client.constants

运用这个,我们就可以调用VBA的一些函数模块,比如删除行的功能,在openpyxl中,我没有找到直接删除行的功能,而win32com,可以采用如下方式进行删除行:

sheet_AllCases.Rows(i).Delete()

这里边需要注意的是,VBA中Delete或者很多函数是不加括号调用的,我们在python中,需要添加括号才可以用。

以下是填充上一行的格式,就是我们常用的下拉复制:

rg = "A%s:J%s" % (i-1, i-1)
selection = sheet_AllCases.Range("A29000:J29000").Select
selection.AutoFill(Destination=sheet_AllCases.Range(rg), Type=xlFillDefault)

透视表的功能实现:

def write_ReportRaw(self):
   # open excel and active sheet
   wb = self.excel.Workbooks.Open(self.filepath)
   sheet_ReportRaw = wb.Worksheets('ReportRaw')

   # refresh Pivot table for All cases and Failed Cases
   sheet_ReportRaw.PivotTables("PivotTable3").PivotCache().Refresh()
   sheet_ReportRaw.PivotTables("PivotTable4").PivotCache().Refresh()

   wb.Save()

这些函数,你无需上网去找,可以直接打开excel表格,在view下有一个Macros,采用Record Macros,然后手动去刷新透视表,停止record,view macro就可以看到刷新透视表的代码了,可以直接copy过来,将相应的参数更改,同时要记得添加括号,上边中,PivotCache()如果没加括号,无法使用。

其他的功能,可以根据自己的需要进行调用。

注意点

使用win32com.client可以让你更加顺利的处理各种excel或者word的复杂情况,相比于openpyxl, xlrd, xlwd功能会更加齐全。但使用过程中,也要注意一些点:

  • 前边说到的,要对函数加括号
  • python虽然并不是特别在意大小写,但是使用win32com.client一定要注意大小写,很多函数如果不区分大小写,是无法调用的,比如打开excel表格的Open函数,'O'必须大写,还有wb.Save(),‘S'也必须大写,而我们使用openpyxl使用小写即可。
  • openpyxl在保存时用save(),很多原有的格式图表是无法保留下来的,比如对excel进行修改,里边原有的透视表,用openpyxl的save()是无法保存的,但是使用win32com.client的wb.Save()却是可以保存这些图表的,这也是更加方便的地方。
  • 关于VBA函数模块调用,直接采用录制宏的方式获取,无需去找文档,这也是更加方便灵活的地方。

到此这篇关于Python如何操作office实现自动化及win32com.client的运用的文章就介绍到这了,更多相关Python操作office自动化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
13个最常用的Python深度学习库介绍
Oct 28 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 Python
pandas or sql计算前后两行数据间的增值方法
Apr 20 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
利用Python复制文件的9种方法总结
Sep 02 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
聊一聊python常用的编程模块
May 14 Python
bat批处理之字符串操作的实现
Mar 16 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 #Python
Python AutoCAD 系统设置的实现方法
Apr 01 #Python
django实现模型字段动态choice的操作
Apr 01 #Python
Python气泡提示与标签的实现
Apr 01 #Python
django 多数据库及分库实现方式
Apr 01 #Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 #Python
Django更新models数据库结构步骤
Apr 01 #Python
You might like
IStream与TStream之间的相互转换
2008/08/01 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
获取url中用&隔开的参数实例(分享)
2017/05/28 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
小程序实现投票进度条
2019/11/20 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
大学团支书的自我评价分享
2013/12/14 职场文书
保险公司晨会主持词
2014/03/22 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers