【初学python】利用docx模板套打准考证的简单方法(代码不到30行)

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

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

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

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

    废话少说,上代码。为了避免代码变形,使用了图片,具体代码可以下载源文件。




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

    先看xls文件:
    1.png



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

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

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

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

    下面我们来看模板文件:




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

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

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

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

    像上面代码里:

    1. 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层循环。

    模板里的代码:




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

    1. context = {"cols": rows }
    复制代码



    模板里的代码:



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

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

    https://download.csdn.net/download/bzzd2001/12377253
    这里也上传了:
    zkz.zip(881.61 KB)

    已知问题:

    生成的横向打印docx文件使用某些版本的word打开时,提示内容有问题,要点击“确定--是--打开”才可以打开。如果使用某些版本的wps打开时,会出现2列错位,需要点击“表格工具--自动调整--平均分布各列”
  • 洞里火车
  • c
    cnr
    不错 啊
  • M
    Mansong
    活学活用,顶一下
  • R
    ResetLife
    python是个好东西,我原本只想做个excel的数据比对,结果硬生生做了个OA出来
  • c
    cjzstc
    如何解决多人使用的问题?打包EXE总是有各种问题
  • 1
    12441246
    马克司机
  • h
    hifto
    学习一下
  • R
    ResetLife
    回复6#cjzstc
    我直接上django做成了系统…… iOS fly ~
  • z
    zhanghe
    回复9#ResetLife

    牛逼啊!
  • c
    cjzstc
    好吧,服气。。
  • i
    insn
    又要骗我学py
  • I
    Ichde
    能输出成ppt 吗
  • 洞里火车
    这个插件不行
  • k
    kenchn
    马克 iOS fly ~
  • s
    shsolaris
    马克一记。
  • 活泼金属
    marklll iOS fly ~
  • 我饿。
    没人关注两个女同学很好看么
  • I
    Ichde
    回复14#洞里火车

    以后要是有相关处理经验还请分享一下,
  • 花菊
    mark iOS fly ~
  • t
    tt3tt3
    可以的 #python