文章目录
系列文章
第一章 python办公自动化之批量修改docx——以修改含有表格的word文件为例
第二章 python办公自动化之批量生成docx——根据excel (word)生成word (excel)
第三章 python办公自动化之python-docx,openpyxl——根据excel(word表格)填写word表格(excel)
前言
收集了下办公自动化的资料,在word处理上没有发现满意的文章,于是自己写一篇吧。
所用素材全部来自于网络,皆为免费资源,下面案例可供参考
一、docx类的包很多,但docx一个就够用
python处理word的包不只docx,PyPI中此类的包不下十计,当然星星最多的还是docx,其他的还有docxtpl、pydocx。只是批量化处理word文档,而不搞花里胡哨的格式,docx足够用了。如果真是为了花里胡哨的格式,那一定是特异性的需求大于标准化的需求,老老实实用word就可以了。
二、快速熟悉docx
介绍word自动化处理的文章十有八九拿来docx官网上的例子,翻译一下就当自己的原创内容了。当然,大部分情况是即使看了这些也无法拿来提升工作效率。
官网教程做的通俗易懂、简明扼要,但是实际上并没有给出批量修改的实例,理由这里复述一下:(1)要想用本API做复杂的事情,得花时间通读帮助文档;(2) 作者(们)认为或者调查之后认为新建空白文档并操作这种基本应用占实际应用情况的80%,所以他们的example就讲的这基本操作。
笔者实践之后发现,采取以下两个步骤,基本上一晚不用就足够掌握这个API,从而批量修改docx。
- 官网溜一遍,内容并不多,熟悉个大概之后,至少知道存在几个object,有哪几个常用的attribute,这样再去翻找的时候方便。
- 实际敲代码时候多用dir()、help()指令,如果是help做的一塌糊涂的jupyter,那就只有import之后再help了。
三、代码
word文件需要转为docx才能用python-docx操作,剩下的文档包括代码已经打包到了优快云的下载链接。
Block-level和 Inline text objects的概念:每一段(paragraph)、每个表格(table)都是 Block-level objects, 段落paragraph中的run,以及表格table中的cell可以理解为Inline text,是可以操作的最小单位。也是自动化操作实现的根基。
1. python-docx修改段落中的内容
代码如下(示例):
#docx的安装就不再赘述了,docx官网可见。
from docx import Document
import re
document = Document("建设工程勘察合同.docx")
print(document)
#官网: https://python-docx.readthedocs.io/en/latest/index.html
#官网着重介绍了从空白开始写一份docx文档,对于修改已有文档介绍甚少,好
#在结合help命令已经足够,无需看源码
#dir(document)
#help(document)
#help(document.paragraphs[0])
#help(document.paragraphs[0].runs[0])
#help(document.tables[0].rows)
#help(document.tables[0].cell(0,0))
#翻译算不上原创,就不翻译了
#如果直接修改paragraphs[...].text,段落格式、行内格式皆丢失,需重新设置格式。
#用runs属性修改,能够最大限度保留行内格式,省去再设置段落格式、行内格式的麻烦
#空格、tab符,被视为区分各个run的标志,shift+_可识别为一个run
def find_index_