最终效果图:

含有(周次、日期月日去0、星期、班级、园区、姓名、备注)

20220927第一次代码

背景需求:

本学期我的岗位调整为机动岗(不担任固定班级的班主任),上午承担各种各条线的辅助工作(信息、科研、教研),下午进入相关班级代班。(排班要求如下)

表内说明:

第一周:周一进小3班、周二近中1、周四进中3,周五进中4班。

第二周:周一大1班,周二小3班、周四中1班,周五进中3班

……

存在问题:

这份排班规则让我感到比较晕:

1、循环排序:如果是5天固定进5个班级,还比较容易记忆,现在是4班一轮回,容易记不住。

2、周三空缺:此外周三不排班,需要跳过。更容易干扰排班。

因此:我尝试用”运动排班“的代码,进行程序批量排班,直接将转化出一份直观可读的排版表。

代码设置

import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
# # list2=int(input('你班级第1周第1天的运动场地数字(不同班级不同的起始数字'))# 第一步:把五天都改好
# listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
#  '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
#   '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
#    '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
#     ]
print('-----------第1步,把每周排班5天做成21周的日期--------')
listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']# 基本的一周排班
list=[]
for x in range(21):  #大约有21周for y in listsingle:       # 提取基本一周排班里面的每一个值# print(y)list.append(y)  # 把每个班级添加到list列表里,顺序为“小3(二)','中1(一)','中3(总)','中4(总)','大1(总)” 并且重复提取21次。
print(list)  # 不缩进,打印出来只有一份105个元素的列表print('-----------第2步,只抽取每周四个--------')
list2=[]# 取空列表
for i in range(1):#共21周这是第1周list1=listprint(list[0:4]) # 列表有105个运动项目,但只要前0-4list2.append(list[0:4])
for i in range(2,22):  #共21周    这是第2-21周  ,如果是21周,把2,21 改成2,22 list1=list[0] # 获取第一个alist=list[4:]  #  前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取list.append(list1) # 将a安排到最后一个座位print(list[0:4]) # 列表里每次提取4个list2.append(list[0:4])  print('-----------第3步,保存到excle--------')
# 以下是xls保存
arrlan = len(list2)# list2是终端显示的列表值
workbook = xlwt.Workbook()# 新建xls工作簿
sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheetrow = 0
for i in range(arrlan):for col,item in enumerate(list2[i],0):sheet.write(row,col,item)  row += 1try:workbook.save(r"D:\test\06分散运动的循环\每周下午排班.xls")    # 新建保存 只能xlsprint('计划生成成功')
except e:print('失败...')print(e)

步骤解析:

第1步:把初始排版顺序输入:'小3(二)','中1(一)','中3(总)','中4(总)','大1(总)'

循环21周(本学期21)list列表里有105个元素周)

第2步:第1周提取4个,第2-21周提取4个

第3步:保存EXCL并打开

技术有限,这里还是手动添加了周次和星期(每周下面插了一行,四个班级之间可能会调换,每周必须带满四个下午班)

打印效果(这样就一目了然了))

感悟:python程序批量可以快速根据要求制定N周的排班级、排场地、排人计划,让人工摆脱无聊机械的重复所产生了暴躁和失误。

努力研究更多的排班表(教师早晚值班表:需要跳过节日)、活动室安排表(时间班级不重复),降低更多的人工损耗。

20221010代码优化:

1、在数组中间隔插入空值,直接实现“周三空”

2、行与行之间有空格。

代码展示:


from contextlib import nullcontext
import datetime
import sys
import random
from tkinter import dnd
import xlrd
import xlwt
from openpyxl import load_workbookw=int(input('共有几周?\n'))# 21周
# n=int(input('行与行之间的空格(空1行输入2,不空输入1?\n'))# 21周
# print(n)print('-----------第3步,把每周排班5天做成21周的日期--------')
# 做21周的数组
listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']# 基本的一周排班
lists=[]
for x in range(w):  #大约有21周for y in listsingle:       # 提取基本一周排班里面的每一个值# print(y)lists.append(y)  # 把每个班级添加到list列表里,顺序为“小3(二)','中1(一)','中3(总)','中4(总)','大1(总)” 并且重复提取21次。
# print(list)  # 不缩进,打印出来只有一份105个元素的列表
# ['小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)',
# '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)']   print('-----------第2步,间隔两个插入一个空(周三空)--------')
list_all=[]# 取空列表
null=''
# 先取2个值,后面都是4个连续取值
list_all.append(lists[0])
list_all.append(lists[1])
list_all.append(null) # 4个取值,索引数字不断增加
for x in range(21):list_all.append(lists[2+(4*x)]) list_all.append(lists[3+(4*x)]) list_all.append(lists[4+(4*x)]) list_all.append(lists[5+(4*x)]) list_all.append(null)
print(list_all)
# ['小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '']print('-----------第2步,只抽取每周四个--------')
# 抽成5个5个一组
list_five=[]# 取空列表
for i in range(1):#共21周这是第1周list1=list_allprint(list_all[0:5]) # 列表有105个运动项目,但只要前0-4list_five.append(list_all[0:5])
for i in range(1,w):  #共21周    这是第2-21周  ,如果是21周,把2,21 改成2,22 list1=list_all[0] # 获取第一个alist_all=list_all[5:]  #  前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取list_all.append(list1) # 将a安排到最后一个座位print(list_all[0:5]) # 列表里每次提取4个list_five.append(list_all[0:5])  print('-----------第3步,保存到excle--------')
# 以下是xls保存
arrlan = len(list_five)# list_five是终端显示的列表值
# arrlan1 = len(list_all)# list_five是终端显示的列表值2
workbook = xlwt.Workbook()# 新建xls工作簿
sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet# 第0列 写入“第1周、第2周、第3周……第21周
dates=[]
for i in range(1,w+1):n="第{}周".format(i)    # 用遍历方法获得“第1周、第2周、第21周”字样,dates.append(n)          # 添加到列表
print(dates)
# print(date)row=1 # A2开始
for d in range(0, len(dates)):sheet.write(row, 0, dates[d])         # 这里enumerate不能用,因为只有一列,所以就用row +=3   # 1=逐行写入,2=中间空一行,3=中间空2行
# row=2 # A3开始 再写一次第X周(备注用)
# for dd in range(0, len(dates)):
#     sheet.write(row, 0, dates[dd])         # 这里enumerate不能用,因为只有一列,所以就用
#     row +=3   # 1=逐行写入,2=中间空一行,3=中间空2行# 第0行 写入 星期一  '星期二','星期三','星期四','星期五 ,'星期六','星期日'#
weeks = ['周次','星期一','星期二','星期三','星期四','星期五']
week = len(weeks) col=0  # A1写入
for d in range(0, len(weeks)):sheet.write(0,col,weeks[d])         # 因为只有一行,所以就用有两种写法(enumerate和这种)col+= 1  # 1=逐列写入,2=中间空一列,3=中间空2列2# B2 写入 5个5个的班级(中间空1个)
row = 1
for i in range(arrlan):for col,item in enumerate(list_five[i],1):sheet.write(row,col,item)  row += 3try:workbook.save(r"D:\test\值班表(周三空).xls")    # 新建保存 只能xlsprint('计划生成成功')
except e:print('失败...')print(e)

重点说明:

1、实现“周三空”的效果

2、行与行之间有空格。

 3、行与行之间空2行

如果把行设置为3(row+=3),就会间隔空2行,这种样式最符合我的需求。

(一行是备注,一行是空行分割,左侧有两个第X周)

重点解析:源代码里这里被注释了。如果需要左侧有两个第1周,就解除注释

将三个行ROW+=都改成3

其实空行就是靠ROW+=?来定位的。因此日期也可以加上去哦。

效果图:

实现上图的代码


