首页 >word操作 > 内容

python docxtpl循环渲染多个word模板时遇到的问题

2022年11月25日 20:05

       最近做办公自动化,减少文员办公成本时,需要使用根据数据创建几千个企业客户的信用档案, 大概是一张大表.如果手动创建填空,需要很长时间.我们使用Python的Python-docx库可以自动写入文档,但是如果大致是一样的内容,我们可以使用docxtpl库,这个库是基于python-docx库和jinja2写的,可以渲染模板.我们需要批量创建word文件时, 使用docxtpl可以快速渲染出想要的word文件.类似于前端的渲染.只要在想要插入数据的地方插入类似于{{ a }}的标签,传入字典{{ "a": 123 }} 就能在标签上渲染出数据123. docxtpl还支持图片,子文档等. 但是目前图片和子文档的支持还不够完善.

     一开始, 我是这么写的, 但是发现只能创建一个docx文件, 可能是因为在循环里创建模板对象会出现问题, 可能是循环时对象没有回收, 而tpl对象可能是单例的(我看源代码时没发现, 但想不出别的原因了)

       

data = pandas.read_excel(excel)
    for index, dc in data.iterrows():
        tpl = docxtpl.DocxTemplate(tpl)
        context["企业名称"] = dc["企业名称"]
        context["法人"] = dc["法人"]
        context["处罚日期"] = dc["处罚日期"]
        context["注册地"] = dc["注册地"]
        context["统一社会信用代码"] = dc["统一社会信用代码"]
        context["信息报送机关"] = dc["处罚机关"]
        context["处罚机关"] = dc["处罚机关"]
        context["处罚结论"] = dc["处罚结论"]
        context["处罚依据"] = dc["处罚依据"]
        context["处罚事由"] = dc["处罚事由"]
        # context["是否可修复"] = dc["是否可修复"]
        context["处罚文号"] = dc["处罚文号"]
        if dc["是否可修复"] in ["是", 1, "1"]:
            context["是否可修复"] = "√"
        else:
            context["是否可修复"] = ""
        tpl.render(context)
        tpl.save(f"{target_dir}\\{dc['地区']}\\3-信用档案-{context['企业名称']}-{company_count[context['企业名称']]}.docx")

这时 我们可以改成用函数调用, 这样在函数调用结束时会销毁对象, 这样就可以消除单例影响

代码如下:

def render_tpl(dc, tpl, context, target_dir, company_count):
    tpl = docxtpl.DocxTemplate(tpl)
    context["企业名称"] = dc["企业名称"]
    context["法人"] = dc["法人"]
    context["处罚日期"] = dc["处罚日期"]
    context["注册地"] = dc["注册地"]
    context["统一社会信用代码"] = dc["统一社会信用代码"]
    context["信息报送机关"] = dc["处罚机关"]
    context["处罚机关"] = dc["处罚机关"]
    context["处罚结论"] = dc["处罚结论"]
    context["处罚依据"] = dc["处罚依据"]
    context["处罚事由"] = dc["处罚事由"]
    # context["是否可修复"] = dc["是否可修复"]
    context["处罚文号"] = dc["处罚文号"]
    if dc["是否可修复"] in ["是", 1, "1"]:
        context["是否可修复"] = "√"
    else:
        context["是否可修复"] = ""

    tpl.render(context)
    # 省略一些目录层级排版的操作    
    tpl.save(f"{target_dir}\\{dc['地区']}\\3-信用档案-{context['企业名称']}-{company_count[context['企业名称']]}.docx")



data = pandas.read_excel(excel)
    for index, dc in data.iterrows():
        # 这里其他参数(target_dir, company_count)是辅助文员下载和文件命名和层级排版的
        render_tpl(dc, tpl, context, target_dir=download_dir, company_count=counter)

这样就可以创建多个模板了

 

如果你想使用图片等媒体渲染word模板, 建议不要使用{{ a }}这种标签, 使用占位的图片, 然后使用replace_pic方法更好.


参考文章:https://blog.csdn.net/weixin_39433211/article/details/107757225

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,在此表示感谢。

特别提醒:

1、请用户自行保存原始数据,为确保安全网站使用完即被永久销毁,如何人将无法再次获取。

2、如果上次文件较大或者涉及到复杂运算的数据,可能需要一定的时间,请耐心等待一会。

3、请按照用户协议文明上网,如果发现用户存在恶意行为,包括但不限于发布不合适言论妄图

     获取用户隐私信息等行为,网站将根据掌握的情况对用户进行限制部分行为、永久封号等处罚。

4、如果文件下载失败可能是弹出窗口被浏览器拦截,点击允许弹出即可,一般在网址栏位置设置

5、欢迎将网站推荐给其他人,网站持续更新更多功能敬请期待,收藏网站高效办公不迷路。

      



登录后回复

共有0条评论