业务背景

近一段时间一直忙于开发,有一业务场景,需要将后台(使用的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. 模板文件
使用Python的docxTemplate渲染word文件
4. 渲染结果
使用Python的docxTemplate渲染word文件

分类:

技术点:

相关文章: