在之前的文章[1] [2]中,我用python-docx这个包读取外部数据,驱动了word文档的更新,相当于是实现了Excel数据往word文档的数据流动。实现的方式比起之前依靠vba用Excel驱动word更新这个文章中说的要更可靠一些。
最近遇到了另外一个问题:为了收集教师材料,向20多个同事发放了一份资料收集表。表格大概长下面这样。可以看到里面有多个子表,里面包含了发表的文章,在研的项目,获得的成果,诸如此类的内容。现在要把这20多份表格的内容分门别类的整合成多个工作表。
图1
这其实就是数据从word往excel的流动。同样的,也可以用python-docx包加上一点pandas来实现。主要分下面几步
1. 程序与文件的文件结构
工作文件夹
|- doc2docx.py
|- grab_docxcontent.py
|- doc_files\
|- word_doc1.doc
|- word_doc2.doc
...
|- word_doc20.doc
|- rst\
收集上来的word文档统一放在doc_files文件夹里,两个python代码放在工作文件夹中。
2. 把.doc文件转换成.docx文件
python-docx包就像名字说的,可以处理docx文件,但是doc文件没法处理。所以就需要把20多个word文档中的doc文件转换成docx文件。*2020年了,2020年了呀同志们,再过3年03版本的office这个余孽就已经20岁了啊,tm还有人在用doc格式啊!*不管怎么说,既然有问题,总是要想办法去解决。解决的方式也不难,这里主要写windows环境下的处理方式参考来源
下面的代码(doc2docx.py)主要用到了pywin32这个包,通过win32com控制系统里已经安装好的word程序实现doc往docx的转换。所以务必先用pip装好pywin32
import os
import win32com.client
basedir = 'doc_files'
word = win32com.client.Dispatch('Word.application')
word = win32com.client.Dispatch('Word.application')这一行通过win32com让python可以控制word程序,接下来会反复的调用word这个对象
从doc往docx的转换其实并不复杂,无非是先1. 打开一个word文档, 2. 另存为docx文件,然后3. 关闭这个word文档,在代码里也就是三行而已
doc = word.Documents.Open(ori_path_abs)
doc.SaveAs2(conv_path_abs, FileFormat=16)
doc.Close()
顺带一提,如果是想把doc