业务背景:适用于需要批量复制的各类word模板,请假单,申请单等等
女朋友最近因为一个事情经常加班到很晚,我了解一下情况后,原来是因为一个word需要一直从excel里所有数据复制粘贴复制粘贴,最后打印出来(如下图格式,数据实际更多),由于数据量庞大,女朋友1个小时,2个小时,3个小时,工作到了深夜……
思路:
通过Python openpyxl操作excel,获取excel中的数据,再通过Python
docxtpl的DocxTemplate遍历将数据渲染到word中,然后保存
Python DocxTemplate基本常用语法:
1、数据渲染:{{ val }}
2、条件判断:
{%p if 表达式 %}
内容
{%p endif %}
3、循环:
{% for item in itemList%}
内容
{% endfor %}
解决:
数据格式:
arr = [
{'payer':'张三','beneficiary':'李四','money':100,'signatory':'张三'}
,{'payer':'李四','beneficiary':'王五','money':200,'signatory':'李四'}
]
新建一个word,按照模板,要用循环语句,替换相应的数据,因为要换页,所以将循环结束在下一页,最后渲染
最终效果:
完整代码:
# coding=utf-8
import openpyxl
import docxtpl
import time
start_time = time.time()
wb = openpyxl.load_workbook('数据.xlsx', data_only=True)
ws = wb.worksheets[0]
ls = list(ws.values)[1:]
arr = [{'payer':x[0],'beneficiary':x[1],'money':x[2],'signatory':x[3]} for x in ls]
word = docxtpl.DocxTemplate(r'模板.docx')
context = {
'list':arr
}
word.render(context)
word.save("结果.docx")
end_time = time.time()
all_time = end_time - start_time
print('共执行:%s s' % all_time)
结果:耗时0.058秒
模拟1000条数据量,耗时1.41秒
1000的数据量,在word中,手动复制粘贴怕是没个半天都完成不了,而用Python,仅仅耗时1.41秒,这个工作上的效率不是提高的一点点啊。
最后,我用20行代码,俘获了女朋友的芳心,女朋友忙完活已经在喝茶打王者了(^_−)☆,隔壁妹子还在啃嗤啃嗤的继续无止境的复制粘贴复制粘贴…(✪ω✪)