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. 渲染结果
    在这里插入图片描述

    充满鲜花的世界到底在哪里
  • 相关阅读:
    HIVE优化学习笔记
    HIVE执行引擎TEZ学习以及实际使用
    端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手四次挥手,滑动窗口(整理转发)
    kafka时间轮简易实现(二)
    kafka时间轮的原理(一)
    JAVA之G1垃圾回收器
    JAVA之垃圾收集器
    JAVA之内存结构
    SparkSQL学习笔记
    Python 学习 --简单购物车程序
  • 原文地址:https://www.cnblogs.com/aliases/p/14333205.html
Copyright © 2011-2022 走看看