使用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. 渲染結果
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM