Python:Docx文档模板创建使用

news2024/9/28 15:32:30

✨博文作者 wangzirui32
💖 喜欢的可以 点赞 收藏 关注哦~~
👉本文首发于CSDN,未经许可禁止转载

😎Hello,大家好,我是wangzirui32,今天我们来学习Docx文档模板创建与使用,开始学习吧!

1. Docxtpl

Docxtpl是用于快速处理Word模板填充的Python第三方库,它的安装命令如下:

pip install docxtpl

安装完毕后,即可开始学习。

2. Word模板编写

新建一个Word文档(*.docx),根据类似Jinja2模板的语法,写出如下示例模板:
示例模板
Tips: 这里根据笔者的全国GDP分析预测文章(传送门)制作了文档模板。
这里简单叙述一下模板语法:

2.1 插值语法

插入一段文本或图片或其它内容的语法如下:

{{ 变量名 }}

2.2 循环,判断语法

循环语法如下:

{%tag for i in items %}
{{ i }}  # 每次循环渲染的内容
{%tag endfor %}

判断语法如下:

{%tag if 变量/布尔值 %}
{{ content }}
{%tag endif %}

这里的tag解释如下:
此时这里的语法与Jinja2有些不同,我们需要在原有的语句中根据实际插入内容进行选择,如刚才的示例模板里的表格循环:

{%tr for d in gdp_data %}
...
{%tr endfor %}

这里我们在语句前加了tr,代表这是表格行的循环,这将会提示Docxtpl在渲染结束后删除有这些语句的行。
类似的语法还有以下常见的几种:

{%p jinja2_tag %} # 段落
{%tr jinja2_tag %} # 表格行
{%tc jinja2_tag %} # 表格列

这里特别说明一下段落的使用,如果你想使用语句来生成段落的话,不要这样写:

{%p jinja2_tag %}content{%p end... %}

而应该这样写:

{%p jinja2_tag %}
content
{%p end... %}

这是因为,Word文档自动把同一行的内容视作一个段落,在渲染完毕后,Docxtpl会把含有这些辅助的语句所在段落删除,从而导致把渲染的内容也删除了。同理,这种特性对其它情况也仍然存在。

3. 渲染模板

创建一个新Python文件(*.py),写入如下示例代码:

import jinja2
from docxtpl import DocxTemplatefrom docxtpl import InlineImage
from docx.shared import Mm
# 年份
years = [2010, ... , 2021]
# 数据来源:data.stats.gov.cn 国家统计局 (单位:亿元)
# 第一季度
gdp_Q1 = [87501.3, ... ,247985.0]
# 第二季度
gdp_Q2 = [99347.4, ... ,281528.0]
# 第三季度
gdp_Q3 = [105963.7, ... ,289919.3]
# 第四季度
gdp_Q4 = [119306.8, ... , 324237.4]
# 全年GDP总和
gdp_all_year = [412119.3, ... ,1143669.7]
gdp_data = list(zip(years, gdp_Q1, gdp_Q2, gdp_Q3, gdp_Q4, gdp_all_year))
tpl = DocxTemplate('template.docx')
context = {"gdp_data": gdp_data,
	       "p1": InlineImage(tpl, 'p1.png', width=Mm(175),height=Mm(95)),    
	       "p2": InlineImage(tpl, 'p2.png', width=Mm(175),height=Mm(95)),    
	       "fit": "全年总值 = 第一季度总值 * 0.2041 + 第二季度总值 * 3.8656 + 9671.4240"}
jinja_env = jinja2.Environment() # Jinja2环境 可以自定义渲染规则 默认就行了
tpl.render(context, jinja_env)
tpl.save("output.docx")

这里我们需要先读入模板(DocxTemplate对象),然后生成渲染字典(context),指定每个变量名指代的具体内容,最后生成Jinja2的渲染环境,用render传入并渲染模板,输出到output.docx文件中。
提示:我们可以用InlineImage对象插入图片,可以指定长与宽,如上文代码所示。

4. 最终效果

程序生成的最后效果如下:
最终结果
可以看到,表格、图片、文字均已正确插入。


🎉🎉🎉 好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023新春祝福html代码,包你学会

前言大家新年好!今天是年三十,在这个充满喜悦和欢乐的节日里,祝大家新年快乐。不论你在外面过的风生水起还是不尽人意,回到家一家人团团聚聚才是最好的。进入正题,我们作为IT民工,我们要用自己的方式表达对…

第三天总结 之 商品管理界面的实现 之 页面中 下拉框问题的解决

页面中下拉框问题的解决 在页面中 点击商品类型这个图标 会出现下拉框 展示所有的商品类型 然后通过选择的 类型 来作为 查询时的一个条件 即 当不选或选择展示所有商品时 按照 不对这个条件进行操作 选择其他的商品类型时 会查询出含有该类型的商品 下拉框中 数据的展示与 如…

java设计模式中责任链模式是什么/怎么用责任链模式避免if-else语句

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 6.5 责任链模式 6.5.1 定义 职责链模式,为避免请求发生者与多个处理者耦合在一起,将所有请求处理者通过前一对象记住其下一对象的引用而连…