# https://www.cnblogs.com/gradyblog/p/16457279.html
from contextlib import nullcontext
import datetime
import sys
import random
from tkinter import dnd
import xlrd
import xlwt
from openpyxl import load_workbook
import xlrd
import xlwtstart=input('本学期开始的日期,输入样例(2022-09-01)\n')
end=input('本学期结束的日期,输入样例(2023-01-17)\n')
begin=int(input('开始日期前空几(周1周2周3 一共3天)\n'))
last=int(input('结束日期后留几天空白(建议7天)\n'))
weeksday=int(input('本学期共有几周(如21周)\n'))
title=input('生成xls的文件名称\n')print('-----------第3步,把每周排班5天做成21周的日期--------')
# 做21周的数组
listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']# 基本的一周排班
lists=[]
for x in range(weeksday):  #大约有21周for y in listsingle:       # 提取基本一周排班里面的每一个值# print(y)lists.append(y)  # 把每个班级添加到list列表里,顺序为“小3(二)','中1(一)','中3(总)','中4(总)','大1(总)” 并且重复提取21次。
# print(list)  # 不缩进,打印出来只有一份105个元素的列表
# ['小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)',
# '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)']   print('-----------第2步,间隔两个插入一个空(周三空)--------')
list_all=[]# 取空列表
null=''
# 先取2个值,后面都是4个连续取值
list_all.append(lists[0])
list_all.append(lists[1])
list_all.append(null) # 4个取值,索引数字不断增加
for x in range(21):list_all.append(lists[2+(4*x)]) list_all.append(lists[3+(4*x)]) list_all.append(lists[4+(4*x)]) list_all.append(lists[5+(4*x)]) list_all.append(null)
print(list_all)
# ['小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '']print('-----------第2步,只抽取每周五个--------')
# 抽成5个5个一组
list_five=[]# 取空列表
for i in range(1):#共21周这是第1周list1=list_allprint(list_all[0:5]) # 列表有105个运动项目,但只要前0-4list_five.append(list_all[0:5])
for i in range(1,weeksday):  #共21周    这是第2-21周  ,如果是21周,把2,21 改成2,22 list1=list_all[0] # 获取第一个alist_all=list_all[5:]  #  前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取list_all.append(list1) # 将a安排到最后一个座位print(list_all[0:5]) # 列表里每次提取4个list_five.append(list_all[0:5])  print('------------第3步:生成年月日列表(前后有空日)------------')def date_generate(start_date, end_date):# print(f'Hi, {start_date}, {end_date}')start_dt = datetime.datetime.strptime(start_date, "%Y-%m-%d")end_dt = datetime.datetime.strptime(end_date, "%Y-%m-%d")next_dt = start_dtdate_list = []for x in range(begin):        # 日期开始前加几个空值,替代8月29日8月30日8月31日b=''date_list.append(b)print(date_list)  while next_dt <= end_dt:# next_dt_str = next_dt.strftime("%Y-%m-%d")# next_dt_str = next_dt.strftime("%m/%d")next_dt_str = next_dt.strftime("%m/%d")# print(next_dt_str)date_list.append(next_dt_str)next_dt = next_dt + datetime.timedelta(days=1)print(date_list)for x in range(last):        # 日期结束后加几个空值,以免重新开始选取b=''date_list.append(b)print(date_list)       #生成全部需要的列表 ['', '', '', '2022-09-01', '2022-09-02', '2022-09-03', '2022-09-04', '2022-09-05', '2022-09-06', '2022-09-07', '2022-09-08', '2022-09-09', '2022-09-10', '2022-09-11', '2022-09-12', '2022-09-13', '2022-09-14', '2022-09-15', '2022-09-16', '2022-09-17', '2022-09-18', '2022-09-19', '2022-09-20', '2022-09-21', '2022-09-22', '2022-09-23', '2022-09-24', '2022-09-25', '2022-09-26', '2022-09-27', '2022-09-28', '2022-09-29', '2022-09-30', '2022-10-01', '2022-10-02', '2022-10-03', '2022-10-04', '2022-10-05', '2022-10-06', '2022-10-07', '2022-10-08', '2022-10-09', '2022-10-10', '2022-10-11', '2022-10-12', '2022-10-13', '2022-10-14', '2022-10-15', '2022-10-16', '2022-10-17', '2022-10-18', '2022-10-19', '2022-10-20', '2022-10-21', '2022-10-22', '2022-10-23', '2022-10-24', '2022-10-25', '2022-10-26', '2022-10-27', '2022-10-28', '2022-10-29', '2022-10-30', '2022-10-31', '2022-11-01', '2022-11-02', '2022-11-03', '2022-11-04', '2022-11-05', '2022-11-06', '2022-11-07', '2022-11-08', '2022-11-09', '2022-11-10', '2022-11-11', '2022-11-12', '2022-11-13', '2022-11-14', '2022-11-15', '2022-11-16', '2022-11-17', '2022-11-18', '2022-11-19', '2022-11-20', '2022-11-21', '2022-11-22', '2022-11-23', '2022-11-24', '2022-11-25', '2022-11-26', '2022-11-27', '2022-11-28', '2022-11-29', '2022-11-30', '2022-12-01', '2022-12-02', '2022-12-03', '2022-12-04', '2022-12-05', '2022-12-06', '2022-12-07', '2022-12-08', '2022-12-09', '2022-12-10', '2022-12-11', '2022-12-12', '2022-12-13', '2022-12-14', '2022-12-15', '2022-12-16', '2022-12-17', '2022-12-18', '2022-12-19', '2022-12-20', '2022-12-21', '2022-12-22', '2022-12-23', '2022-12-24', '2022-12-25', '2022-12-26', '2022-12-27', '2022-12-28', '2022-12-29', '2022-12-30', '2022-12-31', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16', '2023-01-17', '', '', '', '', '', '', '']print('-----------第2步,每周都抽取7个日期--------')list_date=[]# 取空列表# 第1周for i in range(0,1):#共21周这是第1周list1=date_listprint(date_list[0:7]) # 第一周只有4天,周四周五周六周日,但是因为之前添加了3个空格,所以也是取0-7list_date.append(date_list[0:7]) # 第2-21周for i in range(1,weeksday):  #共21周    这是第2-21周  ,如果是21周,把2,21 改成2,22 list1=date_list[0] # date_list=date_list[7:]  #  前面第一周已经提取了7个,第二周从第8个元素开始提取date_list.append(list1) # print(date_list[0:7]) # 列表里每次提取7个list_date.append(date_list[0:7])  print('-----------第3步,保存到excle--------')# 以下是xls保存arrlan = len(list_five)# 班级抽取5天一组arrlan2 = len(list_date)# 日期抽取7天一组workbook = xlwt.Workbook()# 新建xls工作簿sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet# 第0列 写入“第1周、第2周、第3周……第21周    dates=[]for i in range(1,weeksday+1):n="第{}周".format(i)    # 用遍历方法获得“第1周、第2周、第21周”字样,dates.append(n)          # 添加到列表    print(dates)        # print(date)row=1 # A2开始for d in range(0, len(dates)):sheet.write(row, 0, dates[d])         # 这里enumerate不能用,因为只有一列,所以就用row +=4   # 1=逐行写入,2=中间空一行,3=中间空2行row=2 # A3开始 再写一次第X周(备注用)for dd in range(0, len(dates)):sheet.write(row, 0, dates[dd])         # 这里enumerate不能用,因为只有一列,所以就用row +=4   # 1=逐行写入,2=中间空一行,3=中间空2行row=3 # A3开始 再写一次第X周(备注用)for ddd in range(0, len(dates)):sheet.write(row, 0, dates[ddd])         # 这里enumerate不能用,因为只有一列,所以就用row +=4   # 1=逐行写入,2=中间空一行,3=中间空2行# 第0行 写入 星期一  '星期二','星期三','星期四','星期五 ,'星期六','星期日'#weeks = ['周次','星期一','星期二','星期三','星期四','星期五','星期六','星期日']week = len(weeks) col=0  # A1写入for d in range(0, len(weeks)):sheet.write(0,col,weeks[d])         # 因为只有一行,所以就用有两种写法(enumerate和这种)col+= 1  # 1=逐列写入,2=中间空一列,3=中间空2列2# B2 写入 7天日期(月日)row = 1for i in range(arrlan2):for col,item in enumerate(list_date[i],1):sheet.write(row,col,item)  row += 4# B3 写入 5个5个的班级(中间空1个)row = 2for i in range(arrlan):for col,item in enumerate(list_five[i],1):sheet.write(row,col,item)  row += 4try:workbook.save(r"D:\test\{}.xls".format(title))    # 新建保存 只能xlsprint('计划生成成功')except e:print('失败...')print(e)# Press the green button in the gutter to run the script.
# 定义起始日期和结束日期
if __name__ == '__main__':start_date = "{}".format(str(start))end_date = "{}".format(str(end))date_generate(start_date, end_date)

