• 【办公类-06】python批量制作代班排班表


    最终效果图:

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

    20220927第一次代码

    背景需求: 

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

    表内说明:

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

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

    ……

    存在问题:

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

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

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

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

    代码设置

    1. import sys
    2. import random
    3. import xlrd
    4. import xlwt
    5. from openpyxl import load_workbook
    6. # # list2=int(input('你班级第1周第1天的运动场地数字(不同班级不同的起始数字'))
    7. # 第一步:把五天都改好
    8. # listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
    9. # '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
    10. # '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
    11. # '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)', '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)',
    12. # ]
    13. print('-----------第1步,把每周排班5天做成21周的日期--------')
    14. listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']# 基本的一周排班
    15. list=[]
    16. for x in range(21): #大约有21周
    17. for y in listsingle: # 提取基本一周排班里面的每一个值
    18. # print(y)
    19. list.append(y) # 把每个班级添加到list列表里,顺序为“小3(二)','中1(一)','中3(总)','中4(总)','大1(总)” 并且重复提取21次。
    20. print(list) # 不缩进,打印出来只有一份105个元素的列表
    21. print('-----------第2步,只抽取每周四个--------')
    22. list2=[]# 取空列表
    23. for i in range(1):#共21周这是第1周
    24. list1=list
    25. print(list[0:4]) # 列表有105个运动项目,但只要前0-4
    26. list2.append(list[0:4])
    27. for i in range(2,22): #共21周 这是第2-21周 ,如果是21周,把2,21 改成2,22
    28. list1=list[0] # 获取第一个a
    29. list=list[4:] # 前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取
    30. list.append(list1) # 将a安排到最后一个座位
    31. print(list[0:4]) # 列表里每次提取4个
    32. list2.append(list[0:4])
    33. print('-----------第3步,保存到excle--------')
    34. # 以下是xls保存
    35. arrlan = len(list2)# list2是终端显示的列表值
    36. workbook = xlwt.Workbook()# 新建xls工作簿
    37. sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
    38. row = 0
    39. for i in range(arrlan):
    40. for col,item in enumerate(list2[i],0):
    41. sheet.write(row,col,item)
    42. row += 1
    43. try:
    44. workbook.save(r"D:\test\06分散运动的循环\每周下午排班.xls") # 新建保存 只能xls
    45. print('计划生成成功')
    46. except e:
    47. print('失败...')
    48. 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、行与行之间有空格。

     代码展示:

    1. from contextlib import nullcontext
    2. import datetime
    3. import sys
    4. import random
    5. from tkinter import dnd
    6. import xlrd
    7. import xlwt
    8. from openpyxl import load_workbook
    9. w=int(input('共有几周?\n'))# 21
    10. # n=int(input('行与行之间的空格(空1行输入2,不空输入1?\n'))# 21
    11. # print(n)
    12. print('-----------第3步,把每周排班5天做成21周的日期--------')
    13. # 做21周的数组
    14. listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']# 基本的一周排班
    15. lists=[]
    16. for x in range(w): #大约有21
    17. for y in listsingle: # 提取基本一周排班里面的每一个值
    18. # print(y)
    19. lists.append(y) # 把每个班级添加到list列表里,顺序为“小3(二)','1(一)','3(总)','4(总)','1(总)” 并且重复提取21次。
    20. # print(list) # 不缩进,打印出来只有一份105个元素的列表
    21. # ['小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)',
    22. # '小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(总)', '
    23. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    24. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    25. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    26. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)']
    27. print('-----------第2步,间隔两个插入一个空(周三空)--------')
    28. list_all=[]# 取空列表
    29. null=''
    30. # 先取2个值,后面都是4个连续取值
    31. list_all.append(lists[0])
    32. list_all.append(lists[1])
    33. list_all.append(null)
    34. # 4个取值,索引数字不断增加
    35. for x in range(21):
    36. list_all.append(lists[2+(4*x)])
    37. list_all.append(lists[3+(4*x)])
    38. list_all.append(lists[4+(4*x)])
    39. list_all.append(lists[5+(4*x)])
    40. list_all.append(null)
    41. print(list_all)
    42. # ['小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(二)', '']
    43. print('-----------第2步,只抽取每周四个--------')
    44. # 抽成55个一组
    45. list_five=[]# 取空列表
    46. for i in range(1):#共21周这是第1
    47. list1=list_all
    48. print(list_all[0:5]) # 列表有105个运动项目,但只要前0-4
    49. list_five.append(list_all[0:5])
    50. for i in range(1,w): #共21周 这是第2-21周 ,如果是21周,把2,21 改成2,22
    51. list1=list_all[0] # 获取第一个a
    52. list_all=list_all[5:] # 前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取
    53. list_all.append(list1) # 将a安排到最后一个座位
    54. print(list_all[0:5]) # 列表里每次提取4
    55. list_five.append(list_all[0:5])
    56. print('-----------第3步,保存到excle--------')
    57. # 以下是xls保存
    58. arrlan = len(list_five)# list_five是终端显示的列表值
    59. # arrlan1 = len(list_all)# list_five是终端显示的列表值2
    60. workbook = xlwt.Workbook()# 新建xls工作簿
    61. sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
    62. # 第0列 写入“第1周、第2周、第3周……第21
    63. dates=[]
    64. for i in range(1,w+1):
    65. n="第{}周".format(i) # 用遍历方法获得“第1周、第2周、第21周”字样,
    66. dates.append(n) # 添加到列表
    67. print(dates)
    68. # print(date)
    69. row=1 # A2开始
    70. for d in range(0, len(dates)):
    71. sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
    72. row +=3 # 1=逐行写入,2=中间空一行,3=中间空2
    73. # row=2 # A3开始 再写一次第X周(备注用)
    74. # for dd in range(0, len(dates)):
    75. # sheet.write(row, 0, dates[dd]) # 这里enumerate不能用,因为只有一列,所以就用
    76. # row +=3 # 1=逐行写入,2=中间空一行,3=中间空2
    77. # 第0行 写入 星期一 '星期二','星期三','星期四','星期五 ,'星期六','星期日'#
    78. weeks = ['周次','星期一','星期二','星期三','星期四','星期五']
    79. week = len(weeks)
    80. col=0 # A1写入
    81. for d in range(0, len(weeks)):
    82. sheet.write(0,col,weeks[d]) # 因为只有一行,所以就用有两种写法(enumerate和这种)
    83. col+= 1 # 1=逐列写入,2=中间空一列,3=中间空2列2
    84. # B2 写入 5个5个的班级(中间空1个)
    85. row = 1
    86. for i in range(arrlan):
    87. for col,item in enumerate(list_five[i],1):
    88. sheet.write(row,col,item)
    89. row += 3
    90. try:
    91. workbook.save(r"D:\test\值班表(周三空).xls") # 新建保存 只能xls
    92. print('计划生成成功')
    93. except e:
    94. print('失败...')
    95. print(e)

    重点说明:

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

     2、行与行之间有空格。

     3、行与行之间空2行

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

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

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

     将三个行ROW+=都改成3

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

    效果图:

     实现上图的代码

    1. # https://www.cnblogs.com/gradyblog/p/16457279.html
    2. from contextlib import nullcontext
    3. import datetime
    4. import sys
    5. import random
    6. from tkinter import dnd
    7. import xlrd
    8. import xlwt
    9. from openpyxl import load_workbook
    10. import xlrd
    11. import xlwt
    12. start=input('本学期开始的日期,输入样例(2022-09-01)\n')
    13. end=input('本学期结束的日期,输入样例(2023-01-17)\n')
    14. begin=int(input('开始日期前空几(周1周2周3 一共3天)\n'))
    15. last=int(input('结束日期后留几天空白(建议7天)\n'))
    16. weeksday=int(input('本学期共有几周(如21周)\n'))
    17. title=input('生成xls的文件名称\n')
    18. print('-----------第3步,把每周排班5天做成21周的日期--------')
    19. # 做21周的数组
    20. listsingle=[ '小3(二)','中1(一)','中3(总)','中4(总)','大1(总)']# 基本的一周排班
    21. lists=[]
    22. for x in range(weeksday): #大约有21
    23. for y in listsingle: # 提取基本一周排班里面的每一个值
    24. # print(y)
    25. lists.append(y) # 把每个班级添加到list列表里,顺序为“小3(二)','1(一)','3(总)','4(总)','1(总)” 并且重复提取21次。
    26. # print(list) # 不缩进,打印出来只有一份105个元素的列表
    27. # ['小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)',
    28. # '小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(总)', '
    29. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    30. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    31. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    32. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)']
    33. print('-----------第2步,间隔两个插入一个空(周三空)--------')
    34. list_all=[]# 取空列表
    35. null=''
    36. # 先取2个值,后面都是4个连续取值
    37. list_all.append(lists[0])
    38. list_all.append(lists[1])
    39. list_all.append(null)
    40. # 4个取值,索引数字不断增加
    41. for x in range(21):
    42. list_all.append(lists[2+(4*x)])
    43. list_all.append(lists[3+(4*x)])
    44. list_all.append(lists[4+(4*x)])
    45. list_all.append(lists[5+(4*x)])
    46. list_all.append(null)
    47. print(list_all)
    48. # ['小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(二)', '']
    49. print('-----------第2步,只抽取每周五个--------')
    50. # 抽成55个一组
    51. list_five=[]# 取空列表
    52. for i in range(1):#共21周这是第1
    53. list1=list_all
    54. print(list_all[0:5]) # 列表有105个运动项目,但只要前0-4
    55. list_five.append(list_all[0:5])
    56. for i in range(1,weeksday): #共21周 这是第2-21周 ,如果是21周,把2,21 改成2,22
    57. list1=list_all[0] # 获取第一个a
    58. list_all=list_all[5:] # 前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取
    59. list_all.append(list1) # 将a安排到最后一个座位
    60. print(list_all[0:5]) # 列表里每次提取4
    61. list_five.append(list_all[0:5])
    62. print('------------第3步:生成年月日列表(前后有空日)------------')
    63. def date_generate(start_date, end_date):
    64. # print(f'Hi, {start_date}, {end_date}')
    65. start_dt = datetime.datetime.strptime(start_date, "%Y-%m-%d")
    66. end_dt = datetime.datetime.strptime(end_date, "%Y-%m-%d")
    67. next_dt = start_dt
    68. date_list = []
    69. for x in range(begin): # 日期开始前加几个空值,替代829830831
    70. b=''
    71. date_list.append(b)
    72. print(date_list)
    73. while next_dt <= end_dt:
    74. # next_dt_str = next_dt.strftime("%Y-%m-%d")
    75. # next_dt_str = next_dt.strftime("%m/%d")
    76. next_dt_str = next_dt.strftime("%m/%d")
    77. # print(next_dt_str)
    78. date_list.append(next_dt_str)
    79. next_dt = next_dt + datetime.timedelta(days=1)
    80. print(date_list)
    81. for x in range(last): # 日期结束后加几个空值,以免重新开始选取
    82. b=''
    83. date_list.append(b)
    84. 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', '', '', '', '', '', '', '']
    85. print('-----------第2步,每周都抽取7个日期--------')
    86. list_date=[]# 取空列表
    87. # 第1
    88. for i in range(0,1):#共21周这是第1
    89. list1=date_list
    90. print(date_list[0:7]) # 第一周只有4天,周四周五周六周日,但是因为之前添加了3个空格,所以也是取0-7
    91. list_date.append(date_list[0:7])
    92. # 第2-21
    93. for i in range(1,weeksday): #共21周 这是第2-21周 ,如果是21周,把2,21 改成2,22
    94. list1=date_list[0] #
    95. date_list=date_list[7:] # 前面第一周已经提取了7个,第二周从第8个元素开始提取
    96. date_list.append(list1) #
    97. print(date_list[0:7]) # 列表里每次提取7
    98. list_date.append(date_list[0:7])
    99. print('-----------第3步,保存到excle--------')
    100. # 以下是xls保存
    101. arrlan = len(list_five)# 班级抽取5天一组
    102. arrlan2 = len(list_date)# 日期抽取7天一组
    103. workbook = xlwt.Workbook()# 新建xls工作簿
    104. sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
    105. # 第0列 写入“第1周、第2周、第3周……第21
    106. dates=[]
    107. for i in range(1,weeksday+1):
    108. n="第{}周".format(i) # 用遍历方法获得“第1周、第2周、第21周”字样,
    109. dates.append(n) # 添加到列表
    110. print(dates)
    111. # print(date)
    112. row=1 # A2开始
    113. for d in range(0, len(dates)):
    114. sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
    115. row +=4 # 1=逐行写入,2=中间空一行,3=中间空2
    116. row=2 # A3开始 再写一次第X周(备注用)
    117. for dd in range(0, len(dates)):
    118. sheet.write(row, 0, dates[dd]) # 这里enumerate不能用,因为只有一列,所以就用
    119. row +=4 # 1=逐行写入,2=中间空一行,3=中间空2
    120. row=3 # A3开始 再写一次第X周(备注用)
    121. for ddd in range(0, len(dates)):
    122. sheet.write(row, 0, dates[ddd]) # 这里enumerate不能用,因为只有一列,所以就用
    123. row +=4 # 1=逐行写入,2=中间空一行,3=中间空2
    124. # 第0行 写入 星期一 '星期二','星期三','星期四','星期五 ,'星期六','星期日'#
    125. weeks = ['周次','星期一','星期二','星期三','星期四','星期五','星期六','星期日']
    126. week = len(weeks)
    127. col=0 # A1写入
    128. for d in range(0, len(weeks)):
    129. sheet.write(0,col,weeks[d]) # 因为只有一行,所以就用有两种写法(enumerate和这种)
    130. col+= 1 # 1=逐列写入,2=中间空一列,3=中间空2列2
    131. # B2 写入 7天日期(月日)
    132. row = 1
    133. for i in range(arrlan2):
    134. for col,item in enumerate(list_date[i],1):
    135. sheet.write(row,col,item)
    136. row += 4
    137. # B3 写入 5个5个的班级(中间空1个)
    138. row = 2
    139. for i in range(arrlan):
    140. for col,item in enumerate(list_five[i],1):
    141. sheet.write(row,col,item)
    142. row += 4
    143. try:
    144. workbook.save(r"D:\test\{}.xls".format(title)) # 新建保存 只能xls
    145. print('计划生成成功')
    146. except e:
    147. print('失败...')
    148. print(e)
    149. # Press the green button in the gutter to run the script.
    150. # 定义起始日期和结束日期
    151. if __name__ == '__main__':
    152. start_date = "{}".format(str(start))
    153. end_date = "{}".format(str(end))
    154. date_generate(start_date, end_date)

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

    编程可以一直优化下去啊

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

    效果图:

    代码:

    1. # https://www.cnblogs.com/gradyblog/p/16457279.html
    2. from contextlib import nullcontext
    3. import datetime
    4. import sys
    5. import random
    6. from tkinter import dnd
    7. import xlrd
    8. import xlwt
    9. from openpyxl import load_workbook
    10. import xlrd
    11. import xlwt
    12. start=input('本学期开始的日期,输入样例(2022-09-01)\n')
    13. end=input('本学期结束的日期,输入样例(2023-01-17)\n')
    14. begin=int(input('开始日期前空几(周1周2周3 一共3天)\n'))
    15. last=int(input('结束日期后留几天空白(5天)\n'))
    16. weeksday=int(input('本学期共有几周(如21周)\n'))
    17. title=input('生成xls的文件名称\n')
    18. print('-----------第3步,把每周排班5天做成21周的日期--------')
    19. # 做21周的数组
    20. listsingle=[ '小3(二)静','中1(一)清','中3(总)蕾','中4(总)琳','大1(总)超']# 基本的一周排班
    21. lists=[]
    22. for x in range(weeksday): #大约有21周
    23. for y in listsingle: # 提取基本一周排班里面的每一个值
    24. # print(y)
    25. lists.append(y) # 把每个班级添加到list列表里,顺序为“小3(二)','中1(一)','中3(总)','中4(总)','大1(总)” 并且重复提取21次。
    26. # print(list) # 不缩进,打印出来只有一份105个元素的列表
    27. # ['小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)',
    28. # '小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(总)', '
    29. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    30. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    31. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '
    32. # 小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)', '小3(二)', '中1(一)', '中3(总)', '中4(总)', '大1(总)']
    33. print('-----------第2步,间隔两个插入一个空(周三空)--------')
    34. list_all=[]# 取空列表
    35. null=''
    36. # 先取2个值,后面都是4个连续取值
    37. list_all.append(lists[0])
    38. list_all.append(lists[1])
    39. list_all.append(null)
    40. # 4个取值,索引数字不断增加
    41. for x in range(21):
    42. list_all.append(lists[2+(4*x)])
    43. list_all.append(lists[3+(4*x)])
    44. list_all.append(lists[4+(4*x)])
    45. list_all.append(lists[5+(4*x)])
    46. list_all.append(null)
    47. print(list_all)
    48. # ['小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(二)', '']
    49. print('-----------第2步,只抽取每周五个--------')
    50. # 抽成5个5个一组
    51. list_five=[]# 取空列表
    52. for i in range(1):#共21周这是第1周
    53. list1=list_all
    54. print(list_all[0:5]) # 列表有105个运动项目,但只要前0-4
    55. list_five.append(list_all[0:5])
    56. for i in range(1,weeksday): #共21周 这是第2-21周 ,如果是21周,把2,21 改成2,22
    57. list1=list_all[0] # 获取第一个a
    58. list_all=list_all[5:] # 前面第一周已经提取了0-4个,第二周从第5个元素(大1)开始提取
    59. list_all.append(list1) # 将a安排到最后一个座位
    60. print(list_all[0:5]) # 列表里每次提取4个
    61. list_five.append(list_all[0:5])
    62. print('------------第3步:生成年月日列表(前后有空日)------------')
    63. def date_generate(start_date, end_date):
    64. # print(f'Hi, {start_date}, {end_date}')
    65. start_dt = datetime.datetime.strptime(start_date, "%Y-%m-%d")
    66. end_dt = datetime.datetime.strptime(end_date, "%Y-%m-%d")
    67. next_dt = start_dt
    68. date_list = []
    69. while next_dt <= end_dt:
    70. # next_dt_str = next_dt.strftime("%Y-%m-%d")
    71. # next_dt_str = next_dt.strftime("%m/%d")
    72. next_dt_str = next_dt.strftime("%#m/%#d")
    73. # print(next_dt_str)
    74. date_list.append(next_dt_str)
    75. next_dt = next_dt + datetime.timedelta(days=1)
    76. print(date_list)
    77. #生成全部需要的列表 ['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', '', '', '', '', '', '', '']
    78. print('------------第4步:生成(星期),把星期补在日期旁边------------')
    79. weeks2=[]
    80. weeks= ['(一)','(二)','(三)','(四)','(五)','(六)','(日)']
    81. # 把星期'(一)''(二)'做成很长很长的列表,便于取值
    82. for j in range(weeksday+1):
    83. for k in weeks:
    84. weeks2.append(k)
    85. print(weeks2)
    86. # ['(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(
    87. # 四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)', '(五)', '(六)', '(日)', '(一)', '(二)', '(三)', '(四)',
    88. date_week=[]
    89. # 先在date_week最前面加3个空值,然后加上日期和星期合并
    90. for x in range(begin): # 日期开始前加几个空值,替代8月29日8月30日8月31日
    91. b=''
    92. date_week.append(b)
    93. # print(date_week)
    94. # date_week=['', '', ''] q
    95. # 第1-21周的"日期"和"星期"合并
    96. for s in range(0,weeksday*7-begin-last): # 一共21周*7-头空3天-尾空5天=139天
    97. c=date_list[s]+weeks2[s+begin]
    98. date_week.append(c)
    99. # print(date_week)
    100. # ['', '', '','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(四)',
    101. # '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(日)
    102. # 最后在date_week的后面加5个kong
    103. for x in range(last): # 日期结束后加几个空值,以免重新开始选取d
    104. b=''
    105. date_week.append(b)
    106. print(date_week)
    107. # 前空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(
    108. # 四)', '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(
    109. # 五)', '01/14(六)', '01/15(日)', '01/16(一)', '01/17(二)', '', '', '', '', '']后空5
    110. print('-----------第2步,每周都抽取7个日期--------')
    111. list_date=[]# 取空列表
    112. # 第2-21周
    113. for p in range(0,weeksday): #共21周 第1周索引取值,0-7,第2周索引 7-14,依次类推
    114. list_date.append(date_week[p*7:p*7+7])
    115. print(list_date)
    116. print('-----------第3步,保存到excle--------')
    117. # 以下是xls保存
    118. arrlan = len(list_five)# 班级抽取5天一组
    119. arrlan2 = len(list_date)# 日期抽取7天一组
    120. workbook = xlwt.Workbook()# 新建xls工作簿
    121. sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
    122. # 第0列 写入“第1周、第2周、第3周……第21周
    123. dates=[]
    124. for i in range(1,weeksday+1):
    125. n="第{}周".format(i) # 用遍历方法获得“第1周、第2周、第21周”字样,
    126. dates.append(n) # 添加到列表
    127. print(dates)
    128. # print(date)
    129. row=1 # A2开始
    130. for d in range(0, len(dates)):
    131. sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
    132. row +=4 # 1=逐行写入,2=中间空一行,3=中间空2行
    133. row=2 # A3开始 再写一次第X周(备注用)
    134. for dd in range(0, len(dates)):
    135. sheet.write(row, 0, dates[dd]) # 这里enumerate不能用,因为只有一列,所以就用
    136. row +=4 # 1=逐行写入,2=中间空一行,3=中间空2行
    137. row=3 # A3开始 再写一次第X周(备注用)
    138. for ddd in range(0, len(dates)):
    139. sheet.write(row, 0, dates[ddd]) # 这里enumerate不能用,因为只有一列,所以就用
    140. row +=4 # 1=逐行写入,2=中间空一行,3=中间空2行
    141. # 第0行 写入 星期一 '星期二','星期三','星期四','星期五 ,'星期六','星期日'#
    142. weeks = ['周次','星期一','星期二','星期三','星期四','星期五','星期六','星期日']
    143. week = len(weeks)
    144. col=0 # A1写入
    145. for d in range(0, len(weeks)):
    146. sheet.write(0,col,weeks[d]) # 因为只有一行,所以就用有两种写法(enumerate和这种)
    147. col+= 1 # 1=逐列写入,2=中间空一列,3=中间空2列2
    148. # B2 写入 7天日期(月日)
    149. row = 1
    150. for i in range(arrlan2):
    151. for col,item in enumerate(list_date[i],1):
    152. sheet.write(row,col,item)
    153. row += 4
    154. # B3 写入 5个5个的班级(中间空1个)
    155. row = 2
    156. for i in range(arrlan):
    157. for col,item in enumerate(list_five[i],1):
    158. sheet.write(row,col,item)
    159. row += 4
    160. try:
    161. workbook.save(r"D:\test\{}.xls".format(title)) # 新建保存 只能xls
    162. print('计划生成成功')
    163. except e:
    164. print('失败...')
    165. print(e)
    166. # Press the green button in the gutter to run the script.
    167. # 定义起始日期和结束日期
    168. if __name__ == '__main__':
    169. start_date = "{}".format(str(start))
    170. end_date = "{}".format(str(end))
    171. 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效果

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

     

     打印贴墙效果:

    正面

     反面

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

    (本表不考虑节假日)

  • 相关阅读:
    Metalama简介5.配合VisualStudio自定义重构或快速操作功能
    (附源码)ssm华立学院门户网站 毕业设计 290011
    VSCode不同窗口设置不同颜色
    WEB网络渗透的基础知识
    基于Springboot实现点餐平台网站管理系统项目【项目源码+论文说明】
    百度超级链开放网络治理监督藏品火爆售罄!
    Spark读取多目录
    【深度学习实践(三)】RNN实现股票预测
    如何评价GPT-4o?
    载羟基喜树碱-聚乳酸纳米粒|平均粒径为85nm的葫芦素BE聚乳酸纳米微粒(CuBE- PLA-NP)技术资料
  • 原文地址:https://blog.csdn.net/reasonsummer/article/details/126948612