python项目需求文档模板_Python+docxtpl+plotly实现模板word文档图表生成
依賴
關于依賴包的安裝請看文檔
docxtpl
文檔地址: https://docxtpl.readthedocs.io/en/latest/
注:它的github中有很多example實例,建議下載該項目在本地運行學習各種使用場景。
plotly
文檔地址: https://plotly.com/python/
注: 導出靜態圖像需要依賴安裝kaleido包,直接pip安裝即可,具體內容可在plotly文檔中查看到。
Jinja2
它的文檔就不放了...
這里我再對依賴的所有庫和版本做一個匯總,避免版本之間不兼容的問題:
docxtpl==0.11.2
kaleido==0.1.0
plotly==4.14.1
jinja2==2.10.3
python-docx==0.8.10
需求場景分析
最近有個新的接口需求,需要后端提供一個報表導出接口,該接口可以導出兩種內容形式的word文檔,文檔內包含有圖表數據:統計表格以及數據分析的折線圖、柱狀圖以及餅圖。
由于word的導出內容,其格式及描述信息基本是固定的,只有數據和圖表會動態變化,因此調研后決定使用docxtpl庫+Jinja2的方式使用模板語法對制作好的word模板文檔進行內容填充生成最終文件,docxtpl庫是依賴python-docx實現的,可以在制作好的模板文件中通過jinja2渲染字典,插入文字、表格、圖片等數據。
雖然我們平時使用word的時候可以根據數據生成圖表,但是python-docx庫本身是沒有生成圖表的API接口的,圖表數據只能插入靜態圖像的方式來實現。經過調研和測試,最終選用了plotly這個包來進行圖表生成和圖像文件導出。
網上很多方案是用的pyecharts+pyecharts-snapshot的方式,實際是采用無頭瀏覽器渲染截圖后得到的靜態圖像文件,實際測試中導出圖片效率相對太低,且依賴node環境phantomjs,使用體驗也不佳,不推薦。
準備模板docx文檔
先使用jinja2制作好作為基礎模板的word文檔,貌似不能上傳文件,我這里就簡單截圖示例吧,下圖為示例docx文件中編輯的模板內容,已經包含了我實際項目中用到的填充方式:普通填充、表格循環填充、條件判斷內容塊,這里都是使用jinja2的語法,對jinja2不熟悉可以大概先找文檔看下這個模板語法的使用方式。
image
plotly圖表靜態文件生成代碼示例
這里只是簡單展示一下使用plotly生成本地文件或者將靜態文件數據寫入ByteIO,其他圖表相關的API請參考文檔,官方文檔非常詳細。
import plotly.graph_objects as go
from io import BytesIO
def get_line_image(x, y):
fig = go.Figure()
fig.add_trace(go.Scatter(x=x, y=y, text=y, textposition="top center", mode="lines+markers"))
image_io = BytesIO()
fig.write_image(image_io, format="jpeg")
return image_io
由于我后端并不需要圖像文件生成到本地,因此只需要將文件對象寫入到BytesIO返回即可,
你也可以根據需求直接write_image(file="a.png")的方式生成圖片及返回本地文件路徑。
docxtpl模板庫的使用示例
最終我們要將組裝的填充數據寫入到docx文檔中,生成需要的word文檔。
還是直接上示例代碼吧。
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm
# 初始化模板處理對象
tpl = DocxTemplate("./示例模板文件.docx")
# 圖表靜態文件對象調用上面的示例plotly方法生成
line_charts = get_line_image(x=["一班", "二班", "三班"], y=["75", "80", "82"])
# 待填充的示例字典數據,其中key對應word模板中的填充名,圖片需要調用InlineImage類
context = {
"average": 80,
"class": "三年2班",
"table": [{"name": "小紅", "gender": "男", "grade": 80},
{"name": "小白", "gender": "男", "grade": 79},
{"name": "小黑", "gender": "女", "grade": 81}],
"line_image": InlineImage(tpl, line_charts, width=Mm(164), height=Mm(82.5)),
}
# 開始渲染context數據到模板文件中
tpl.render(context=context)
# 保存:這里依然可以寫入的ByteIO對象,因為后端不需要保存文件,你也依然可以根據需要使用save('a.docx')的方式保存最終文件到本地
# file_io = BytesIO()
tpl.save("示例結果文檔.docx")
一下是上述示例的輸出結果截圖:
image
最后
只要參照以上跑通了一次,就能根據實際需求重新設計代碼結構以及調整模板文件格式、圖片大小等,基本能實現模板類的word文檔導出需求,若有任何問題和建議,也歡迎大家留言,希望這篇文檔能幫到你。
總結
以上是生活随笔為你收集整理的python项目需求文档模板_Python+docxtpl+plotly实现模板word文档图表生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云加速器拉取tomcat
- 下一篇: python基础到实践_一本书搞定Pyt