感觉在日期旁边还可以加上“星期几”,这样就更完美了。

编程可以一直优化下去啊

20221012代码优化:日期去0+包含“星期”+包含“班主任名字”

效果图:

代码:


# https://www.cnblogs.com/gradyblog/p/16457279.html
from contextlib import nullcontext
import datetime
import sys
import random
from tkinter import dnd
import xlrd
import xlwt
from openpyxl import load_workbook
import xlrd
import xlwtstart=input('本学期开始的日期,输入样例(2022-09-01)\n')
end=input('本学期结束的日期,输入样例(2023-01-17)\n')
begin=int(input('开始日期前空几(周1周2周3 一共3天)\n'))
last=int(input('结束日期后留几天空白(5天)\n'))
weeksday=int(input('本学期共有几周(如21周)\n'))
title=input('生成xls的文件名称\n')print('-----------第3步,把每周排班5天做成21周的日期--------')
# 做21周的数组
listsingle=[ '小3(二)静','中1(一)清','中3(总)蕾','中4(总)琳','大1(总)超']# 基本的一周排班
lists=[]
for x in range(weeksday):  #大约有21周for y in listsingle:       # 提取基本一周排班里面的每一个值# print(y)lists.append(y)  # 把每个班级添加到list列表里,顺序为“小3(二)','中1(一)','中3(总)','中4(总)','大1(总)” 并且重复提取21次。
# print(list)  # 不缩进,打印出来只有一份105个元素的列表
# ['小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)',
# '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
# 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)']   print('-----------第2步,间隔两个插入一个空(周三空)--------')
list_all=[]# 取空列表
null=''
# 先取2个值,后面都是4个连续取值
list_all.append(lists[0])
list_all.append(lists[1])
list_all.append(null) # 4个取值,索引数字不断增加
for x in range(21):list_all.append(lists[2+(4*x)]) list_all.append(lists[3+(4*x)]) list_all.append(lists[4+(4*x)]) list_all.append(lists[5+(4*x)]) list_all.append(null)
print(list_all)
# ['小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '']print('-----------第2步,只抽取每周五个--------')
# 抽成5个5个一组
list_five=[]# 取空列表
for i in range(1):#共21周这是第1周list1=list_allprint(list_all[0:5]) # 列表有105个运动项目,但只要前0-4list_five.append(list_all[0:5])
for i in range(1,weeksday):  #共21周    这是第2-21周  ,如果是21周,把2,21 改成2,22 list1=list_all[0] # 获取第一个alist_all=list_all[5:]  #  前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取list_all.append(list1) # 将a安排到最后一个座位print(list_all[0:5]) # 列表里每次提取4个list_five.append(list_all[0:5])  print('------------第3步:生成年月日列表(前后有空日)------------')def date_generate(start_date, end_date):# print(f'Hi, {start_date}, {end_date}')start_dt = datetime.datetime.strptime(start_date, "%Y-%m-%d")end_dt = datetime.datetime.strptime(end_date, "%Y-%m-%d")next_dt = start_dtdate_list = []  while next_dt <= end_dt:# next_dt_str = next_dt.strftime("%Y-%m-%d")# next_dt_str = next_dt.strftime("%m/%d")next_dt_str = next_dt.strftime("%#m/%#d")# print(next_dt_str)date_list.append(next_dt_str)next_dt = next_dt + datetime.timedelta(days=1)print(date_list)#生成全部需要的列表 ['2022-09-01', '2022-09-02', '2022-09-03', '2022-09-04', '2022-09-05', '2022-09-06', '2022-09-07', '2022-09-08', '2022-09-09', '2022-09-10', '2022-09-11', '2022-09-12', '2022-09-13', '2022-09-14', '2022-09-15', '2022-09-16', '2022-09-17', '2022-09-18', '2022-09-19', '2022-09-20', '2022-09-21', '2022-09-22', '2022-09-23', '2022-09-24', '2022-09-25', '2022-09-26', '2022-09-27', '2022-09-28', '2022-09-29', '2022-09-30', '2022-10-01', '2022-10-02', '2022-10-03', '2022-10-04', '2022-10-05', '2022-10-06', '2022-10-07', '2022-10-08', '2022-10-09', '2022-10-10', '2022-10-11', '2022-10-12', '2022-10-13', '2022-10-14', '2022-10-15', '2022-10-16', '2022-10-17', '2022-10-18', '2022-10-19', '2022-10-20', '2022-10-21', '2022-10-22', '2022-10-23', '2022-10-24', '2022-10-25', '2022-10-26', '2022-10-27', '2022-10-28', '2022-10-29', '2022-10-30', '2022-10-31', '2022-11-01', '2022-11-02', '2022-11-03', '2022-11-04', '2022-11-05', '2022-11-06', '2022-11-07', '2022-11-08', '2022-11-09', '2022-11-10', '2022-11-11', '2022-11-12', '2022-11-13', '2022-11-14', '2022-11-15', '2022-11-16', '2022-11-17', '2022-11-18', '2022-11-19', '2022-11-20', '2022-11-21', '2022-11-22', '2022-11-23', '2022-11-24', '2022-11-25', '2022-11-26', '2022-11-27', '2022-11-28', '2022-11-29', '2022-11-30', '2022-12-01', '2022-12-02', '2022-12-03', '2022-12-04', '2022-12-05', '2022-12-06', '2022-12-07', '2022-12-08', '2022-12-09', '2022-12-10', '2022-12-11', '2022-12-12', '2022-12-13', '2022-12-14', '2022-12-15', '2022-12-16', '2022-12-17', '2022-12-18', '2022-12-19', '2022-12-20', '2022-12-21', '2022-12-22', '2022-12-23', '2022-12-24', '2022-12-25', '2022-12-26', '2022-12-27', '2022-12-28', '2022-12-29', '2022-12-30', '2022-12-31', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10', '2023-01-11', '2023-01-12', '2023-01-13', '2023-01-14', '2023-01-15', '2023-01-16', '2023-01-17', '', '', '', '', '', '', '']print('------------第4步:生成(星期),把星期补在日期旁边------------')weeks2=[]weeks= ['(一)','(二)','(三)','(四)','(五)','(六)','(日)']# 把星期'(一)''(二)'做成很长很长的列表,便于取值for j in range(weeksday+1):for k in weeks:weeks2.append(k)print(weeks2)# ['(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '( # 四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)',date_week=[]  # 先在date_week最前面加3个空值,然后加上日期和星期合并for x in range(begin):        # 日期开始前加几个空值,替代8月29日8月30日8月31日b=''date_week.append(b)# print(date_week)   # date_week=['', '', ''] q# 第1-21周的"日期"和"星期"合并for s in range(0,weeksday*7-begin-last):        # 一共21周*7-头空3天-尾空5天=139天c=date_list[s]+weeks2[s+begin]date_week.append(c)# print(date_week)# ['', '', '','09/01(四)', '09/02(五)', '09/03(六)', '09/04(日)', '09/05(一)', '09/06(二)', '09/07(三)', '09/08(四)', '09/09(五)', '09/10(六)', '09/11(日)', '09/12(一)', '09/13(二)', '09/14(三)', '09/15(四)', # '09/16(五)', '09/17(六)', '09/18(日)', '09/19(一)', '09/20(二)', '09/21(三)', '09/22(四)', '09/23(五)', '09/24(六)', '09/25(日)', '09/26(一)', '09/27(二)', '09/28(三)', '09/29(四)', '09/30(五)', '10/01(六)', '10/02(日)#  最后在date_week的后面加5个kong           for x in range(last):        # 日期结束后加几个空值,以免重新开始选取db=''date_week.append(b)print(date_week)  #   前空3  ['', '', '', '09/01(四)', '09/02(五)', '09/03(六)', '09/04(日)', '09/05(一)', '09/06(二)', '09/07(三)', '09/08(四)', '09/09(五)', '09/10(六)', '09/11(日)', '09/12(一)', '09/13(二)', '09/14(三)', '09/15(四)', '09/16(五)', '09/17(六)', '09/18(日)', '09/19(一)', '09/20(二)', '09/21(三)', '09/22(四)', '09/23(五)', '09/24(六)', '09/25(日)', '09/26(一)', '09/27(二)', '09/28(三)', '09/29(四)', '09/30(五)', '10/01(六)', '10/02(日)', '10/03(一)', '10/04(二)', '10/05(三)', '10/06(四)', '10/07(五)', '10/08(六)', '10/09(日)', '10/10(一)', '10/11(二)', '10/12(三)', '10/13(四)', '10/14(五)', '10/15(六)', '10/16(日)', '10/17(一)', '10/18(二)', '10/19(三)', '10/20(四)', '10/21(五)', '10/22(六)', '10/23(日)', '10/24(一)', '10/25(二)', '10/26(三)', '10/27(四)', '10/28(五)', '10/29(六)', '10/30(日)', '10/31(一)', '11/01(二)', '11/02(三)', '11/03(四)', '11/04(五)', '11/05(六)', '11/06(日)', '11/07(一)', '11/08(二)', '11/09(三)', '11/10(四)', '11/11(五)', '11/12(六)', '11/13(日)', '11/14(一)', '11/15(二)', '11/16(三)', '11/17(四)', '11/18(五)', '11/19(六)', '11/20(日)', '11/21(一)', '11/22(二)', '11/23(三)', '11/24(四)', '11/25(五)', '11/26(六)', '11/27(日)', '11/28(一)', '11/29(二)', '11/30(三)', '12/01(四)', '12/02(五)', '12/03(六)', '12/04(日)', '12/05(一)', '12/06(二)', '12/07(三)', '12/08(四)', '12/09(五)', '12/10(六)', '12/11(日)', '12/12(一)', '12/13(二)', '12/14(三)', '12/15(四)', '12/16(五)', '12/17(六)', '12/18(日)', '12/19(一)', '12/20(二)', '12/21(三)', '12/22(四)', '12/23(五)', '12/24(六)', '12/25(日)', '12/26(一)', '12/27(二)', '12/28(三)', '12/29( # 四)', '12/30(五)', '12/31(六)', '01/01(日)', '01/02(一)', '01/03(二)', '01/04(三)', '01/05(四)', '01/06(五)', '01/07(六)', '01/08(日)', '01/09(一)', '01/10(二)', '01/11(三)', '01/12(四)', '01/13( # 五)', '01/14(六)', '01/15(日)', '01/16(一)', '01/17(二)', '', '', '', '', '']后空5print('-----------第2步,每周都抽取7个日期--------')list_date=[]# 取空列表# 第2-21周for p in range(0,weeksday):  #共21周    第1周索引取值,0-7,第2周索引 7-14,依次类推list_date.append(date_week[p*7:p*7+7])print(list_date)print('-----------第3步,保存到excle--------')# 以下是xls保存arrlan = len(list_five)# 班级抽取5天一组arrlan2 = len(list_date)# 日期抽取7天一组workbook = xlwt.Workbook()# 新建xls工作簿sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet# 第0列 写入“第1周、第2周、第3周……第21周    dates=[]for i in range(1,weeksday+1):n="第{}周".format(i)    # 用遍历方法获得“第1周、第2周、第21周”字样,dates.append(n)          # 添加到列表    print(dates)        # print(date)row=1 # A2开始for d in range(0, len(dates)):sheet.write(row, 0, dates[d])         # 这里enumerate不能用,因为只有一列,所以就用row +=4   # 1=逐行写入,2=中间空一行,3=中间空2行row=2 # A3开始 再写一次第X周(备注用)for dd in range(0, len(dates)):sheet.write(row, 0, dates[dd])         # 这里enumerate不能用,因为只有一列,所以就用row +=4   # 1=逐行写入,2=中间空一行,3=中间空2行row=3 # A3开始 再写一次第X周(备注用)for ddd in range(0, len(dates)):sheet.write(row, 0, dates[ddd])         # 这里enumerate不能用,因为只有一列,所以就用row +=4   # 1=逐行写入,2=中间空一行,3=中间空2行# 第0行 写入 星期一  '星期二','星期三','星期四','星期五 ,'星期六','星期日'#weeks = ['周次','星期一','星期二','星期三','星期四','星期五','星期六','星期日']week = len(weeks) col=0  # A1写入for d in range(0, len(weeks)):sheet.write(0,col,weeks[d])         # 因为只有一行,所以就用有两种写法(enumerate和这种)col+= 1  # 1=逐列写入,2=中间空一列,3=中间空2列2# B2 写入 7天日期(月日)row = 1for i in range(arrlan2):for col,item in enumerate(list_date[i],1):sheet.write(row,col,item)  row += 4# B3 写入 5个5个的班级(中间空1个)row = 2for i in range(arrlan):for col,item in enumerate(list_five[i],1):sheet.write(row,col,item)  row += 4try:workbook.save(r"D:\test\{}.xls".format(title))    # 新建保存 只能xlsprint('计划生成成功')except e:print('失败...')print(e)# Press the green button in the gutter to run the script.
# 定义起始日期和结束日期
if __name__ == '__main__':start_date = "{}".format(str(start))end_date = "{}".format(str(end))date_generate(start_date, end_date)

