背景需求:
2023年第一学期(2023年9-2024年1月),我又被安排为“机动班”,根据新学期的校历,手动推算本学期的机动班的带班表
排版原则
1、班级数量:共有6个班级,循环滚动
2、每周次数:4个半天(周三不带班)
3、跳过节日:为了让每个班能平均轮到,我预设了跳过节日的需求
代码展示:
列表数量空格,都是手动死算的。
# https://www.cnblogs.com/gradyblog/p/16457279.html
from contextlib import nullcontext
import datetime
import sys
import random
from tkinter import dnd
from openpyxl import load_workbook
import xlrd
import xlwt
import time
import datetime
'''20230901校历七天 有日期+星期 跳过周六周日和节日)——上下学期都测过'''
start='2023-08-28'
end='2024-01-21'
begin=4
last=2
weeksday=21
title='2023年上学期校历(4天排班表+跳过假日'
print('------------第1步:生成年月日列表(前后有空日)------------')
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_dt
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")
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)
#生成全部需要的列表 ['2023-09-01', '2023-09-02', '2023-09-03', '2023-09-04', '2023-09-05', '2023-09-06', '2023-09-07', '2023-09-08', '2023-09-09', '2023-09-10', '2023-09-11', '2023-09-12', '2023-09-13', '2023-09-14', '2023-09-15', '2023-09-16', '2023-09-17', '2023-09-18', '2023-09-19', '2023-09-20', '2023-09-21', '2023-09-22', '2023-09-23', '2023-09-24', '2023-09-25', '2023-09-26', '2023-09-27', '2023-09-28', '2023-09-29', '2023-09-30', '2023-10-01', '2023-10-02', '2023-10-03', '2023-10-04', '2023-10-05', '2023-10-06', '2023-10-07', '2023-10-08', '2023-10-09', '2023-10-10', '2023-10-11', '2023-10-12', '2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-17', '2023-10-18', '2023-10-19', '2023-10-20', '2023-10-21', '2023-10-22', '2023-10-23', '2023-10-24', '2023-10-25', '2023-10-26', '2023-10-27', '2023-10-28', '2023-10-29', '2023-10-30', '2023-10-31', '2023-11-01', '2023-11-02', '2023-11-03', '2023-11-04', '2023-11-05', '2023-11-06', '2023-11-07', '2023-11-08', '2023-11-09', '2023-11-10', '2023-11-11', '2023-11-12', '2023-11-13', '2023-11-14', '2023-11-15', '2023-11-16', '2023-11-17', '2023-11-18', '2023-11-19', '2023-11-20', '2023-11-21', '2023-11-22', '2023-11-23', '2023-11-24', '2023-11-25', '2023-11-26', '2023-11-27', '2023-11-28', '2023-11-29', '2023-11-30', '2023-12-01', '2023-12-02', '2023-12-03', '2023-12-04', '2023-12-05', '2023-12-06', '2023-12-07', '2023-12-08', '2023-12-09', '2023-12-10', '2023-12-11', '2023-12-12', '2023-12-13', '2023-12-14', '2023-12-15', '2023-12-16', '2023-12-17', '2023-12-18', '2023-12-19', '2023-12-20', '2023-12-21', '2023-12-22', '2023-12-23', '2023-12-24', '2023-12-25', '2023-12-26', '2023-12-27', '2023-12-28', '2023-12-29', '2023-12-30', '2023-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步第儿行的(星期),把星期补在日期旁边------------')
weeks2=[]
weeks= ['(一)','(二)','(三)','(四)','(五)','(六)','(日)',]
# 把星期'(一)''(二)'做成很长很长的列表,便于取值
for j in range(0,weeksday):
for k in weeks:
weeks2.append(k)
print(weeks2)
# ['(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(
# 四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)',
date_week=[]
# 计算共有几天
d1 = datetime.date(int(start.split("-")[0]), int(start.split("-")[1]), int(start.split("-")[2]))
d2 = datetime.date(int(end.split("-")[0]), int(end.split("-")[1]), int(end.split("-")[2]))
time=(d2 - d1).days+1 # 要生成(135+1)个日期
print(time)
# 先在date_week最前面加4个空值,然后加上日期和星期合并
# for x in range(begin): # 日期开始前加几个空值,替代8月29日8月30日8月31日
# b=''
# date_week.append(b)
# 第1-21周的"日期"和"星期"合并
for s in range(0,time): # 一共21周*7-头空3天-尾空5天=139天
c=date_list[s]+weeks2[s] # "日期"和"星期"合并 日期从索引0开始取(9月1日)、星期从索引3开始取(周四)
date_week.append(c)
print(date_week)
# 最后在date_week的后面加5个kong
# for x in range(last): # 日期结束后加几个空值,以免重新开始选取d
# b=''
# date_week.append(b)
# 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(日)', '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(二)', '']
print('----以上完成了日期和星期的拼接-----')
print('-----------第3步,把所有的空格和日期都做在一起,跳过节日的日期,替代为节日名字 --------')
list_date=[]# 取空列表
# for p in range(0,1): #共1-2周 第1周索引取值,0-7,第2周索引 7-14,依次类推
# for kk in date_week[p*7:p*7+5]: # p*7 周一位置上的数字 p*7+5 周五位置上的数字
# list_date.append(kk)
# for p in range(1,2): #共1-2周 第1周索引取值,0-7,第2周索引 7-14,依次类推
# for kk in date_week[p*7:p*7+5]: # p*7 周一位置上的数字 p*7+5 周五位置上的数字
# list_date.append(kk)
# for p in range(2,3): #共3周 第1周索引取值,0-7,第2周索引 7-14,依次类推
# for kk in date_week[p*7+1:p*7+5]: # p*7+1 周二位置上的数字 p*7+5 周五位置上的数字
# list_date.append(kk)
# for p in range(3,5): #共4周 第1周索引取值,0-7,第2周索引 7-14,依次类推
# for kk in date_week[p*7:p*7+5]: # p*7 周一位置上的数字 p*7+5 周五位置上的数字
# list_date.append(kk)
# for p in range(0,3):
# b='国庆节' #
# list_date.append(b)
# for p in range(5,6): #6周,2天,把周六周日两天放到周四周五位置上
# for kk in date_week[p*7+5:p*7+7]: # p*7+5=周六位置上的数字 p*7+7 周日位置上的数字(+7实际显示的只有+6的那个数)
# list_date.append(kk)
# for p in range(6,17): #周,都是5天
# for kk in date_week[p*7:p*7+5]:
# list_date.append(kk)
# for p in range(17,18): #周,前4天有,5没有
# for kk in date_week[p*7:p*7+4]: # p*7 周一位置上的数字 p*7+4 周四位置上的数字
# list_date.append(kk)
# for p in range(0,1):
# b='元旦节' #
# list_date.append(b)
# for p in range(18,21): #周,都是5天
# for kk in date_week[p*7:p*7+5]:
# list_date.append(kk)
# print(list_date)
# # ['', '', '', '9/1(四)', '9/2(五)', '9/5(一)', '9/6(二)', '9/7(三)', '9/8(四)', '9/9(五)', '中秋节', '9/13(二)', '9/14(三)', '9/15(四)', '9/16(五)', '9/19(一)',
# # '9/20(二)', '9/21(三)', '9/22(四)', '9/23(五)', '9/26(一)', '9/27(二)', '9/28(三)', '9/29(四)', '9/30(五)', '国庆节', '国庆节', '国庆节', '10/8(六)', '10/9(日)',
# # '10/10(一)', '10/11(二)', '10/12(三)', '10/13(四)', '10/14(五)', '10/17(一)', '10/18(二)', '10/19(三)', '10/20(四)', '10/21(五)', '10/24(一)', '10/25(二)',
# # '10/26(三)', '10/27(四)', '10/28(五)', '10/31(一)', '11/1(二)', '11/2(三)', '11/3(四)', '11/4(五)', '11/7(一)', '11/8(二)', '11/9(三)', '11/10(四)', '11/11(五)',
# # '11/14(一)', '11/15(二)', '11/16(三)', '11/17(四)', '11/18(五)', '11/21(一)', '11/22(二)', '11/23(三)', '11/24(四)', '11/25(五)', '11/28(一)', '11/29(二)', '11/30(三)', '12/1(四)', '12/2(五)', '12/5(一)', '12/6(二)', '12/7(三)', '12/8(四)', '12/9(五)', '12/12(一)', '12/13(二)', '12/14(三)', '12/15(四)', '12/16(五)', '12/19(一)', '12/20(二
# # )', '12/21(三)', '12/22(四)', '12/23(五)', '12/26(一)', '12/27(二)', '12/28(三)', '12/29(四)', '端午节', '1/2(一)', '1/3(二)', '1/4(三)', '1/5(四)', '1/6(五)',
# # '1/9(一)', '1/10(二)', '1/11(三)', '1/12(四)', '1/13(五)', '1/16(一)', '1/17(二)', '', '', '']
# 在list_date五个五个取值
list_d=[]
for k in range(0,weeksday):
list_d.append(date_week[k*7:k*7+7])
print(list_d)
for opq in list_d:
print(opq)
# ['', '', '', '9/1(四)', '9/2(五)']
# ['9/5(一)', '9/6(二)', '9/7(三)', '9/8(四)', '9/9(五)']
# ['中秋节', '9/13(二)', '9/14(三)', '9/15(四)', '9/16(五)']
# ['9/19(一)', '9/20(二)', '9/21(三)', '9/22(四)', '9/23(五)']
# ['9/26(一)', '9/27(二)', '9/28(三)', '9/29(四)', '9/30(五)']
# ['国庆节', '国庆节', '国庆节', '10/8(六)', '10/9(日)']
# ['10/10(一)', '10/11(二)', '10/12(三)', '10/13(四)', '10/14(五)']
# ['10/17(一)', '10/18(二)', '10/19(三)', '10/20(四)', '10/21(五)']
# ['10/24(一)', '10/25(二)', '10/26(三)', '10/27(四)', '10/28(五)']
# ['10/31(一)', '11/1(二)', '11/2(三)', '11/3(四)', '11/4(五)']
# ['11/7(一)', '11/8(二)', '11/9(三)', '11/10(四)', '11/11(五)']
# ['11/14(一)', '11/15(二)', '11/16(三)', '11/17(四)', '11/18(五)']
# ['11/21(一)', '11/22(二)', '11/23(三)', '11/24(四)', '11/25(五)']
# ['11/28(一)', '11/29(二)', '11/30(三)', '12/1(四)', '12/2(五)']
# ['12/5(一)', '12/6(二)', '12/7(三)', '12/8(四)', '12/9(五)']
# ['12/12(一)', '12/13(二)', '12/14(三)', '12/15(四)', '12/16(五)']
# ['12/19(一)', '12/20(二)', '12/21(三)', '12/22(四)', '12/23(五)']
# ['12/26(一)', '12/27(二)', '12/28(三)', '12/29(四)', '端午节']
# ['1/2(一)', '1/3(二)', '1/4(三)', '1/5(四)', '1/6(五)']
# ['1/9(一)', '1/10(二)', '1/11(三)', '1/12(四)', '1/13(五)']
# ['1/16(一)', '1/17(二)', '', '', '']
print('-----------第1步,把每周排班5天做成21周的日期--------')
# listsingle=[ '01小3(二)静','02中1(一)清','03中3(总)蕾','04中4(总)琳','05大1(总)超']# 基本的一周排班
# listsingle=[ '托2(一瞿)','小3(二超)','中4(总顾)','大1(总陆)','大3(总蕾)','大4(总琳)']# 基本的一周排班
listsingle=['01','02','03','04','05','06']
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个元素的列表
#['小3(二)','中1(一)','中3(总)','中4(总)','大1(总),小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']
print('-----------第2步,只抽取每周四个--------')
list2=[]# 取空列表
# 第1周
# 第1周u
for p in range(0,1): #
for u in range(0,begin):
b='' # 空5天
list2.append(b)
for kk in list[p:p+1]: # 0:1
list2.append(kk)
for u in range(0,2):
b='' # 空5天
list2.append(b)
# 第2-4周
for p in range(0,3): #
for kk in list[p*4+1:p*4+3]: # 4:6
list2.append(kk)
b='' # 空1天 取4天
list2.append(b)
for kk in list[p*4+3:p*4+5]: # 6:7
list2.append(kk)
for u in range(0,2):
b='' # 空5天
list2.append(b)
# 第5周
for p in range(3,4): #
for kk in list[p*4+1:p*4+3]: # 11:15
list2.append(kk)
b='' # 空1天
list2.append(b)
for kk in list[p*4+3:p*4+4]: # 11:15
list2.append(kk)
b='中秋节' # 空3天
list2.append(b)
for z in range(7):
b='国庆节' # 空3天
list2.append(b)
for p in range(3,4): #
for kk in list[p*4+4:p*4+6]: # 15:17
list2.append(kk)
# 第3周2次
for p in range(4,15): #
for kk in list[p*4+2:p*4+4]: # 11:15 15:19
list2.append(kk)
b='' # 空3天
list2.append(b)
for kk in list[p*4+4:p*4+6]: # 11:15 15:19
list2.append(kk)
for u in range(0,2):
b='' # 空5天
list2.append(b)
for p in range(15,16): #
for kk in list[p*4+2:p*4+4]: # 11:15 15:19
list2.append(kk)
b='' # 空3天
list2.append(b)
for kk in list[p*4+4:p*4+6]: # 11:15 15:19
list2.append(kk)
for p in range(3):
b='元旦节' # 空3天
list2.append(b)
for p in range(16,17): #
for kk in list[p*4+2:p*4+3]: # 11:15 15:19
list2.append(kk)
b='' # 空3天
list2.append(b)
for kk in list[p*4+3:p*4+5]: # 11:15 15:19
list2.append(kk)
for u in range(0,2):
b='' # 空5天
list2.append(b)
print(list2)
# 最后一周
for p in range(17,19): #
for kk in list[p*4+1:p*4+3]: # 4:6
list2.append(kk)
b='' # 空1天 取4天
list2.append(b)
for kk in list[p*4+3:p*4+5]: # 6:7
list2.append(kk)
for u in range(0,2):
b='' # 空5天
list2.append(b)
# for
# 在list_date五个五个取值
list3=[]
for k in range(0,21):
list3.append(list2[k*7:k*7+7])
# print(list)
for opq in list3:
print(opq)
print('-----------第3步,保存到excle--------')
# 以下是xls保存
arrlan= len(list3)
arrlan2 = len(list_d)# 日期抽取5天一组
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 +=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行
# row=3 # A4开始 再写一次第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 = 1
for i in range(arrlan2):
for col,item in enumerate(list_d[i],1): # 提取7个一组里面的前5个
sheet.write(row,col,item)
row += 3
# B3 写入 5个5个的班级(中间空1个)
row = 2
for i in range(arrlan):
for col,item in enumerate(list3[i],1):
sheet.write(row,col,item)
row += 3
try:
workbook.save(r"D:\test\{}.xls".format(title)) # 新建保存 只能xls
print('计划生成成功')
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)
效果显示
把班级贴进去
存在问题:
也就是我从第4周开始进班,如果从第4周开始分布“01,02,03”,6个班级列表的选择内容又要手动重新一个个调整了,好难o(╥﹏╥)o,