Python-docx-操作word文档实战

概述

公司同时有一堆word版本的合同需要进行续期签订,里面牵涉到诸如:合同到期时间、收费费率之类关键信息需要进行调整。针对一个合同来说手动修改即可,但是有一堆这样的合同要操作。很容易出错并且出现错误也很难排查,为了降低人力成本这里采用python-docx模块来帮助同事完成一系列的重复工作。同事只需要维护合同模板和相应的excle表格即可。

  • excle 存储到期时间,费率收取等信息
  • docx 合同模板

这里采用的是python-docxtpl模块,使用方法详见:https://www.cnblogs.com/feifeifeisir/p/14701066.html

思路

  1. 根据excel中的信息编写.docx模板文件
  2. excel中读取关键信息生成更新的内容字典
  3. 利用python-docxtplrander方法对模板中的关键信息进行替换
  4. 保存修改的内容

实操

安装处理模块

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文档实战相关推荐

  1. C# DocX操作Word文档(.docx)

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  2. Python办公自动化----操作word文档

    用python操作word文档 在Python中,可以使用名为python-docx的三方库来操作word文件,可以使用下面的命令来安装它. 安装三方库 : pip install python-do ...

  3. python docx修改word文档格式

    修改word文档格式,包括修改目录字体字号间距,修改一级标题字体字号间距,二级标题字体字号间距....正文字体字号间距,表格中的文字的字体字号间距,以图或表开头的图名称和表名称的字体字号间距. wor ...

  4. python 合并word文件_使用python docx合并word文档

    合并包含所有样式的两个文档的另一种方法是使用python库docxcompose(https://pypi.org/project/docxcompose/).我们不需要明确定义样式,也不必逐段阅读文 ...

  5. python docx处理word文档中表格合并问题

    问题描述 python中用docx库读取word文件,若word文件中包含合并的表格表格 则通过docx读取显示: file = docx.Document(path) for table in fi ...

  6. python操作word文档(python-docx)

    python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...

  7. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  8. python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示

    前言P6Q免费资源网 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码P6Q免费资源网 实例代码: ...

  9. python打开word并插入图片_Python操作word文档插入图片和表格的实例演示

    前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码 实例代码: # -*- coding: U ...

  10. 利用python操作word文档

    总目录:Python数据分析整理 本文代码参考自官方文档: python-docx 使用的库下载方式为:pip install python-docx 注意!! 不是:pip install docx ...

最新文章

  1. composer查看当前镜像取消_配置和查看composer镜像
  2. linux命令:系统裁剪之五dropbear嵌入式系统专用ssh服务
  3. DevExpress的进度条控件ProgressBarControl的使用-以ZedGraph添加曲线进度为例
  4. WampServer下如何实现多域名配置
  5. 如何把图片转为html,如何将原始十六进制图像转换为html图像
  6. JavaScript读取本地图片到浏览器
  7. android 隐藏系统键盘
  8. 数据源管理 | 分布式NoSQL系统,Cassandra集群管理
  9. 进程串行变并行linux,linux进程简述
  10. 苹果挥刀,iPhone 12 mini要换处理器了,无缘A14!
  11. 女生学计算机好还是工业工程好,工业工程专业排名-工业工程考证我是学IE大三的,我想问一下,工业工程,有哪些与专业 爱问知识人...
  12. Vmware里安装Ubuntu时由于分辨率问题,界面显示不全解决办法
  13. 主子式大于等于零的矩阵是半正定矩阵的证明方法之二
  14. php ctf题,CTF---PHP安全考题
  15. 小白windows内网离线部署宝塔面板
  16. 测试java实现继承接口案例
  17. C语言:洛谷,不高兴的津津
  18. 区块链重塑人类社群生态
  19. pscp linux,windows下 pscp 安装及使用
  20. 天天基金数据接口及参考

热门文章

  1. mysql的着重号_MYSQL
  2. 对话清华教授孙茂松:第三代人工智能要处理“可解释性”问题
  3. 如何提升手机续航延长手机电池寿命
  4. 大数据时代征信业发展探析
  5. excel打印预览在哪里_Excel常用打印方法汇总
  6. 30岁,真的不适合转行做IT了么?
  7. python图形统计代码_python tkinter图形界面代码统计工具
  8. 蒙特卡罗方法的代码实现——python
  9. 有关论文参考文献格式的笔记
  10. (二改)右键发送多个文件到kindle