依赖

关于依赖包的安装请看文档

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文档图表生成相关推荐

  1. java读取word文档内容_Python读取PDF信息插入Word文档

    Hello,上个周末没能搞事情,被一个代码需求给绊住了:朋友在平时工作中会经常重复性地打开不同PDF文件,选取其中特定的几组信息复制粘贴到不同的Word文档中,完成一份PDF文件平均耗时15分钟,想试 ...

  2. python合并word表格单元格_Python实战009:读取Word文档中的表格数据及表格合并问题解决...

    同事最近被安排整理资料,主要工作室将文档中的表格数据提取出来并整理层Excel表格供我们FII刀具商城进行资料维护.由于刀具的种类繁多且规格无数,所以要处理的数据量相当的庞大.人工核对整理既费时又费力 ...

  3. Python3-word文档操作(八):提取word文档中的图片方式一-利用docx库

    1. 简介: 要获取word文档中的图片文件.思路就是先解压,再查找.python中,下面两个库都可以实现这个功能: (1)zip库 (2)docx库 zip库: 上一篇博文已经提过,word本质上也 ...

  4. web系统中巧用word文档的html格式创建多样式的word文档,WEB系统中巧用WORD文档的HTML格式创建多样式的WORD文档...

    以计算机和现代网络技术为特征的现代信息技术极大地促进了社会经济的发展,基于各行各业的WEB系统的开发与应用也越来越多. >> WEB系统中巧用WORD文档的HTML格式创建多样式的WORD ...

  5. word文档docx密码忘了怎么办,word文档docx权限限制怎么办?

    word文档docx移除编辑密码,word文档docx权限限制如何解除?[解密神器]word文档docx权限密码解密,用「密码帝」啊 超级好用!,百度搜索密码帝就可以了,非常简单手机电脑都可以用,一键 ...

  6. html文档打印乱码怎么解决,如何解决Word文档打印后乱码的问题

    当把Word文档打印的时候,单击打印后,打印出来的文档却是乱码的,这种问题其实很多人都遇到过,有的时候是因为Word文档本身就是乱码的,所以打印出来自然也是乱码的,有的时候是因为打印机设置的问题,好好 ...

  7. python对word文档内容进行批量替换_python 使用win32com实现对word文档批量替换页眉页脚...

    最近由于工作需要,需要将70个word文件的页眉页脚全部进行修改,在想到这个无聊/重复/没有任何技术含量的工作时,我的内心是相当奔溃的.就在我接近奔溃的时候我突然想到完全可以用python脚本来实现这 ...

  8. python新建word文档_Python简单创建、操作Word文档

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. python-docx 随着近几年Python语言的崛起,它在办公自动化方 ...

  9. 案例:用python将中文翻译的和英文原文合成新的word文档

    案例:用python中文翻译的和英文原文合成新的word文档 一 问题的形成 需求的描述:一个英语翻译专业的研究生同学有一个期末作业.老师给了一个英文的文档,需要同学们翻译成中文.老师给的文档是格式如 ...

  10. ftl文件模板图片_使用Freemarker导出Word文档(包含图片)代码实现及总结

    本篇是关于利用FreeMarker导出Word的实现步骤. 优点:采用FreeMarker是导出Word的最佳实现,非常的灵活,能够按照自己指定的样式设置并输出内容,操作简单方便,代码实现也容易.代码 ...

最新文章

  1. KBMMW 4.80.00 发布
  2. 利用霍夫梯度法进行圆检测的原理概要及OpenCV代码实现
  3. 【转】MATLAB如何制作动画(动态图形演示movie)
  4. 如何在 Windows XP 中设置、查看、更改或删除文件和文件夹的特殊权限
  5. 将本地文件上传至Github【详细步骤】
  6. VMware下 Fedora 14安装VMWare Tools
  7. 利润表模板excel_让财务人看完心动的369个Excel财务分析图表,老板都忍不住点赞...
  8. 训练集、测试集、验证集
  9. 药品信息管理系统php,医药行业信息化管理系统
  10. 厦门电子地图,厦门市地图,厦门地图查询,公交线路查询地图
  11. 计算个人所得税(练习小程序22.7.1
  12. Javase 第五次作业智商题
  13. 广告投放的相关名词CPM/CPT/CPC/CPD/CPI/CPS
  14. 自动发货-用千牛如何做到发货号自动转接人工号
  15. html中的阴影怎么使用,css 内阴影怎么做
  16. 积水成渊之python——os.path.join()
  17. excel中插入文档
  18. 爬取QQ音乐——新手不知道的那些坑 之 中英文(全/半角)冒号坑
  19. 大工17秋计算机英语,大工17秋《大学英语1(远程英语1)》在线测试31
  20. oracle 通过数据库主键外键级联删除

热门文章

  1. 保证速度与心情——pdg转pdf与djvu转pdf大法(不像网上的好多方法那样麻烦,方便快捷,纯傻瓜化操作!)
  2. 各种数据集汇总——转载而来
  3. java 设置session超时_Java设置session超时(失效)的时间
  4. WPF ListView控件的简单使用
  5. Nero 9官方正版下载(自带正版序列号)-最好的中文免费刻录软件
  6. 【转】推荐下载使用:功能强大的光盘刻录软件NERO 9.0中文版(最新官方原版+有效序列号)...
  7. C#版TXT文本分割器
  8. [3]、Swagger——解决前后端打架问题
  9. VisualRoute for Mac OS 体验
  10. Dash_API与必应翻译的综合使用