对于广大教育工作者及相关行业来说,利用简单的word模板和excel数据,来套打准考证、存根或是通行证等各种证件。

还可以直接按照照片文件名来嵌入照片。

其实这种事,直接使用word的邮件合并就可以完成。但邮件合并操作繁琐,很多人使用不好,且排版功能,特别是多列排版,都达不到满意。

这看似简单的问题,在网上搜了很久没有找到现成的,我就试着用docxtpl这个模块,以不到30行代码,实现了套打。

废话少说,上代码。

import os, xlrd
from docxtpl import DocxTemplate,InlineImage
from docx.shared import Mmwb = xlrd.open_workbook('data.xls')
sheet = wb.sheet_by_name('Sheet1')def print_out(tpl,out_file,n,size):   ''':param tpl:自定义模板路径:param out_file:保存生成的word文档路径    :param n:生成的列数:param size:插入的图片尺寸   '''rows = [dict(zip(sheet.row_values(0), sheet.row_values(i)))    for i in range(1, sheet.nrows)]    doc = DocxTemplate(tpl)     for row in rows:  ##按照数据中的字段来生成照片对象if  os.path.exists('zp/'+row['zp']+'.jpg'):row['zp']=InlineImage(doc,'zp/'+row['zp']+'.jpg',width=Mm(size))else:row['zp']=InlineImage(doc,'mb/temp.png',width=Mm(size))  context = {"tbl_contents": [{'cols': rows[i:i+n]}   for i in range(0, len(rows), n)] }        doc.render(context)doc.save(out_file)print_out('mb/纵向模板.docx','准考证打印_纵向.docx',1,30)
print_out('mb/横向模板.docx','准考证打印_横向.docx',2,30)
print_out('mb/存根模板.docx','存根打印.docx',6,25)

代码很简单,还有一些设置在xls和模板里。

先看xls文件:

第一行为字段名,可以自定义,只要你写的和模板里相对应就行。

比如:这里有xm,模板文件里也要写成xm,不能就会找不到数据。

但是zp我写死了,zp列是照片的文件名,不含后缀,照片文件同时也放在ZP文件夹里。像张三,打印时就会到文件根目录下的ZP文件夹下的Z19212210001.jpg。也就是说,第一行的字段名,除了照片必须是zp外,其他随意。

为了避免不必要的麻烦,xls里的数据最好都是文本格式。

下面我们来看模板文件:

由于我是准备一张A4纸打4个,所以设计为2列,准考证大小为宽14cm,高9cm。

3和4对应,表示是个行内各列的循环。

1和2对应,表示是行的循环。

其实docxtpl的难点就在于模板的设计时的表格里的循环,以及相对应的,代码里的字典文件里的套嵌。

像上面代码里:

context =  {"tbl_contents": [{'cols': rows[i:i+n]}   for i in range(0, len(rows), n)] }  

rows是从xls里读出来的数组。

tbl_contents就是第一层循环,代表行数据,cols是第二层循环,代表每行有n个准考证。

对应到模板里,遍历cols,得到col数组,包含xm,ksh,zp等数据。

我的代码里,因为要同时使用几个模板,考虑到代码复用,所以“纵向模板”里,也使用了2层循环。

模板里的代码:

{%p  for item in tbl_contents %}

{%p  for col in item.cols %}

.....

{%p endfor %}

{%p endfor %}

其实“纵向模板”是一个单列模板,也就是每行只有一个准考证,这样,一个行循环就够了。如果是这样的话,字典这样可简单点:

context = {"cols": rows } 

模板里的代码:

{%p  for col in cols %}

......

{%p endfor %}

只要能搞明白,代码里的字典文件的结构和模板里的代码的对应关系,就可以了。

下附全部源码、模板及示例文件。

https://download.csdn.net/download/bzzd2001/12377253

已知问题:

生成的横向打印docx文件使用某些版本的word打开时,提示内容有问题,要点击“确定--是--打开”才可以打开。如果使用某些版本的wps打开时,会出现2列错位,需要点击“表格工具--自动调整--平均分布各列”

利用docx模板套打准考证的简单方法相关推荐

  1. 利用函数模板技术,写一个简单高效的 JSON 查询器

    JSON可谓是JavaScript的亮点,它能用优雅简练的代码实现Object和Array的初始化.同样是基于文本的数据定义,它比符号分隔更有语义,比XML更简洁.因此越来越多的JS开发中,使用它作为 ...

  2. 利用MDK软件生成bin文件的简单方法

    一.缘由: 之前学习Keil MDK-ARM软件,找了好久生成bin文件的方法,这次分享最简单的,所以写了此篇博文 二.操作步骤: 1.打开"Keil MDK-ARM软件" -找到 ...

  3. java生成docx_java利用Freemarker模板生成docx格式的word文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,生成的word占用的空间很大,几百页的word有将近100M了.所以,后面需求必须是生成的docx文档,结果导出后正常才 ...

  4. python在docx指定位置插表格_超简单Python将指定数据插入到docx模板指定位置渲染并保存...

    超简单Python将指定数据插入到docx模板渲染并生成 最近有一个需求,制作劳动合同表,要从excel表格中将每个人的数据导入到docx劳动合同中,重复量很大,因此可以使用python高效解决.为了 ...

  5. 利用Freemarker模板生成doc或者docx文档(转载整理)

    可以直接看主要代码实现 doc作为模板文件生成指定格式的doc文件 实现逻辑 1.把作为模板的doc文件另存为xml文件 2.凡是需要填充的数据用${xxxx}替代 3.利用Template类将数据填 ...

  6. 利用DOCX文档远程模板注入执行宏代码

    利用DOCX文档远程模板注入执行宏代码 简介 本地文件中在没有宏代码的情况下,攻击者可以尝试执行远程文件中宏代码.其中来自APT28的最新样本将此技术展现的淋漓尽致.该样本是docx文件,文件内没有任 ...

  7. java利用Freemarker模板生成格式友好的doc或者docx文档

    之前写过一篇利用Freemarker模板生成doc的博客,不过那个博客有点缺陷,不支持生成docx格式的文档.所以,这里补充一篇,生成docx或doc格式的文档以具体的docx模板或者doc模板为主. ...

  8. java利用Freemarker模板生成docx格式的word文档(全过程)

    参考汇总: wordexport: JAVA生成并导出Word文档技术论证 java利用Freemarker模板生成docx格式的word文档(全过程) - 旁光 - 博客园 # 参考资料 - 其他项 ...

  9. phpword 利用现有模板文档,填充数据和图片后导出保存

    话不多说,直接说步骤: 1.利用composer下载 phpword: composer require phpoffice/phpword 2.直接使用即可: public function act ...

最新文章

  1. C#--封装、继承、多态
  2. 【BZOJ1002】[FJOI2007]轮状病毒 递推+高精度
  3. 8.深度学习练习:Gradient Checking
  4. 命令测试post_【第2088期】前端中台化,把格局做大——NodeJS 和测试服务探索
  5. vue下拉框传值问题
  6. vim nerdtree 标签_学业支持 | OS课程——给你的vim换套新衣服
  7. python解密m3u8播放_Python3 通过m3u8连接获取完整媒体文件(附全网视频VIP观看方法)...
  8. (7)机器学习之make_bolbs
  9. word里面怎样输入空白下划线
  10. 口袋妖怪金心银魂详细图文攻略(下)及游戏下载
  11. 【python学习】-字典学习(访问字典所有键与值、修改与更新字典、删除字典)
  12. linux cnc 树莓派,谈谈LinuxCNC
  13. fedora16英文环境下支持中文输入法
  14. Oracle给查询结果从1到n添加序号
  15. python_安卓——canv
  16. Git出现 FETCH_HEAD fatal: refusing to merge unrelated histories解决方法
  17. 计算机毕业设计php的婚纱影楼管理系统
  18. 面向CRM的企业客户档案管理革新
  19. python上传excel文件_python读写Excel python实现Excel上传
  20. virtualbox/vbox硬件级虚拟机系统 去虚拟化 批量启动克隆修改信息工具 超能版

热门文章

  1. 复旦微魔方FM33FR0xx——FL库笔记-定义
  2. WordPress主题 Music Pro 高级音乐/电台自适应音乐销售模板[更新至v3.5]
  3. 使用FFMpeg API 获取摄像头的图像数据
  4. R语言与面向对象的编程(3):R6类
  5. SILKYPIX Developer Studio Pro for Mac v11.0.3 专业的RAW图像处理软件
  6. Science:挑战传统理论,重塑联想学习概念
  7. 小学文凭去哪学计算机,小学毕业后学籍在哪里
  8. Reacr -- Chakra-UI
  9. Creo4.0 LED灯具结构设计视频教程 灯具产品设计
  10. 使用ECharts实现数据图表分析