業務背景
近一段時間一直忙於開發,有一業務場景,需要將后台(使用的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
實現的核心代碼
- 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('保存路徑')
- 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. 渲染結果