效果展示
背景需求:
最近大4班做“嵌套骰子”非常频繁,为了避免“疲劳”,我找出他们班家长的手机号,批量做了“破译电话号码”,有图案版和加减法版,考虑到第一次做,还是选最简单的“点数总数,写出数字”,于是批量了一套“图案版的破译手机号码
代码展示:
'''
作者:阿夏
时间:2023年3月2日 破译电话号码-图形版-学号和班级(不需要分列,直接导入word)
'''
import openpyxl
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
import os
classroom=input('班级名称(如中1)\n')
bao1=int(input('需要保留名字吗?是=1,否=2\n'))
bao2=int(input('需要保留学号吗?是=1,否=2\n'))
bao3=int(input('需要保留班级吗?是=1,否=2\n'))
print('----------第2步:新建一个临时文件夹------------')
# 新建一个”装N份word和PDF“的文件夹
os.mkdir(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word')
print('------------读取excle表单--------------')
wb = openpyxl.load_workbook(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\家长电话号码.xlsx')# wb=用openpyxl打开存有号码的ExcelEx
phone = wb.active #phone=获取wb里面的数据
print('------------读取 爸爸的手机号--------------')
symbol_1=['●','●','●', '●', '●', '●','●', '●','●','●','●']
father=[]
for i in list(phone.columns)[4]:# 第3列是爸爸的手机号
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
print(phonestr)# 打印电话字符串
# Phonenum1
# 13512345678
# 16556345690
# 13724680156
print('------------ 爸爸的手机号的数字全部写在一起--------------')
col = 0 #
for k in phonestr:# 在电话字符串里面循环遍历 取各种数字
if i.value!= 'Phonenum1':# 如果电话号码的值不等于'dad' 不要第一行C1
if int(k) != 0:# 如果取出的数字不等于0 等于1-9
str_temp =int(k) * symbol_1[col]# 结果等于 取出的数字的整数 乘以 符号列表的相应列数的符号(批量几个符号)
else:# 如果取出的数字=于0
str_temp = '零'# 0=零
# print( str_temp)
father.append(str_temp)
col +=1
print(father)
['●', '●●●', '●●●●●', '●', '●●', '●●●', '●●●●', '●●●●●', '●●●●●●', '●●●●●●●', '●●●●●●●●', '●', '●●●●●●', '●●●●●', '●●●●●', '●●●●●●', '●●●', '●●●●', '●●●●●', '●●●●●●', '●●●●●●●●●', '零', '●', '●●●', '●●●●●●●', '●●', '●●●●', '●●●●●●', '●●●●●●●●', '零', '●', '●●●●●', '●●●●●●']
print('------------读取 妈妈的手机号--------------')
mother=[]
symbol_2 = ['▲','▼','●','♦','■','▶','◀','◣','◥','◤','◢']#
for j in list(phone.columns)[6]:
phonestr = str(j.value)
print(phonestr)
# Phonenum2
# 13214562358
# 15615617891
# 13123568210
print('------------ 妈妈的手机号的数字全部写在一起--------------')
col = 0# 第一个字符串的起始列 123数下去 mum电话的第一位数在第O列=15列
for _ in phonestr[:]:
if j.value != 'Phonenum2':
if int(_) != 0:
str_temp = int(_) * symbol_2 [col]
else:
str_temp = '零'
mother.append(str_temp)
col +=1
print(mother)
# ['▲', '▼▼▼', '●●', '♦', '■■■■', '▶▶▶▶▶', '◀◀◀◀◀◀', '◣◣', '◥◥◥', '◤◤◤◤◤', '◢◢◢◢◢◢◢◢', '▲', '▼▼▼▼▼', '●●●●●●', '♦', '■■■■■', '▶▶▶▶▶▶', '◀', '◣◣◣◣◣◣◣', '◥◥◥◥◥◥◥◥', '◤◤◤◤◤◤◤◤◤', '◢', '▲', '▼▼▼', '●', '♦♦', '■■■', '▶▶▶▶▶', '◀◀◀◀◀◀', '◣◣◣◣◣◣◣◣', '◥◥', '◤', '零']
print('------------ 爸爸的手机号拆开成11个一组的列表--------------')
father_all=[]
for i in range(0,int(len(father)/11)):
b=father[i*11:i*11+11]
father_all.append(b)
print(father_all)
# [['●', '●●●', '●●●●●', '●', '●●', '●●●', '●●●●', '●●●●●', '●●●●●●', '●●●●●●●', '●●●●●●●●'], # ['●', '●●●●●●', '●●●●●', '●●●●●', '●●●●●●', '●●●', '●●●●', '●●●●●', '●●●●●●', '●●●●●●●●●', '零'],['●', '●●●', '●●●●●●●', '●●', '●●●●', '●●●●●●', '●●●●●●●●', '零', '●', '●●●●●', '●●●●●●']]
print('------------ 妈妈的手机号拆开成11个一组的列表--------------')
mother_all=[]
for i in range(0,int(len(mother)/11)):
b=mother[i*11:i*11+11]
mother_all.append(b)
print(mother_all)
# [['▲', '▼▼▼', '●●', '♦', '■■■■', '▶▶▶▶▶', '◀◀◀◀◀◀', '◣◣', '◥◥◥', '◤◤◤◤◤', '◢◢◢◢◢◢◢◢'],
# ['▲', '▼▼▼▼▼', '●●●●●●', '♦', '■■■■■', '▶▶▶▶▶▶', '◀', '◣◣◣◣◣◣◣', '◥◥◥◥◥◥◥◥', '◤◤◤◤◤◤◤◤◤', '◢'],
# ['▲', '▼▼▼', '●', '♦♦', '■■■', '▶▶▶▶▶', '◀◀◀◀◀◀', '◣◣◣◣◣◣◣◣', '◥◥', '◤', '零']]
if bao1==1 and bao3==1: # 需要姓名和班级
info='姓名+班级'
print('------------读取 学号或者姓名--------------')
N=[]
for i in list(phone.columns)[2]:# 学号-0 姓名2
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
N.append(phonestr)
print(N)# ['N', '1', '11', '24']
print('------------读取 班级--------------')
C=[]
for i in list(phone.columns)[1]:#
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
C.append(phonestr)
print(C)#['CLASS', '大七班', '大七班', '大七班']
print('------------ 数据导入word,字体设置--------------')
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
for y in range(0,int(len(father)/11)):
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\破译电话号码模板(图案).docx')
wb = pd.read_excel(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\家长电话号码.xlsx')
table = doc.tables[0]
print('------------学号\班级写入,字体设置--------------')
n=N[y+1]
run=table.cell(0,2).paragraphs[0].add_run(n) # 这里的可以代表学号或者名字,把上面连接的数字改掉 姓名02 学号06 班级08(下面的数字也要改)
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
c=C[y+1]
run=table.cell(0,8).paragraphs[0].add_run(c) # 班级08
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,8).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
for nn in range(0,11):
print('------------ 爸爸的手机号写入不同的word,字体设置--------------')
f=father_all[y][nn]
print(f)
run=table.cell(2,nn).paragraphs[0].add_run(f) # 在第该表格3行1列的单元格内输入“xxxx”
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(16) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(2,nn).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
print('------------ 妈妈的手机号写入不同的word,字体设置--------------')
g=mother_all[y][nn]
print(g)
run=table.cell(5,nn).paragraphs[0].add_run(g) # 在第该表格3行1列的单元格内输入“xxxx”
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(18) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(5,nn).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.docx'.format('%02d'%(y+1)))#保存为XX学号的电话号码word
# docx 文件另存为PDF文件
inputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.docx".format('%02d'%(y+1)) # 要转换的文件:已存在
outputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.pdf".format('%02d'%(y+1)) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
if bao2==1 and bao3==1: # 需要学号和班级
info='学号+班级'
print('------------读取 学号或者姓名--------------')
N=[]
for i in list(phone.columns)[0]:# 学号-0 姓名2
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
N.append(phonestr)
print(N)# ['N', '1', '11', '24']
print('------------读取 班级--------------')
C=[]
for i in list(phone.columns)[1]:#
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
C.append(phonestr)
print(C)#['CLASS', '大七班', '大七班', '大七班']
print('------------ 数据导入word,字体设置--------------')
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
for y in range(0,int(len(father)/11)):
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\破译电话号码模板(图案).docx')
wb = pd.read_excel(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\家长电话号码.xlsx')
table = doc.tables[0]
print('------------学号\班级写入,字体设置--------------')
n=N[y+1]
run=table.cell(0,6).paragraphs[0].add_run(n) # 这里的可以代表学号或者名字,把上面连接的数字改掉 姓名02 学号06 班级08(下面的数字也要改)
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,6).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
c=C[y+1]
run=table.cell(0,8).paragraphs[0].add_run(c) # 班级08
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,8).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
for nn in range(0,11):
print('------------ 爸爸的手机号写入不同的word,字体设置--------------')
f=father_all[y][nn]
print(f)
run=table.cell(2,nn).paragraphs[0].add_run(f) # 在第该表格3行1列的单元格内输入“xxxx”
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(16) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(2,nn).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
print('------------ 妈妈的手机号写入不同的word,字体设置--------------')
g=mother_all[y][nn]
print(g)
run=table.cell(5,nn).paragraphs[0].add_run(g) # 在第该表格3行1列的单元格内输入“xxxx”
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(18) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(5,nn).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.docx'.format('%02d'%(y+1)))#保存为XX学号的电话号码word
# docx 文件另存为PDF文件
inputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.docx".format('%02d'%(y+1)) # 要转换的文件:已存在
outputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.pdf".format('%02d'%(y+1)) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
if bao1==1 and bao2==1 and bao3==1: # 三个信息都有
info='姓名+学号+班级'
print('------------读取 学号-------------')
N=[]
for i in list(phone.columns)[0]:# 学号-0 姓名2
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
N.append(phonestr)
print(N)# ['N', '1', '11', '24']
print('------------读取 学号姓名--------------')
Num=[]
for i in list(phone.columns)[2]:# 学号-0 姓名2
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
Num.append(phonestr)
print(N)# ['N', '1', '11', '24']
print('------------读取 班级--------------')
C=[]
for i in list(phone.columns)[1]:#
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
C.append(phonestr)
print(C)#['CLASS', '大七班', '大七班', '大七班']
print('------------ 数据导入word,字体设置--------------')
from docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor
for y in range(0,int(len(father)/11)):
doc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\破译电话号码模板(图案).docx')
wb = pd.read_excel(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\家长电话号码.xlsx')
table = doc.tables[0]
print('------------学号\班级写入,字体设置--------------')
n=N[y+1]
run=table.cell(0,6).paragraphs[0].add_run(n) # 这里的可以代表学号或者名字,把上面连接的数字改掉 姓名02 学号06 班级08(下面的数字也要改)
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,6).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
num=Num[y+1]
run=table.cell(0,2).paragraphs[0].add_run(n) # 这里的可以代表学号或者名字,把上面连接的数字改掉 姓名02 学号06 班级08(下面的数字也要改)
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
c=C[y+1]
run=table.cell(0,8).paragraphs[0].add_run(c) # 班级08
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.color.rgb = RGBColor(220,220,220) #设置颜色浅灰
run.font.size = Pt(45) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(0,8).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
for nn in range(0,11):
print('------------ 爸爸的手机号写入不同的word,字体设置--------------')
f=father_all[y][nn]
print(f)
run=table.cell(2,nn).paragraphs[0].add_run(f) # 在第该表格3行1列的单元格内输入“xxxx”
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(16) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(2,nn).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
print('------------ 妈妈的手机号写入不同的word,字体设置--------------')
g=mother_all[y][nn]
print(g)
run=table.cell(5,nn).paragraphs[0].add_run(g) # 在第该表格3行1列的单元格内输入“xxxx”
run.font.name = '黑体'#输入时默认华文琥珀字体
run.font.size = Pt(18) #输入字体大小默认30号
r = run._element
r.rPr.rFonts.set(qn('w:eastAsia'), '黑体')#将输入语句中的中文部分字体变为华文行楷
table.cell(5,nn).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中
doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.docx'.format('%02d'%(y+1)))#保存为XX学号的电话号码word
# docx 文件另存为PDF文件
inputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.docx".format('%02d'%(y+1)) # 要转换的文件:已存在
outputFile = r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word\{}.pdf".format('%02d'%(y+1)) # 要生成的文件:不存在
# 先创建 不存在的 文件
f1 = open(outputFile, 'w')
f1.close()
# 再转换往PDF中写入内容
convert(inputFile, outputFile)
else:
pass
print('----------第4步:把都有PDF合并为一个打印用PDF------------')
# 多个PDF合并(CSDN博主「红色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)
import os
from PyPDF2 import PdfFileMerger
target_path = r"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 = PdfFileMerger()
for pdf in pdf_lst:
print(pdf)
file_merger.append(pdf)
file_merger.write(r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\(打印合集)破译电话号码-图案版({})-{}班-{}份.pdf".format(info,classroom,int(len(father)/11)))
file_merger.close()
# doc.Close()
print('----------第5步:删除临时文件夹------------')
import shutil
shutil.rmtree(r"C:\Users\jg2yXRZ\OneDrive\桌面\破译电话号码\零时Word") #递归删除文件夹,即:删除非空文件夹
终端输入:,
分析:
应该用Def函数把相似部分包在一起,缩短代码长度,但是水平有限,怕搞不清内容,还是用了机械办法罗列。
效果展示
三份打印合集(适合不同水平的幼儿)
1、适合中班默写学号——有姓名 有班级,无学号,适合中班幼儿
教学情况:
时间:2023年05月08日
班级:中6班
人数:27人