重学Attention

注意力机制对比RNN 主要解决了RNN无法并行,并且不能解决长序列依赖问题 所以为什么设计 Q K V这三个矩阵 一边来是让 K V的 首先通过Q 和 K点击计算Attention矩阵,这个矩阵表明的是V上每一个特征与Q的相关程度,相关程度高的,权重…

解剖一道有意思的指针题

这道指针题挺有意思的,将各级指针之间的联系联系起来,仔细分析会发现也不难,重在逻辑思维,做完将会加深你对指针的理解的,好好享受指针带来的乐趣吧!!!结果是什么呢?//题…

FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(三)

第七章 实战项目提升,完善简历 19.OV7725摄像头实时采集送HDMI显示(三) 在详细介绍过OV7725 CMOS Sensor的相关背景知识和如何初始化其内部寄存器达到输出预期视频流的目的后,就到了该例程的核心内容即把OV7725输出的视频流预先缓…

Zotero入门教程

文章目录一、生成Bibliography二、Zotero文献自动导入1. 为什么要使用SCI-HUB2. 如何自定义PDF解析器三、在Zotero中添加Extension四、文件存储位置的修改五、markdown笔记功能一、生成Bibliography 在 Document Preferences中点击“管理样式”,就可以在Zotero Styl…

我的周刊(第075期)

我的信息周刊,记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。🎯 项目elasticvue[1]基于 Vue 的 Elasticsearch 管理客户端…

Linux常见命令 16 - 权限管理命令 chown, chgrp, umask

目录 1. 改变文件/目录所有者 chown 2. 改变文件/目录的所属组 chgrp 3. 显示文件的缺省(默认)权限 umask [-S] 1. 改变文件/目录所有者 chown 改变文件权限使用chmod,只有root和当前文件拥有者可以更改,如果想要更改目录/文件的所有者&#xff0c…

MutationObserver的示例代码的使用(附示例代码)

MutationObserver的使用 首先先介绍一下MutationObserver的特点 1.MutationObserver的回调属于微队列 2.它会在触发指定 DOM 事件时,调用指定的回调函数,说白了就是用来检测DOM节点的 MutationObserver回调函数 参数 callback 一个回调函数&#xff0…

论文投稿指南——中文核心期刊推荐(环境科学 2)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

在甲骨文云容器实例(Container Instances)上部署Oracle Linux 7 Desktop

甲骨文云推出了容器实例,这是一项无服务器计算服务,可以即时运行容器,而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 7 Desktop。 创建容器实例 在甲骨文容器实例页面,单击"创建容器实例"&am…

分享150个PHP源码,总有一款适合您

PHP源码 分享150个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 150个PHP源码下载链接:https://pan.baidu.com/s/1PWajFunhPFyoNFGc6F4qSQ?pwd0sq5 提取码&#…

Linux rm命令详解,Linux删除文件目录

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 rm 命令一、常用操作1. 删除文件2. 删除目录二、其他操作作用:删除文件或目录 参数: -f 直接删除&#xff0c…

steam/csgo搬砖项目真的假的?

本文全文干货分享,如果你想通过steam搬砖做副业赚钱,看这一篇就够了! 这个项目是什么意思? 是不是你也很好奇这个玩法?我们先看下我们自己的数据,再来解释一下我们怎么赚的钱 一、项目原理 利用steam平台…

【Spring5源码学习】Spring基础介绍及调试环境搭建

Spring 是一款用于简化企业级 Java 应用开发的分层开源框架,有着强大的扩展和融合能力,它善于整合各种单层框架并建立起完整的体系,能高效统一的构造可提供企业级服务的应用系统。 1、Spring 概述 Spring Framework 是一个分层非常清晰并且依…

[C++]深复制与浅复制

深复制与浅复制 C中,默认的复制构造函数只能实现浅复制。 浅复制指的是在对象复制前,只对对象中的数据成员进行简单的复制 大多数情况下"浅复制"已经能很好的工作了,但是当类的数据成员中有指针类型时,浅复制只会复制指…

Gulp.Task 正解

gulp task 实现过程 今天从源码的角度分析下 gulp 中 task 的实现过程。多个 task 是如何执行??? 等等 gulp 插件分布图 其实通过上述截图可以看到,其实整个 gulp 内部什么逻辑都没有,都是由一个一个插件组成的。上述的…

Java多线程案例之单例模式(饿汉,懒汉)

目录 一、饿汉模式 二、懒汉模式 前言:单例模式是校招中最常见的设计模式之一。下面我们来谈谈其中的两个模式:懒汉,饿汉。 何为设计模式? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多…

《Linux性能优化实战》学习笔记 Day04

06 | 锁:如何根据业务场景选择合适的锁? 原文摘抄 当你无法判断锁住的代码会执行多久时,应该首选互斥锁,互斥锁是一种独占锁。 如果你能确定被锁住的代码执行时间很短,就应该用自旋锁取代互斥锁。 对于 99% 的线程…