word和excel是办公过程必不可少的两个文档类型,word多用于文字处理,比如备忘录、论文、书籍、报告、商业信函等,excel可以制作精美的图表,还可以计算、分析、记录数据。二者在功能达成上有重叠,工作过程中经常需要转换,如果内容少,还可以手动解决,但是一旦数据量庞大,靠手动,耗时费力不说,还很容易出现差错,今天以两个实例,教大家如何用Python实现word和excel之间的转换。
比如有这样一份Word文档
一共有近2600条类似格式的表格细栏,每个栏目包括的信息有:
- 日期
- 发文单位
- 文号
- 标题
- 签收栏
需要提取其中加粗的这三项内容到Excel表格中存储,表格样式如下:
也就是需要将收文时间、文件标题、文号填到指定位置,同时需要将时间修改为标准格式,如果是完全手动复制和修改时间,依照一个条目10s的时间计算,一分钟可以完成6条,那么最快也需要:
2600/6=433.3(min)
而这类格式规整的文件整理非常适合用Python来执行,好的那么接下来请Python出场,必要的信息我在代码中以注释信息呈现。
首先使用Python将Word文件导入
再把问题逐个划分
首先尝试获取第一张表第一个文件条目的三个所需信息
仔细观察可以发现一个文件条目占据了3行,所以对表格全部行循环迭代时可以设步长为3
注意观察表格,按照row和cell把所需内容解析清楚
接下来需要解决的是,时间我们获取的是 2/1 这种 日/月的形式。我们需要转化成 YYYY-MM-DD格式,而这利用到datetime包的strptime和strftime函数:
strptime: 解析字符串中蕴含的时间
strftime: 转化成所需的时间格式
这样一张表的内容解析就完成了,注意这里用的是table[0]即第一张表,遍历所有的表加一个嵌套循环就可以,另外也可以捕获异常增加程序灵活性
信息解析和获取完成就可以导出了,用到的包是openpyxl
在最内层解析循环的末尾加上如下代码即可
线程的最后记得保存
运行时间在10分钟左右,大概离开了一会程序就执行结束了
代码很简单,理清思路最重要
我们再以一个案例来讲解如何使用Python从Excel中计算、整理数据并写入Word中,其实并不难,主要就是以下两步:
- openpyxl读取Excel获取内容
- docx读写Word文件
需求确认
首先来看下我们需要处理的Excel部分数据
可以看到数据非常多,并且还存在重复数据。而我们要做的就是对每一列的数据按照一定的规则进行计算、整理并使用Python自动填入到Word中,大致的要求如下
上面仅是部分要求,真实需要填入word中的数据要更多!
除了对按照格式进行处理并存入Word中指定位置之外,还有一个需求:最终输出的word文件名还需要按照一定规则生成:
OK,需求分析完毕,接下来看Python如何解决!
Python实现
首先我们使用Python对该Excel进行解析
利用openpyxl读取单元格有以下几种用法
明白了原理我们就可以解析获取Excel中的数据了
通过上面的代码,我们就成功的从Excel中提取出来数据,这样Excel部分就结束了,接下来进行word的填表啦,由于这里我们默认读取的word是.docx格式的,实际上读者的需求是.doc格式文件,所以windows用户可以用如下代码批量转化doc,前提是安装好win32com
不过在Mac下暂时没有好的解决策略,如果有思路欢迎交流,好了有docx格式文件后我们继续操作Word部分
确定好每个表格数后即可进行相应的填报操作,table的用法和openpyxl中非常类似,注意索引和原生python一样都是从0开始
上面代码完成Word中这一部分表格
我们继续用Python填写下一个表格
这里需要注意两个细节:
- word写入的数据需是字符串,所以从Excel获取的数据需要用str格式化
- 表格可能存在合并等其他情况,因此你看到的行数和列数可能不是真实的,需要用代码不断测试。
按照上面的办法,将之前从Excel中取出来的数据一一填充到Word中对应位置就大功告成!最后保存一下即可
回顾上面的过程,其实从需求和文件格式上看,这次文件的读写解析任务较复杂,码代码和思考时间会较久,所以当我们在考虑使用Python进行办公自动化之前需要想清楚这个问题:这次需要完成的任务是否工作量很多,或者以后长期需要进行,用Python是否可以解放双手?如果不是,实际上手动就可以完成,那么就失去了自动化办公的意义!