日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python项目需求文档模板_Python+docxtpl+plotly实现模板word文档图表生成

發布時間:2023/12/10 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文档图表生成的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。