Python-docx-操作word文档实战
Python-docx-操作word文档实战
概述
公司同时有一堆word版本的合同需要进行续期签订,里面牵涉到诸如:合同到期时间、收费费率之类关键信息需要进行调整。针对一个合同来说手动修改即可,但是有一堆这样的合同要操作。很容易出错并且出现错误也很难排查,为了降低人力成本这里采用python-docx模块来帮助同事完成一系列的重复工作。同事只需要维护合同模板和相应的excle表格即可。
- excle 存储到期时间,费率收取等信息
- docx 合同模板
这里采用的是python-docxtpl
模块,使用方法详见:https://www.cnblogs.com/feifeifeisir/p/14701066.html
思路
- 根据
excel
中的信息编写.docx
模板文件 - 从
excel
中读取关键信息生成更新的内容字典 - 利用
python-docxtpl
的rander
方法对模板中的关键信息进行替换 - 保存修改的内容
实操
安装处理模块
pip install xlrd python-docxtpl
Excel内容形如:
使用xlrd
读取excle中的内容,代码形如:
往word文档中插入特殊字符
处理特殊字符:应用场景详见https://blog.csdn.net/wi162yyxq/article/details/108431881
为了实现这个需求我这边可谓是煞费苦心!!!
最开始找了python-docx
模块根据特殊字符处理了解到openXML
并找到一些稍详细描述通过这两篇文章我可以轻松操作word的dom节点,但是还不知道如何将修改后的dom树回写到word的document对象中,因此还是不能完成往word中插入特殊字符的需求。好在有强大的Google帮忙,最终找到了一篇关于往word中添加checkbox的博客了解到python-docx
模块处理word的逻辑,完成了向word中添加特殊字符的需求。后来又找到一篇日本朋友写的博客图文并茂简直不要太香!!这里引用一下他的图片以期更直观的理解python-docx
模块:
通过以上资料,我这边往word
中添加特殊字符的代码如下:
from docx import Document
from docx.oxml.shared import qn, OxmlElement
doc = Document('123.docx')
'''
根据python-docx的官方文档:https://python-docx.readthedocs.io/en/latest/api/text.html#paragraph-objects
doc > paragraph > run
'''
for p in doc.paragraphs:# 定位到需要插入特殊字符的位置if "□" in p.text and "abc" in p.text:# print(p.runs[0].text)run_id = 0 # 因为paragraph包含多个run,这里的标记是对run进行定位for run in p.runs:if "□" in run.text:tag = p._p[run_id] # 找到需要被替换的run# 利用OxmlElement生成一个特殊字符right_mark = OxmlElement('w:sym')right_mark.set(qn('w:font'), 'Wingdings 2')right_mark.set(qn('w:char'), 'F052')# 将特殊字符添加到run中tag.append(right_mark)# 清理到旧的run,因为已经插入了一个新的run所以这里可以直接清理,以达到替换的效果run.clear()run_id += 1
doc.save('xxxx.docx')
由于DocxTemplate
不能直接读入去内存中的docx文档,因此插入特殊字符和从excel中更新信息两个步骤需要借助中间文档xxxx.docx
进行,以及最终合同需要分三个情况生成,因此以上方式显得非常臃肿。那么有没有办法让代码更加干练呢?答案是肯定的。通过查阅资料以上步骤其实可以借助python-docxtpl模块的强大能来来实现,其实都是源于jinja2的模板语法。
以下是所有操作的基础
正常的Jinja 2语法只有%的普通标签,而docxtpl的类语法包含%p,%tr,%tc,%r%p:段落,即docx.text.paragraph.Paragraph对象%tr:表格中的一行,即docx.table._Row对象%tc:表格中的一列,即docx.table._Column对象%r:段落中的一个片段,即docx.text.run.Run对象通过使用这些标记,python-docx-template将真正的Jinja 2标记放入文档的XML源代码中的正确位置。另外,需注意,这四种标签,起始标签不能在同一行,必须在不同的行上面。
代码实现:
doctmp = DocxTemplate('123.docx')
"""
根据业务情况,word模板中的jinja2语法如下:
{%r if right_mark %} {{ right_mark }}{%r endif %}{% if not right_mark %} □{% endif %}
参考:
https://www.cnblogs.com/feifeifeisir/p/14701066.html
https://docxtpl.readthedocs.io/en/latest/#jinja2-like-syntax
因为合同分为主副两份,根据情况最终生成的合同会有如下情况:1. 主副2. 主3. 副
因此,合同模板大致结构如:{% if main %} 主合同内容{% endif %}{% if secondary %} 副合同内容 {% endif %}
要如何生成合同内容只需要传递相应的内容给合同模板即可
"""
context = {"main": True,"secondary": False,"right_mark": '<w:sym w:font="Wingdings 2" w:char="F052"/>', # word中的“对号”,利用 docxtpl中的 {%r 专属标签实现
}
doctmp.render(context)
doctmp.save("a123.docx")
print('done.')
最后:以上方法都是根据实际情况操作。没有千篇一律的方法,唯有不变的原理
Python-docx-操作word文档实战相关推荐
- C# DocX操作Word文档(.docx)
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- Python办公自动化----操作word文档
用python操作word文档 在Python中,可以使用名为python-docx的三方库来操作word文件,可以使用下面的命令来安装它. 安装三方库 : pip install python-do ...
- python docx修改word文档格式
修改word文档格式,包括修改目录字体字号间距,修改一级标题字体字号间距,二级标题字体字号间距....正文字体字号间距,表格中的文字的字体字号间距,以图或表开头的图名称和表名称的字体字号间距. wor ...
- python 合并word文件_使用python docx合并word文档
合并包含所有样式的两个文档的另一种方法是使用python库docxcompose(https://pypi.org/project/docxcompose/).我们不需要明确定义样式,也不必逐段阅读文 ...
- python docx处理word文档中表格合并问题
问题描述 python中用docx库读取word文件,若word文件中包含合并的表格表格 则通过docx读取显示: file = docx.Document(path) for table in fi ...
- python操作word文档(python-docx)
python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...
- Python 操作Word文档插入图片和表格实例演示
Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...
- python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示
前言P6Q免费资源网 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码P6Q免费资源网 实例代码: ...
- python打开word并插入图片_Python操作word文档插入图片和表格的实例演示
前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码 实例代码: # -*- coding: U ...
- 利用python操作word文档
总目录:Python数据分析整理 本文代码参考自官方文档: python-docx 使用的库下载方式为:pip install python-docx 注意!! 不是:pip install docx ...
最新文章
- composer查看当前镜像取消_配置和查看composer镜像
- linux命令:系统裁剪之五dropbear嵌入式系统专用ssh服务
- DevExpress的进度条控件ProgressBarControl的使用-以ZedGraph添加曲线进度为例
- WampServer下如何实现多域名配置
- 如何把图片转为html,如何将原始十六进制图像转换为html图像
- JavaScript读取本地图片到浏览器
- android 隐藏系统键盘
- 数据源管理 | 分布式NoSQL系统,Cassandra集群管理
- 进程串行变并行linux,linux进程简述
- 苹果挥刀,iPhone 12 mini要换处理器了,无缘A14!
- 女生学计算机好还是工业工程好,工业工程专业排名-工业工程考证我是学IE大三的,我想问一下,工业工程,有哪些与专业 爱问知识人...
- Vmware里安装Ubuntu时由于分辨率问题,界面显示不全解决办法
- 主子式大于等于零的矩阵是半正定矩阵的证明方法之二
- php ctf题,CTF---PHP安全考题
- 小白windows内网离线部署宝塔面板
- 测试java实现继承接口案例
- C语言:洛谷,不高兴的津津
- 区块链重塑人类社群生态
- pscp linux,windows下 pscp 安装及使用
- 天天基金数据接口及参考