重点解析:

1.日期+星期。(制作列表,把日期列表和星期列表合并)

(1)第1步:生成所有上学日期(去0的“月日”)

(2)逐步添加date_week列表的内容(生成星期的长列表、逐步合并“3个空+日期星期+5个空”)

(3)抽取每周7天,索引取值的优化(12行缩到2行)

 2.月日不要0。(在%m之间加一个#——%#m,%#d)就是这么简单

3、协商换班的需求(预定带班的班级的班主任是谁?)

疫情反复,实际带的班在不断调整……

今天领导问我:“你明天(10月13日)后天(10月14日)带什么班?”

我查询代班表回答:“中1班”“大1班”

领导:“班主任是谁?我和他们联系(商量不去预设的班级,去缺班主任的班级)”

我看了墙上的“人事排班表”才说出了老师的名字:”明天是Q老师”“后天是C老师。”

因此,

1、带的班级不仅要有“班级号”(中1班、大1班)和“园区”(一分园)(总园)(这些是提醒我先去那个园区、到了地方再问班级在几楼)

2、还要有班主任的名字简称提示,以便需要调班时,可以直接看“带班表”快速联系预定班级的班主任更换班次或自行记录全天班。

3、终端运行输入:

生成EXCEL效果

手动调整表格,最后的打印效果

打印贴墙效果:

正面

反面

感悟:排班表上的信息越多(周次、日期月日、星期、班级、园区、班主任名字、可以备注工作量),检索的速度越快(一张表解决带班的内容、时间、数量等)

【办公类-16-01-01】“机动班下午代班的排班表”(python 排班表系列)相关推荐

  1. 【办公类-16-06】“2022下学期 总园活动室(沙水+建构)排班表”(python 排班表系列)

    背景需求: 最近保教主任一直在为总园的活动室安排而头疼不已,和组长们商议许久,依旧无法合理把活动室安排好.3月2日下午,听主任和游戏室成员聊了一个小时的排班,结论是除沙水和建构外,其余空余时间都是&q ...

  2. 【办公类-16-01-02】“2022学年上半学期-代班排班表(跳过节日)”(python 排班表系列)

    样式效果: 背景需求: 2022年上半学期的排班表是按照每周四天,周三空缺方式排列的(不考虑节日) 本篇是假设"如果需要跳过节日",那么排班内容是否可以跳过节日延续,实现" ...

  3. 【办公类-16-06-02】“2022下学期 总园活动室(沙水+建构)排班表(两周一次沙水)”(python 排班表系列)

    作品展示: 背景需求: 上一篇批量制作了"7天轮回14班沙水+每周固定建构"的活动室内排班表. 一.时段冲突,调整单双周. 保教主任抽空检查后,提到:"一个班.上午.下午 ...

  4. 【办公类-01】20210910 Python VSC制作批量教师培训的作业模板

    活动背景:       最近上海市闵行区开展了<闵行区教师信息技术应用能力提升工程2.0实施方案>)花了差不多两周时间,吃透培训视频的内容,在9月8日刚刚上传校本培训实施方案,结果9月9日 ...

  5. 【办公类-16-05-02】“2022上学期 大班游戏活动室排班表——领导版8周”(python 排班表系列)

    样式展示:生成一份按8周排序的"大班活动室安排表" 1.人工排序的样式 2.Python生成的样式和内容 背景需求: 前一个<大班游戏活动室排班表>主要是针对班主任贴周 ...

  6. 【办公类-16-02】“2022上学期 大班运动场地分配表1-跳过节日循环排序”(python 排班表系列)

    样例展示:跳过节日的运动场地循环排序表(8个班级8组内容) 背景需求: 复工复学后,周计划做起来!每周的运动场地安排照旧-- 存在问题(一): 8个大班,靠着人工排序,每周都要推算一次这个规则,推演麻 ...

  7. 【办公类-16-05-04】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)

    样例展示:跳过节日的运动场地循环排序表(8个班级8组内容 下学期一共20周) 背景需求: 上学期做过一次大班运动场地安排,跳过节日.2023.2下学期运动场地排班(跳过节日)又来了. 一.场地器械微调 ...

  8. 【办公类-16-05-01】“2022上学期 大班游戏活动室排班表——班主任版21周”(python 排班表系列)

    样式展示:1-8周的内容,一摸一样复制到9-16周.17-24周 背景需求: 8月底,保教主任花了不少时间调试"大班游戏活动室安排表.docx",并多次让我给他调整Word的表格框 ...

  9. 水淼易语言对象类代码生成器 v1.01官方

    2019独角兽企业重金招聘Python工程师标准>>> 水淼易语言对象类代码生成器是一款免费易语言工具,可用于转换易语言对象生成类模块代码 支持自动翻译英文命令.参数为中文.水淼遇到 ...

