目录
前言
前期准备
1、docxtpl的安装
2、数据库驱动
3、分析日报内容
实践
1、Oracle对数据进行处理
2、模板配置
3、便签数据替换
写在后面
前言
啥也不说,用docxtpl做日报简直yyds。
前期准备
1、docxtpl的安装
在线安装会很简便,直接pip命令就行了,不过因为工作原因,机器没办法访问互联网,要离线安装,所以环境都需要把包下载后进行安装然后配置。
在线安装命令如下:
pip install doxtpl
离线安装的依赖包下载地址:docxtpl · PyPI
这里选择下载whl,会减少一些安装过程中的系统软件依赖,比如Microsoft Visual Studio类的。
因为是离线安装,所以安装过程很容易因为缺少依赖报错,这时候需要看控制台报错日志,下载缺少的依赖包。
pip离线安装命令为:
pip install docxtpl-0.16.3-py2.py3-none-any.whl
2、数据库驱动
该实践日报中需要用到很多数据,数据源的获取是通过oracle数据库获取,所以还需要下载安装依赖包cx_Oracle,安装过程不赘述。
3、分析日报内容
通过观察日报组成,可以发现全是表格和日期,或者其他描述性事项,可替换性很强,并且非常适合docxtpl的使用场景。
实践
由于日报的数据都是客观数据,且可以直接从数据库中获取,所以为了是日报生成流程更清晰和顺畅,Oracle只进行数据处理,Python只进行取数逻辑编写和日报生成功能。
1、Oracle对数据进行处理
Oracle对数据的处理可以按照日报所需进行字段设置,然后根据字段内容进行逻辑处理。数据处理部分不做说明。
2、模板配置
日报中模板配置是很重要的,而docxtpl的模板配置过程还很简单上手,对于表格来说,可以通过Jinja 2语法进行编写。
表格的纵向扩充(表行)用到的特殊语法是:
| {%tr for info in natural_customer_info %} |
| {{info.col1}} |
| {%tr endfor %} |
表格的横向扩充(表列)用到的特殊语法是:
| {%tc for info in customer_info %} | {{info.col1}} | {%tc endfor %} |
该日报中有一个纵向的合并单元格,尝试在合并单元格中直接配置{{data}},{{data}}不会被替换为正常数据,什么都不显示。此时需要用到合并单元格的处理,示例如下:
| 总数 | 指标明细 |
| {%tr for i in group%} | {%tr for info in details %} |
| {{count}}{%vm%} | {{info.info}} |
| {%tr endfor %} | {%tr endfor %} |
横向单元格合并用到的是{%hm%} ,上例中group的元素个数和details的格式保持一致(对强迫症的友好提醒),会最美观,不一致问题也不大。
文本的标签最简单基础,{{text}},text随你自己定义替换就好了。
3、便签数据替换
最后一步是通过Python代码提取数据库数据,然后填写到模板中。主要代码逻辑如下:
# 连接数据库,并获取数据
import cx_Oracle as cx
from docxtpl import DocxTemplate
def get_data():
conn = cx.connect('user','pwd','host:port/instance')
cursor = conn.cursor()
cursor.prepare("sql语句(可以用 :变量名 代替变量)")
cursor.execute(None,{"变量名": 变量值})
data_set = cursor.fetchall()
result = []
# 对数据集进行遍历,处理成列表格式,且包含需要字段的数据
for data iin data_set:
result.append({
'id':data['id'],
...
})
return result
if __name__ == "__main__":
data = get_data()
# 定义context 进行数据的传递,所有键值为模板中定义的键值
context = {'data':data, ...}
docx = DocxTemplate("模板.docx")
docx.render(context)
docx.save("当日日报.docx") # 保存
写在后面
通过docxtpl可以极大的节省日报的制作时间成本,同时不用担心格式、字体问题,因为你直接可以在word中把单元格和段落的格式都设置好,而不会影响到数据!
如果有兴趣的话,大家可以下载进行练手了!



