python——自动化报告word(1)

python——自动化报告word(1)

本文基于python的docx模块的文本替换功能,自动引用excel数据填入word,实现报告自动化。



前言

需要提前安装docx模块。

# 在终端中输入
pip install python-docx

# 或者在jupyter notebook中输入
!pip install python-docx

提示:以下是本篇文章正文内容,下面案例仅供参考学习

一、思路

1.读取word模板;
2.读取预先统计整理好的字典数据;
3.根据指定文本内容(键)和黄色高亮文本格式,替换相应的内容;
4.输出word报告。

二、准备文件

1.模板

word模板为docx格式,约定两个相邻索引分隔符为“#”,用于指明需要替换的文字部分(含表格内容)。图中模板高亮文本部分为索引,为文字替换的定位依据,除实质替换内容相同时,一般索引不能雷同。
在这里插入图片描述

2.字典

创建excel文件,含有用于替换内容的字典数据。
在这里插入图片描述

三、源码

1.加载模块

需要安装python3.9或以上版本,docx、pandas、numpy、tkinter均需提前装好。

import docx, pandas as pd, numpy as np, tkinter as tk, os
from tkinter.filedialog import askopenfilename
from docx.enum.text import WD_COLOR_INDEX

2.定义替换函数

特别注意docx的run切割原则上是按照文本格式来切割的,但实际存在过度切割的问题,即相同格式相邻的文本内容被切成两个run。两个while循环,是为了解决这一问题。

# 定义文本替换函数
def doc_dic_replace(doc, dic):
    # 段落文本替换
    for p in doc.paragraphs:
        # 原本run文本块的切割按样式切割,但实际存在过度切割的问题
        i = 0
        while i < len(p.runs):
            j = 1
            # 定位黄色高亮的run文本块
            if p.runs[i].font.highlight_color == WD_COLOR_INDEX.YELLOW:
                # 检查后面的run文本块是否为高亮
                while j < len(p.runs):
                    # 不是高亮时,说明run切割完整
                    if p.runs[i+j].font.highlight_color != WD_COLOR_INDEX.YELLOW:
                        break
                    else: # 高亮时
                        # 约定‘#’作为两个相邻索引的分隔符
                        # 含有‘#’时
                        if p.runs[i+j].text.find('#') >= 0:
                            # 定位‘#’的位置
                            k = p.runs[i+j].text.find('#')
                            # ‘#’前的内容附加到runs[i]
                            p.runs[i].add_text(p.runs[i+j].text[:k])
                            # ‘#’后的内容替换原runs[i+j]
                            p.runs[i+j].text = p.runs[i+j].text[k+1:]
                            break
                        else: # 不含有‘#’时
                            # 高亮的内容附加到runs[i]
                            p.runs[i].add_text(p.runs[i+j].text)
                            # 清除后面高亮的内容
                            p.runs[i+j].text = ''
                            j += 1
                # 解决run文本块过度切割问题后
                if p.runs[i].text in dic.keys():
                    # 实施替换
                    p.runs[i].text = dic[p.runs[i].text]
                    # 取消替换内容的高亮
                    p.runs[i].font.highlight_color = None
            i +=j
    # 表格文本替换                            
    for t in doc.tables:
        for row in t.rows:
            for cell in row.cells:
                # 各单元格重复“段落文本替换”步骤
                doc_dic_replace(cell, dic)

3.加载文件和输出结果

if __name__ == '__main__':
    # 选择数据表
    root = tk.Tk()
    fp = askopenfilename(title = '请选择数据表:', filetypes= (('excel文件', '*.xlsx'),) )
    root.mainloop()
    # 载入数据表
    da1 = pd.read_excel(fp)
    # 转换为字典
    dic_1 = {a['index']:a['values']  for  a in  da1.to_dict(orient='index').values()} 
    # 设置数据表父路径为工作路径(即设置好输出结果的默认文件位置)
    os.chdir(os.path.dirname(fp))

    # 选择模板
    root = tk.Tk()
    fp = askopenfilename(title = '请选择模板:', filetypes= (('word文件', '*.docx'),) )
    root.mainloop()
    # 载入模板
    dx1 = docx.Document(fp)
    
    # 实施替换
    doc_dic_replace(dx1, dic_1)
    # 输出报告
    dx1.save('word2.docx')

四、实例

模板:
在这里插入图片描述

输出:
在这里插入图片描述


总结

本文主要讲解了利用python的文本替换实现自动化报告,主要优势体现为:
1.结合循环语句可以批量生成报告;
2.内容与文本格式分离,即内容在excel中维护,文本格式在word中维护。

  • 6
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值