这周我很忙,没有时间做SPSS视频,所以我将发送两个专栏以保持更新频率。
上面这个视频是我之前发上来的,是我自己写的一段程序,可以用python-docx这个库根据数据去动态替换word文档中的模板字段,而且这个过程不会造成格式的损失。
这次主要给ParagraphRunProc类做一个注释
__init__方法
首先在__init__方法之前,先指定一个正则表达式来匹配模板文本。之前在视频里也提到了,docx文档中__模板标示符__表示这段文本接下来要做内容的替换,那么识别这种模板标识符的工作就需要正则表达式完成
初始化类实例的init方法代码如下:
类通过参数paragraph接受一个python-docx的paragraph对象,然后存进self.paragraph变量里面。剩下的几行代码分别调用了类里面的几个方法。接下来就分别看一下init调用了的几个方法
被__init__调用的几个方法
-
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文档的格式不会受到我们程序的影响。
其他相关的方法
-
cal_run_start_end
2. find_pos
self.list_rst是在init里面使用p_run_start_end_list_gen方法生成的一个字典的列表,每个元素都包含run的序号,run自身,run的开始和结束字符。通过遍历这个列表,找到ind刚好落在该run开始与结束之间的paragraph的run