最新文章

  1. usaco前两章小结
  2. 网站建设需要抠好每一个细节
  3. jsp的jstl的foreach标签
  4. nginx http子模块conf的初始化
  5. TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇...
  6. Intellij Idea搭建Spark开发环境
  7. php中不让数组初始化,javascript中数组与php数组初始化差异
  8. MySQL-快速入门(17)MySQL Proxy,读写分离,负载均衡
  9. 小瞥linux下UML工具
  10. C语言实现日历时间转换为秒(mktime)
  11. Royal TSX安装使用
  12. 网站设计高性能高并发
  13. Jekyll 教程——博客功能(blog)
  14. 互联网创业项目加盟,超低门槛,0经验也能开
  15. 关于动态内存分配malloc的初级用法和注意事项
  16. 导航栏: UINavigationBar用法
  17. convariate shift(协变量 转变)
  18. 技术实践干货 | 从工作流到工作流
  19. 才云团队入选微软加速器
  20. 前端开发基础——网络相关(TCP、UDP、HTTP等)

热门文章

  1. fonts/fontawesome-webfont.woff2 404
  2. 怎么样在Linux上使用AppImage?
  3. [数学公式]等差数列求和
  4. 数据可视化优秀作品欣赏
  5. 【C++ 科学计算】介绍 C++线性代数和科学计算库 Armadillo
  6. chm editor 打包html,CHM Editor(反编译HTML帮助文件)
  7. pycharm社区版安装及使用教程(win10系统)
  8. 视觉SLAM前端——PnP
  9. linux进程线程同步之 - POSIX线程互斥锁
  10. C++ 函数的声明和定义