zoukankan      html  css  js  c++  java
  • 使用Python的docxTemplate渲染word文件

    业务背景

    近一段时间一直忙于开发,有一业务场景,需要将后台(使用的Java)获取到的数据,动态的填充到word文档中。一开始使用的是使用Java获取后台数据,使用freemarker模板进行数据渲染,生成word(原理是将word模板转换成xml文件,然后将xml文件重新命名为ftl格式文件,将数据动态填充)。最终采用的是python-docxTemplate来动态填充并生成word。

    区别

    1.使用freemarker来渲染并生成word,开发量大,花费时间较长,如果生成的word内容过多,难以维护(生成请假单等还是不错的选择)。
    2. 使用python-docxTemplate开发,编写语法比较清晰(直接将渲染的语法写在word文档中),调用template中的render及save方法即可将数据渲染到word中并进行保存。

    常用语法

    1. 填充数据:{{var1}}
    2. 判断语句:
    {%p if  表达式 %} 
    需显示的内容
    {%p endif %}
    3. 循环,一般用于表示一个整体的渲染。
    {% for item  in  itemList%}
    内容
    {% endfor %}
    4. 循环,表示在整体的部分中进行循环
    {%tr for item  in  propertyDetail.projectPropertyList%}
    内容
    {%tr endfor %}
    

    文档链接:
    https://www.it610.com/article/1279099179091640320.htm
    https://docxtpl.readthedocs.io/en/latest/
    http://docs.jinkan.org/docs/jinja2/templates.html

    实现的核心代码

    1. python端
    安装 pip install docxtpl
    
    from docxtpl import DocxTemplate
    
    tpl=DoxcTemplate('模板文件路径')
    
    // 后台请求过来的真实数据,在此使用模拟的数据
    context = {
    	'stuList':[{'name':'zs','age':'23','class':'二班'},	     {'name':'ww','age':'24','class':'三班班'}],
    	'schoolInfo':{'address':'xxx','peoples':'125000'}
    }
    // 渲染 
    tpl.render(context);
    tpl.save('保存路径')
    
    1. Java端
    // 从数据库中请求的数据
    JSONObject param = new JSONObject();
    param.put("data",gqData);
    
    // 由于请求生成word文档时间不确定,可根据实际调节。也可使用thrift进行接口调用。
    RestTemplate restTemplate = new RestTemplate();
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    factory.setReadTimeout(-1);
    factory.setConnectTimeout(-1);
    restTemplate.setRequestFactory(factory);
    
    HttpEntity<String> entity = new HttpEntity<>(param.toString() , httpHeaders);
    // 执行请求-生成word
    HttpEntity<String> response = restTemplate.exchange(gqPyUrl, HttpMethod.POST , entity , String.class);
    // 解析返回的数据
    Map remoteMap = JSONObject.parseObject(response.getBody(), Map.class);
    

    注:如何使用thrift进行调用,请参考:https://blog.csdn.net/qq_37640410/article/details/108360062
    3. 模板文件
    在这里插入图片描述
    4. 渲染结果
    在这里插入图片描述

    充满鲜花的世界到底在哪里
  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/aliases/p/14333205.html
Copyright © 2011-2022 走看看