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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆小叁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值