【教学类-35-02】20231207大4班姓名描字帖:A4单面3*10个姓名,双面共60个名字

文章讲述了作者使用Python编写脚本,根据需求调整字帖模板,从Excel导入学生姓名,生成不同格式的字帖,包括单面和双面,最后合并为PDF文件供大班孩子练习书写。过程中体现了技术在幼儿教育中的应用和创新设计思路。
摘要由CSDN通过智能技术生成

背景需求:

需求1——需要字帖

大4班班主任说:你能给我们班孩子做一套写名字的字帖吗?我想让他们练习写名字

我说:没问题。我找找已经有的样式给你看看,再打印。

打开电脑,我把曾经做的一套“大字贴”发给她看看样板。

需求2——限定内容和数量

班主任看了模板,提出需求:

1、不要学号、班级

2、每页20个姓名

我重新做了一个word模板,修改bg单元格的数字。嵌套数组的数量、把字号调到最大。

打印一份名字笔画最多的,把纸片拿给班主任看

班主任说ok 

但是看着PDF,我感觉2*10的格子,名字左右有空格较多,有点浪费。

需求3——尝试3列*10行=30个名字

由于班级所有孩子都2-3个名字,所以我试试做成3列

客户表示也行。

需求4:尝试正反两页共打印60个名字

于是我把单元格改成从2列变成3列,名字正好写入

可以打印了,一共要打印31份。

但是最近用废纸反面打印了很多加减法题,我手里已经没有废纸了。

只能用两面空白的纸,我有点心疼,

干脆A4两面都打印名字吧,让孩子多练习几次(一面30个名字,两面60个名字)

最终设计了两页3*20行的字帖模板

素材准备;

EXCEL

WORD素材

3列20行60字为例

如果是2列10行20字,3列10行30字,也是这样的参数,就是行列删除一些

代码展示:


'''
作者:阿夏
时间:20231207
名称:大4 60个名字(30一面,正反打印).py
'''

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

from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor

# 需要几行已有文字
nn=int(input('一共几行(20行、10行)\n'))
mm=int(input('一共几列(2列、3列)\n'))
# 空格数量

wb= xlrd.open_workbook(r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\学生名单.xlsx") #打开文件并返回一个工作蒲对象。open_workbook可以点进去看看函数里面的参数的含义之类的,很详细,英语不好的可以百度翻译,翻译出来的结果差不多。
sheet=wb.sheet_by_index(0)   #通过索引的方式获取到某一个sheet,现在是获取的第一个sheet页,也可以通过sheet的名称进行获取,sheet_by_name('sheet名称')
# col1=sheet.col_values(0)# 学号
col2=sheet.col_values(1)# 名字
# col3=sheet.col_values(2)# 班级
num=len(col2)-1  # 第一列去掉第一行

list=[]
# 生成 基本组:“名字“
for i in range(1,len(col2)):
    for d in range(nn*mm):        # 要几行
        
        b1=col2[i]    #姓名
        list.append(b1)
        
   
print(list)# 60个名字

bg=[]
for x in range(0,nn):    # 10行
    for y in range(0,mm):        # 2列
        c='{}{}'.format('%02d'%x,'%02d'%y)
        bg.append(c)
print(bg)
print(len(bg))


listall=[]
for o in range(int(len(list)/(nn*mm))):
    d=list[o*nn*mm:o*nn*mm+nn*mm]
    listall.append(d)
print(listall)
print(len(listall))


print('----------第1步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
dir_name=r'C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\零时Word'
if not os.path.exists(dir_name):
    os.mkdir(dir_name)

# doc= docx.Document(r"C:\Users\jg2yXRZ\OneDrive\桌面\描字贴\打印合集描字贴.docx")# 新建Word

for n in range(int(len(listall))):    # 一共多少份
    doc = docx.Document(r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\20231207大四 {}个名字.docx".format(nn*mm))
    table = doc.tables[0] 
    for p in range(0,len(bg)):               # 一共有9个表格
       
        
        pp=int(bg[p][0:2])     # 提取表格bg里面每个元素的第0个数字==单元格X坐标  t=索引数字
        qq=int(bg[p][2:4]) 
        # f=font[t]        # 字体格式
        k=listall[n][p]               # 从4名字里提取名字\
        print(pp,qq,k)

        run=table.cell(pp,qq).paragraphs[0].add_run(k)    # 在单元格0,0(第1行第1列)输入第0个名字
        run.font.name = '黑体'  #输入时不同字体
        run.font.size = Pt(60)  #输入字体大小80或68号
        run.Bold=True
        run.font.color.rgb = RGBColor(200,200,200) #设置颜色10%黑色=深灰
    
        r = run._element
        r.rPr.rFonts.set(qn('w:eastAsia'), '黑体' )#将输入语句中的中文部分字体变为华文行楷
        table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中

    doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\零时Word\{}.docx'.format('%02d'%n))#保存为XX学号的零时word
    time.sleep(2)
    from docx2pdf import convert
    # docx 文件另存为PDF文件
    inputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\零时Word\{}.docx".format('%02d'%n)# 要转换的文件:已存在
    outputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\描字帖\零时Word\{}.pdf".format('%02d'%n)  # 要生成的文件:不存在
    # 先创建 不存在的 文件
    f1 = open(outputFile,'w')
    f1.close()
    # 再转换往PDF中写入内容
    convert(inputFile, outputFile)

    from docx2pdf import convert

print('----------第4步:把都有PDF合并为一个打印用PDF------------')

import os
from PyPDF2 import PdfMerger
target_path =  'C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/零时Word'
pdf_lst = [f for f in os.listdir(target_path) if f.endswith('.pdf')]
pdf_lst = [os.path.join(target_path, filename) for filename in pdf_lst]
pdf_lst.sort()
file_merger = PdfMerger()
for pdf in pdf_lst:
    print(pdf)
    file_merger.append(pdf)
# file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/(打印合集)大班A整页描字帖2乘5加表格-4名字-({}人).pdf".format(num))
file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/(打印合集)大4班名字60个({}份).pdf".format(len(col2)-1))
file_merger.close()
# doc.Close()

# # print('----------第5步:删除临时文件夹------------')    
import shutil
shutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/描字帖/零时Word') #递归删除文件夹,即:删除非空文件夹`

终端输入:

效果展示:

打印效果

双面的名字贴,可以描2次-4次哦

不能用记号笔,只能用铅笔或者荧光笔、水笔写。

2023年12月19日去大四班,看到钢琴上放着孩子们的字体。


大部分孩子都描完了两面,个别孩子描了一面的30个字

感悟:

1、在大四班带班,所以知道这个班级一半孩子会默写自己的名字。

2、但是不会写的孩子,还是需要“画“名字。同时需要家长告诉孩子正确的笔画序,矫正书写顺序。。

这是我第2次收到同事对幼儿纸类学具的主动需求,希望有更多的老师能看到我的Python学具设计,结合自身需要提出要求。

3、这份学具也给我启发,想出一个“名片游戏”——中大班孩子们描30个名字,然后把纸片裁剪开来(用切纸机,剪起来不整齐,废纸多),然后在空白反面自己默写1-3个名字或者绘画图案,然后把这些纸片与同伴们交换,玩收集“名片”的游戏(包含学号和名字,来确定还缺那些卡片)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值