工作中遇到的一个问题,要把一个单机软件导出的A报告(Word格式的)的数据放到B报告(同样也是Word格式的),这个步骤一直是手工复制粘贴实现,极费时间。想过用OCR识别,看了一下价格有点抵不住,毕竟这个量不少,于是打算用python操作Word,刚好学习浅尝一下python。之前没接触过python,花了几天缝缝补补弄了一个并打包Pyinstaller
打包成exe,这样的好处是拷贝到别人电脑也能用,不用考虑对方电脑有没有python环境,因为还得下载依赖库。
用的python docx
以及python docx template
,前者是一个可以读取、修改、创建Word的库,后者是一个可以替换Word制定内容的库。
1 2 3 4 5 # Word模板 亲爱的{{user}}您好: 您在{{url}}上的邮件地址{{mail}}需要被确认,以便您接收通知消息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 from docxtpl import DocxTemplate tpl = DocxTemplate('template/SJ046-02-XXXX-检测报告.docx' ) context={ 'user' :'likasi' , 'url' :'httpblog.likasi.top' , 'mail' :'yyyy@qq.com' , 'res' :[ { 'serial' :'001' , 'number' :'YNZH109203810' , 'name' :'张三' , 'gendr' :'男' , 'type' :'放射卫生' , 'value' :'0.03' }, { 'serial' :'002' , 'number' :'YNZH109203811' , 'name' :'李丽' , 'gendr' :'女' , 'type' :'职业卫生' , 'value' :'0.02' }, ] } path = "E:\\ReportReplace\\output\\" tpl.render(context) tpl.save(path+'relace.docx' )
思路就是通过python docx
读取Word内容,然后正则匹配出来,封装成想要渲染的context数据,再用python docx template
渲染。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import docx file=docx.Document('XXXX.docx' ) para_list = []for para in file.paragraphs: para_list.append(para.text) table_list_top = []for table in file.tables: for row in table.rows: for cell in row.cells: table_list_top.append(cell.text) table_list_bottom = []for table in file.tables: for column in table.columns: for cell in column.cells: table_list_bottom.append(cell.text) ......
以上都是只截取了部分代码,因为都放上也没有意义,这个还得根据实际文档来拿数据。在你Word模板设置字体字号就设置好,替换后的也就是那个字体和字号格式等。
人生苦短,我选python也不是没有道理的,各种库拿来就是用啊,还是很方便的。