python自动生成word报告

python自动生成word报告

  • 运用zipfile解压docx并替换模版内容

本文章主要介绍根据所提供的word模版,运用python zipfile库将word解压为xml格式,并通过文字替换自动生成word报告。

word模版-示例:
python自动生成word报告_第1张图片

python根据word模版自动填充并生成word报告:
python自动生成word报告_第2张图片

运用zipfile解压docx并替换模版内容

代码如下:

from zipfile import ZipFile
import re
import shutil


#读文件
def read_file(file):
    print(file)
    with open(file, 'r',encoding='UTF-8') as f:
        contents = f.read()
        f.close()
    return contents

#写文件
def write_file(file,contents):
    with open(file, 'w',encoding='UTF-8') as f:
        f.write(contents)
        f.close()
        
#提取docx文件对应的xml结构文件
def docx_to_xml(doc_file):
    document = ZipFile(doc_file)
    document.extractall(doc_file[:-5],)#提取xml到文件夹中   
    document.close()
    return document

#将xml写回docx
def xml_to_docx(doc_file,doc_xmls):
    new_docx_file = ZipFile(doc_file, mode='w')
    #重新写入word文件
    for xml in doc_xmls.namelist():
        new_docx_file.write(doc_file[:-5]+'/'+xml,xml)
    new_docx_file.close()
    
#删除docx文件对应的xml结构文件
def delete_docx_xmlfiles(doc_file):
    shutil.rmtree(doc_file[:-5]) 

    
#获取模版里的要替换的标签(从xml文件中提取),此处标签格式:[标签]
def get_all_tags(text):
    text=re.sub("<[^>]*>","",text) #移除xml标签
    tag_list=re.findall('\[[^\]]*\]',text)#找到[]配对,获得要替代的标签
    for i in range(len(tag_list)):
        tag_list[i]=re.sub(r"[\[\]\n\r]","",tag_list[i])#去除回车及标签括号
    #print('标签:',tag_list)
    return tag_list


#使用re.sub替换xml中标签
def find_and_replace_tag(content,tag_map):
    def replace_tag(matched):
        ori_tag=re.sub("<[^>]*>","",matched.group()) #去除xml标签,保留tag内容
        tag=re.sub(r"[\[\]\n\r]","",ori_tag)#去除回车及标签括号[]
        if tag in tag_map.keys():
            return tag_map[tag]
        else:
            print('没有为此标签赋值,请赋值:'+tag)
            return ori_tag
    result = re.sub(r"\[[\s\S]*?\]", replace_tag, content)#使用正则表达式获得要替换到字符串,并使用replace_tag自定义替换函数进行替换)
    return result

#替换xml标签数据
def replace_xml_data(xml_file,tag_map):
    xml=read_file(xml_file)
    tgt_xml = find_and_replace_tag(xml,tag_map)#获取tag并替换字符串,
    #将tgt_xml写入数据到xml文件中
    write_file(xml_file,tgt_xml)
    
template_file='报告模版.docx' #word模版需是docx格式
new_report_file='new_报告.docx'#要生成的报告名称
shutil.copy(template_file,new_report_file)#复制模版至新周报
doc_xmls=docx_to_xml(new_report_file)#提取docx的xml结构文件
docx_main_xml=new_report_file[:-5]+'/'+'word/document.xml'#docx主xml文件
all_tags=get_all_tags(read_file(docx_main_xml)) #获取docx中要替换的标签
print(all_tags)
#填充数据举例,变量名与标签名保持一致
abtract='摘要填充-测试'
title_1='标题1-测试'
p_1='本段主要内容为:测试'
title_2='标题2-测试'
tag_map={}
#为标签赋值,将要填充的数据赋值给标签
for tag in all_tags:
    if tag in vars():
        tag_map[tag]=eval(tag)
print(tag_map)
#{'abtract': '摘要填充-测试', 'title_1': '标题1-测试', 'p_1': '本段主要内容为:测试', 'title_2': '标题2-测试'}
replace_xml_data(docx_main_xml,tag_map) #为主xml替换标签
xml_to_docx(new_report_file,doc_xmls)#将xml文件写回docx文件

你可能感兴趣的:(python,python)