[代码说明]数据驱动的docx文档更新1的Python代码

这周我很忙,没有时间做SPSS视频,所以我将发送两个专栏以保持更新频率。

上面这个视频是我之前发上来的,是我自己写的一段程序,可以用python-docx这个库根据数据去动态替换word文档中的模板字段,而且这个过程不会造成格式的损失。

这次主要给ParagraphRunProc类做一个注释

__init__方法

首先在__init__方法之前,先指定一个正则表达式来匹配模板文本。之前在视频里也提到了,docx文档中__模板标示符__表示这段文本接下来要做内容的替换,那么识别这种模板标识符的工作就需要正则表达式完成

初始化类实例的init方法代码如下:

类通过参数paragraph接受一个python-docx的paragraph对象,然后存进self.paragraph变量里面。剩下的几行代码分别调用了类里面的几个方法。接下来就分别看一下init调用了的几个方法

被__init__调用的几个方法

  1. p_run_start_end_list_gen

2. get_all_tags_in_p

涉及re.match或者re.search的时候,往往不注意应对mo is None的情况就会在没有匹配结果的时候出现程序报错。不过这里用到的re.finditer,在没有找到对应的匹配的时候,re.finditer(…)会返回一个空白的list,于是list comprehension也不会有什么报错。

但是总觉得这么干好像哪里有点不大对

3. find_tag_in_runs

这里两次调用了find_pos,将tag的start和end这种字符数index转成run

4. combine_runs

其实虽然叫做combine runs,实际上只是将一个tag所涉及的所有runs的文本都放到第一个run中,剩下的run文本清空。在设置run的text的时候不会造成格式的损失,这就保证了docx文档的格式不会受到我们程序的影响。

其他相关的方法

  1. cal_run_start_end

2. find_pos

self.list_rst是在init里面使用p_run_start_end_list_gen方法生成的一个字典的列表,每个元素都包含run的序号,run自身,run的开始和结束字符。通过遍历这个列表,找到ind刚好落在该run开始与结束之间的paragraph的run

资源下载: