背景需求:
2月28日去小班带班,看到班主任制作了一些小手印花束作为家长会的家长座位提示,上面贴着“”圆形白色的幼儿名字贴”。
我立刻想起了制作的过程——在word中插入文本框,然后复制无数个文本框,摆好位置,再把所有孩子的名字一个个黏贴进去。
(文本框的作用:主要是确定剪切的方位,圆形、方形外框比较常用)
(文本框名字贴常见用途:植物角植物的提供者、园所大厅里展示作业的作者、值日生挂牌……)
植物里牌子(以前花盆里都插着塑封着孩子名字的吸管,现在都要求孩子自己的制作痕迹,打印的名字相对少了)
麻烦的地方:
1、为了圆形文本框一样大小,可以点击一个圆形,反复黏贴(像右下角反复念贴))
因而要手动把每个元素拖动成X*Y矩阵结构。
矩阵 结构
2、名字需要一个个黏贴进去,默认格式
如果人数不多,手动操作也没有什么难度。但是如果遇到一下问题:
1、标签包含人数多,容易贴错——需要黏贴摆放100个圆形,黏贴100次名字。很容易疲劳,黏错名字。
2、文本框图形发生变化——如果标签外形不是圆形、而是梯形,就需要点一个圆形,修改转换一次。然后反复执行(无法批量全选改变)
3、文本框图形大小变化——本次演示的是3CM直径的圆形。如果标签长款变大或缩小。也需要一个一个文本框的修改尺寸,调整里面名字的大小,(无法批量全选改变),同时还需要调整图形与图形之间的间距。 然后反复执行。
需求思考:
在word里手动制作“文本框”的批量名字标签,图形及名字的黏贴属于完全的机械重复操作。我想是否可以利用Python+word+excel制作一个可以被批量制作的、可随时调整单一图形模板的代码。
设计过程:
在一个文件夹里的三个文件名称(py\xlsx\docx)
一、word模板(3CM文本框圆形)
新建一个Word模板,在里面插入一个圆形标签,中间输入{{name}},把线条颜色、字体设置成需要的颜色,单一的一个模板就做好了。
一定要打几个回车空行,否则,批量出来的图案会黏在一起
以下是没有加回车的结果,所有文本框黏在一起
二、EXCEL模板:
学号和名字(大部分情况便签上只打印幼儿名字,如果需要名字+学号,就做组合)。
三、代码
# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import xlwt
import xlrd
import os
import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 导入枚举常数模块
import os,time
import docx
from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
zpath=r'D:\\test\\02办公类\\09 姓名小标签'+'\\'
file_path=zpath+r'\临时'
# 二、遍历excel,逐个生成word(小标签.docx是前面的模板)
try:
os.mkdir(file_path)
except:
pass
tpl = DocxTemplate(zpath+'bq.docx')
list = pd.read_excel(zpath+'list.xlsx')
name = list["name"]
number =list['number'] # str.rstrip()用于去掉换行符
# 遍历excel行,逐个生成
num = list.shape[0]
for i in range(num):
context = {
"name": name[i],
"number": number[i],
# "eng": eng[i]
}
tpl = DocxTemplate(zpath+'bq.docx')
tpl.render(context)
tpl.save(file_path+r"\学号{}.docx".format(i+1))
# 合并所有Word
import win32com.client as win32
import os
word = win32.gencache.EnsureDispatch('Word.Application')
#启动word对象应用
word.Visible = False
path = r'D:\test\02办公类\09 姓名小标签\临时'
files = []
for filename in os.listdir(path):
filename = os.path.join(path,filename)
files.append(filename)
#新建合并后的文档
output = word.Documents.Add()
for file in files:
output.Application.Selection.InsertFile(file)#拼接文档
#获取合并后文档的内容
doc = output.Range(output.Content.Start, output.Content.End)
output.SaveAs(r'D:\test\02办公类\09 姓名小标签\合并打印(需手动整理).docx') #保存
output.Close()
# # print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree('D:\test\02办公类\09 姓名小标签\临时') #递归删除文件夹,即:删除非空文件夹
四、运行结果
成功合并了所有名字!!!
但docx格式需要调整——页边距上下左右0.7CM,分栏3-分栏5(测试)(此处后续再研究,如何把已有内容的word,用代码批量设置页边距和分栏)
其他展示效果
(举一反三,制作word文本框模板,可以大幅减少机械重复黏贴)
案例1:6CM文本框圆形-名字标签
合并word的基本样式
设置页边距和分栏后的效果
调整回车符号(删除或增加回车)
案例2:4CM*2CM文本框长方形-名字标签
合并文档最开始的样式(名字都是虚拟的,加黑框无忌讳)
打印前效果。
案例3:8*8CM爱心形状文本框-名字标签制作
合并文档初始效果
调整页边距上下左右0.7、分栏2
手动调试后的效果。