背景需求
在大四班里,預測試55格“5以內、10以內、20以內的加法題、減法題、加減混合題”的“實用性”。
由于只打印一份20以內加法減法混合題。
“這套20以內的加減法最難”,我詢問誰會做(摸底幼兒的水平)
有兩位男孩舉手想挑戰,其中一位頑皮男孩之前就撒嬌祈求要最難的題目,我心軟就同意給他讓他試試了。
他選走了,做了幾題后,他拿著紙問我:“X老師,你不是說這是20以內加減法嗎,為什么這里會有1+3的題目?”
我一愣,告訴他:“20以內自然包含了3以內的題目。3以內題目對你來說不是很容易”
他不明所以,但還是點點頭走了。
我轉眼一想,理解他的意思:“20以內不應該包含1+3這種5以內的簡單題目,應該至少有一個兩位數的數字,如10+5=、12+4=、”
幼兒需求:
20以內加法,排除掉10以內的加減法,只提取10-20之間的加減法。
用代碼先測試一下“X—X之間加法題”的數量
1.0版本中的“0-5以內加法”、“0-10以內加法”、“0-20以內加法”,
起始數字5與0-20之間數字的題目數
起始數字10與0-20之間數字的題目數
關鍵數字測試后,我發現一個現象
1、0-5、5-10、10-15的加法題目數量都是21題、0-10、10-20的加法題數量都是66,
結論:相隔5個數(實際6個)的數量是21題,相隔10個數(實際11個)的數量是66題。
2、0-Y都是有題目數的,X-Y會出現0題
結論:需要在排除0題,如if x=0,pass。也因此可以看到,題目數數量難以確定,不能用大于9、小于9作為判斷單元格抽取數量的標準,需要用len(P)替代9.
3、項目標題從“X以內加減題共XX題抽XX”改成“X-Y之間“+”共XX題抽XX”
第一款:X-Y之間不重復加法題“+”共XX題,抽取XX題
A類:只要正序,如10-20之間,會抽取10+0,10+1,不會出現0+10,1+10的內容 數量為66題,抽取55題。
'''
9以內“+”一頁兩份(共55格)不超過100
時間:2023年11月14日 21:46
作者:阿夏
'''import random
from win32com.client import constants,gencache
from win32com.client.gencache import EnsureDispatch
from win32com.client import constants # 導入枚舉常數模塊
import os,timeimport 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 qnfrom docxtpl import DocxTemplate
import pandas as pd
from docx2pdf import convert
from docx.shared import RGBColor# 第一步:制作不重復所有“+”、不重復所有減法# 不重復的數字題
num=int(input('打印幾份(必須是雙數)\n'))
classroom=input('班級(輸入中、大)\n')
size=20
height1=12
weight1=5
sum1=int(input('X-Y以內的“+” 最小數字X\n'))
sum2=int(input('X-Y以內的“+” 最大數字Y\n'))for sum in [sum2]:
# 5以內“+”題共21題P=[]for a in range(sum1,sum2+1): # 起始數字就是10,就是排除掉0-10之間的數字for b in range(sum2+1): # 起始數字為0,if sum1<=a+b<sum2+1: # print('{}+{}='.format(a,b))P.append('{}+{}='.format(a,b))else:passprint(P)# ['0+0=', '0+1=', '0+2=', '0+3=', '0+4=', '0+5=', '1+0=', '1+1=', '1+2=', '1+3=', '1+4=', '2+0=', '2+1=', '2+2=', '2+3=', '3+0=', '3+1=', '3+2=', '4+0=', '4+1=', '5+0=']# “+”題生成都是按小到大排列的,不需要sort排序print('{}-{}之間的加法題共有 {} 題'.format(sum1,sum,len(P)) ) # 21# 第一行的班級和項目D=[]c='{}'.format(classroom)if len(P) <=55:title='{}-{}“+”共{}抽{}題'.format(sum1,sum2,len(P),len(P))if len(P) >55:title='{}-{}“+”共{}抽55題'.format(sum1,sum2,len(P))d=['0001','0002']# 表格0 表格2的 03 05單元格里寫入標題信息cD.append(c)D.append(title)print(D)# 制作"單元格"bgall=[]for bb in d:bgall.append(bb)for x in range(1,height1): for y in range(0,weight1): s1='{}{}'.format('%02d'%x,'%02d'%y) # 數字加空格bgall.append(s1) print(bgall) print(len(bgall))# 不同情況下的單元格數量if len(P) <=55:bg=bgall[0:2+len(P)]print(bg)print(len(bg))else:bg=bgall[0:len(bgall)]print(bg)print(len(bg))# ['0003', '0005', '0100', '0101', '0102', '0103', '0104', '0200', '0201', '0202', '0203', '0204', '0300', '0301', '0302', '0303', '0304', '0400', '0401', '0402', '0403', '0404', '0500']# 新建一個”裝N份word和PDF“的臨時文件夾imagePath1=r'C:\Users\jg2yXRZ\OneDrive\桌面\加減法\零時Word'if not os.path.exists(imagePath1): # 判斷存放圖片的文件夾是否存在os.makedirs(imagePath1) # 若圖片文件夾不存在就創建n=int(num/2)for z in range(0,n): #多少份 # 標題說明# 新建worddoc = Document(r'C:\Users\jg2yXRZ\OneDrive\桌面\加減法\01加減法模板一頁兩份(加減法,大量題目).docx') for j in range(2):if len(P) <=55:# D=[]# 小于9的題目,要計算一共有幾題,寫入等量的單元格內, C=random.sample(P,len(P)) for cc in C:D.append(cc)print(D)print(len(D))else:# D=[]# 大于9的題目,只要抽取55題,多余的寫不下, C=random.sample(P,len(bgall)) # 55格for cc in C:D.append(cc)print(D)print(len(D))# # 房間模板(第一個表格)要寫入的門牌號列表 table = doc.tables[j] # 表0,表2 寫標題用的# 標題寫入3、5單元格 for t in range(0,len(bg)): # 0-5是最下面一行,用來寫卡片數字pp=int(bg[t][0:2]) # qq=int(bg[t][2:4])k=str(D[t]) # 提取list圖案列表里面每個圖形 t=索引數字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(46) #輸入字體大小默認30號 換行(一頁一份大卡片run.font.size = Pt(size) #是否加粗run.font.color.rgb = RGBColor(200,200,200) #數字小,顏色深0-255run.bold=True# paragraph.paragraph_format.line_spacing = Pt(180) #數字段間距r = run._elementr.rPr.rFonts.set(qn('w:eastAsia'), '黑體')#將輸入語句中的中文部分字體變為華文行楷table.cell(pp,qq).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT #居中 # doc.save(r'C:\Users\jg2yXRZ\OneDrive\桌面\加減法\零時Word\{}.docx'.format('%02d'%(z+1)))#保存為XX學號的電話號碼word from docx2pdf import convert# docx 文件另存為PDF文件inputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/加減法/零時Word/{}.docx".format('%02d'%(z+1))# 要轉換的文件:已存在outputFile = r"C:/Users/jg2yXRZ/OneDrive/桌面/加減法/零時Word/{}.pdf".format('%02d'%(z+1)) # 要生成的文件:不存在# 先創建 不存在的 文件f1 = open(outputFile, 'w')f1.close()# 再轉換往PDF中寫入內容convert(inputFile, outputFile)print('----------第4步:把都有PDF合并為一個打印用PDF------------')# 多個PDF合并(CSDN博主「紅色小小螃蟹」,https://blog.csdn.net/yangcunbiao/article/details/125248205)import osfrom PyPDF2 import PdfFileMergertarget_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 = PdfFileMerger()for pdf in pdf_lst:print(pdf)file_merger.append(pdf)if len(P) <=55:file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/加減法/(打印合集)01“+”(一頁兩份 )55題{}-{}之間“+”共{}題抽{}題({}共{}人打印{}張).pdf" .format('%02d'%sum1,'%02d'%sum2,'%03d'%len(P),'%02d'%len(P),c,num,n))else:file_merger.write("C:/Users/jg2yXRZ/OneDrive/桌面/加減法/(打印合集)01“+”(一頁兩份 )55題{}-{}之間“+”共{}題抽55題({}共{}人打印{}張).pdf".format('%02d'%sum1,'%02d'%sum2,'%03d'%len(P),c,num,n))file_merger.close()# doc.Close()# # print('----------第5步:刪除臨時文件夾------------') import shutilshutil.rmtree('C:/Users/jg2yXRZ/OneDrive/桌面/加減法/零時Word') #遞歸刪除文件夾,即:刪除非空文件夾