样例展示:不跳过节日+每周场地斜角排列场地循环排序表(8个班级8组内容)
背景需求:
给大班排完后,我又试着给中班组做批量,中班组长说已经请一位组员用人工排aEXCL表。
中班各班起始场地如下:
“跳过节日”的运动场地安排。
问题产生:
中班排序老师观看内容后,觉得这和她人工排的内容不同。
我仔细观看她的排序方法,终于发现了不同之处
中班分散运动的排序规律:“斜角排序”
解决方案
根据客户要求,我感觉只要微调代码,就能实现这种效果
1、模板方式批量5天:为了便于核对“斜角信息”,所以我打算基本批量5天(不跳过节假日)
2、第1周(起始周)、第21周(最后周):改成2天。确保9月1日(用第1周第1个场地)
重要步骤说明:
运行代码:
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
'''总部中班3-8 斜线 运动场地循环排序(斜线 +不跳假日_以此为准 保存在桌面word2pdf2png).py'''
print('---------运动场地的循环------')
print('---------规则:------')
print('---------1.有8个运动场地,01 02 03 04 05 06 :------')
print('---------2.中1班从01开始游戏,01 02 ------')
print('---------3.中1班从02开始游戏,02 03 04 05 06 ------')
print('---------4.中1班从03开始游戏,03 04 05 06 07 ------')
print('---------依次类推,最后制作出所有中班的每周的运动排序表 ------')
print('---------通常是每周5天,需要跳过节假日 ------')
time.sleep(2)
print('---------第1步:把8个运动场地循环21次(105元素组成的列表)------')
# 本学期:中1,中2,中3,中4,中5,中7,中8,中9班,其中6班空缺,一共有8个中班
gradenum=['3','4','5','6','7','8']
# print(len(gradenum))# 8
# radenum的长度=7,0-7,一共循环8次
for num in range(0,len(gradenum)):
L=[]# 这里的L等于list,因为和最后excle合并程序中的代码有冲突,所以全部改成中写的首字母
L1=[]
L3=[]
L2=[]
# "车类区\n(指示牌、各种车类)","平衡区\n(竹梯、三脚架、垫子等)","力量区\n(轮胎、滑索、水桶)",
# "跑跳区\n(跨栏、轮胎、接力棒)","竞技区\n(球类、隔离网、球门)","钻爬区\n(爬笼、书包、铃铛)"
# 这里是6个运动场地,因为后面有递进,所以把最后一个 08,放到01前面,这样摆放后面才会正确)
L3=["钻爬区\n(爬笼、书包、铃铛)","车类区\n(指示牌、各种车类)","平衡区\n(竹梯、三脚架、垫子等)","力量区\n(轮胎、滑索、水桶)",
"跑跳区\n(跨栏、轮胎、接力棒)","竞技区\n(球类、隔离网、球门)"]
# 生成8个班级8组运动(第1个元素不同)
for i in range(0,len(gradenum)): #
b = L3.pop(0) # 在运动场地列表L3中 删除 第1个元素 中1班 先删除08,就是从01开始
L3.append(b) # 在运动场地列表L3最后 添加 第1个元素
# print(L[0])
L1.append(L3[0:len(gradenum)]) # 把不断变化的内容添加到L1
# 8个班级场地“基本元素“构成了L1列表:[['01', '02', '03', '04', '05', '06', '07', '08'], ['02', '03', '04', '05', '06', '07', '08', '01'], ['03', '04', '05', '06', '07', '08', '01', '02'], ['04', '05', '06', '07', '08', '01', '02', '03'], ['05', '06',
# print(L1)
for b in range(22): # 把各班“场地基本元素8个”循环21次,数量多一点,便于后期提取内容
for y in L1[num]: #抽取L1中的一组组内容 L1[0]=['01', '02', '03', '04', '05', '06', '07', '08']、L1[1]=['02', '03', '04', '05', '06', '07', '08', '01'],
# print(y) # 在用 y提取L1[0]中的'01', '02', '03', '04', '05', '06', '07', '08'三个元素
L.append(y) #把y提取的单个元素一个个加到列表里,并且依次循环22次,数量足够多
print(L)
# 打印出来中1班 列表组=['01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08']
print('---------第2步:如果一周有5天(不考虑跳过假日)------')
#
print('中{}班'.format(gradenum[num]))
for i in range(1):#共20周这是第1周,是原始的位置81234
print(L[0:2]) # 列表有8个运动项目,但只要其中5个(周一到周五)
L2.append(L[0:2])
for i in range(2,21): #共20周 这是第2-20周 ,如果是21周,把2,21 改成2,22
L=L[1:] # 5代表前面一个数已经取过5位
L.append(L) # 将a安排到最后一个座位
print(L[0:5]) # 列表是八个循环,我只要其中5个
L2.append(L[0:5])
for i in range(21,22): #共20周 这是第2-20周 ,如果是21周,把2,21 改成2,22
L=L[1:] # 5代表前面一个数已经取过5位
L.append(L) # 将a安排到最后一个座位
print(L[0:2]) # 列表是八个循环,我只要其中5个
L2.append(L[0:2])
# print('---------第3步:如果每周需要跳过假日(考虑跳过假日)------')
# # 每周需要的天数 (跳过节日.如第1周只有2天工作,9月1-2日(周四周五) ,第3周周一是中秋节放假1天,所以只有4个工作日)
# day=['2','5','4','5','5','2','5','5','5','5','5','5','5','5','5','5','5','4','5','5','2']
# print('中{}班'.format(gradenum[num]))
# # 第1周
# for d in range(0,1): # d=索引数字
# print(L[0:int(day[0])]) # 列表有8个运动项目,但只要其中5个(周一到周五)
# L2.append(L[0:int(day[0])])
# # 第2周开始
# for d in range(1,len(day)): # 0-21
# # print(d+1)
# L=L[int(day[d-1]):] # day[0]=2,
# L.append(L) # 将a安排到最后一个座位
# print(L[0:int(day[d])])# 列表是八个循环,我只要其中5个
# L2.append(L[0:int(day[d])])
print('---------第4步:xls写入)------')
workbook = xlwt.Workbook()# 新建xls工作簿
sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
# 第0列 写入“第1周、第2周、第3周……第21周
dates=[]
for i in range(1,22):
n="第{}周".format(i) # 用遍历方法获得“第1周、第2周、第21周”字样,
dates.append(n) # 添加到列表
print(dates)
# print(date)
row=1
for d in range(0, len(dates)):
sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
row += 1
# 第0行 写入 星期一 '星期二','星期三','星期四','星期五 #
weeks = ['周次','星期一','星期二','星期三','星期四','星期五']
week = len(weeks)
col=0
for d in range(0, len(weeks)):
sheet.write(0,col,weeks[d]) # 因为只有一行,所以就用有两种写法(enumerate和这种)
col+= 1
# 输入星期的另一种写法
# col=0
# for row,item in enumerate(weeks,0): # 可以这样写L2[i]=表格内的内容=item,索引数字=col 0代表在A1 1代表在B1
# sheet.write(col,row,item) # 第1行第1列开始写入一行”星期X"
# col+=1
# 第B2开始写入 运动内容
arrlan = len(L2)# L2['07', '08', '01', '02', '03']的长度 21组
row = 1 # 第2行
for i in range(arrlan): # 遍历21组[]的总数
for col,item in enumerate(L2[i],1): # L2[i]=表格内的内容=item,索引数字=col
sheet.write(row,col,item) # row,col,item 行=1、列=索引数字、内容=表格内容 写入第一行第一列
row += 1
print('---------第5步:xls保存N份工作簿(每份一页)------')
try:
workbook.save(r"C:\Users\Administrator\Desktop\word2pdf2png\中{}班分散运动.xls".format(gradenum[num])) # 新建保存 只能xls
print('计划生成成功')
except e:
print('失败...')
print(e)
print('---------第6步:把N份xls单页内容合并在1个工作簿的N个工作表内)------')
time.sleep(2)
# 获取目录下所有的表
import os
import pandas as pd
dir = r'C:\Users\Administrator\Desktop\word2pdf2png'
# 获取目录下所有的表
origin_file_list = os.listdir(dir)
print(origin_file_list)
with pd.ExcelWriter(r'C:\Users\Administrator\Desktop\word2pdf2png\2022年9月总部6个中班分散运动合集.xls') as writer:
# 循环遍历表格
for i in origin_file_list:
# 拼接每个文件的路径
file_path = dir + '/' + i
# 把表名赋予给对应的sheet
sheet_name = i[:-4]
df = pd.read_excel(file_path)
# 变相解决表格中第一行第一列为空的缺陷
ring = "".join(list(str(i) for i in df.index))
# string = .join(list(str(i) for i in df.index))
# 判断如果索引都为数字,则不保留索引(根据自己代码调整)
if ring.isdigit():
df.to_excel(writer, sheet_name,index=False)
else:
df.to_excel(writer, sheet_name)
运行结果
最后会出现一串报错代码,但是不影响运行结果
桌面上的word2pdf2png
观看差异:
中4班的运动排序情况(第3周周5是平衡区)
中5班的运动排序情况(第3周周5是力量区)
特别说明:
虽然程序批量生成了跳过节日的运动场地,但是涉及到节日的部分内容还是需要手动调整。(而且是1个班级的手工剪切复制)或者可以写程序,提取表中的数据,然后批量放到正确的表格内
实用效果:
中班老师有一定的兴趣。
特别感悟:
中班组已经排好了名单,理论上明年可以继续使用。但考虑到一些潜在因素:
(1)班级号会变:拆班少1个班级
(2)周次变化:19周?21周?
(3)运动场地名称会调整变化:平衡区改成平衡小勇士
(4)排列规则变化:依次排列跳过节日、依次排列不跳过节日、斜线排列等