• 【办公类-16-06】20230901大班运动场地分配表-斜线排列、5天循环、不跳节日,手动修改节日”(python 排班表系列)


    背景需求:

    大班组长发来一个“运动排班”的需求表:“就是和去年一样的每个班的运动排班,就因为今年大班变成7个班,删掉一个场地,就要重新做一份,不然我就用去年的那份了(8个大班排班)”

    (拆了中8班,孩子被分流到其他7个大班)

    于是我拿出2023年2月的那份运动py,复制了一份新的2023年9月

    参数修改

    1、修改运动场地列表

    对比发现

    (1)删除了勇敢者道路

    (2)最后的”爬龙接力赛”放到第一的位置,

    排序方式——没有考虑跳过节日,全部按照一周五天排列

    2、代码展示:(稍微修改一下,搞了一个零时文件夹放7个班级EXCLE,最后只保留一个合并EXCEL)

    1. '''
    2. 目的:2023年9月大班总部分散运动场地(各班滚动排)
    3. 作者:阿夏
    4. 时间:2023年9月6日15:30
    5. '''
    6. import sys
    7. import random
    8. import xlrd
    9. import xlwt
    10. from openpyxl import load_workbook
    11. import time
    12. import os,shutil
    13. print('---------运动场地的循环------')
    14. print('---------规则:------')
    15. print('---------1.有7个运动场地,01 02 03 04 05 06 07 :------')
    16. print('---------2.大1班从01开始游戏,01 02 03 04 05 06 07 :------')
    17. print('---------3.大2班从02开始游戏,02 03 04 05 06 07 ,01 ------')
    18. print('---------4.大3班从03开始游戏,03 04 05 06 07 ,01 02 ------')
    19. print('---------依次类推,最后制作出所有大班的每周的运动排序表 ------')
    20. print('---------通常是每周5天,需要跳过节假日 ------')
    21. time.sleep(2)
    22. print('---------第1步:把8个运动场地循环21次(105元素组成的列表)------')
    23. # 本学期:大1,大2,大3,大4,大5,大7,大8,大9班,其中6班空缺,一共有8个大班
    24. gradenum=['1','2','3','4','5','6','7']
    25. # 新建一个”装N份word和PDF“的文件夹
    26. lswj=r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\零时文件夹"
    27. if os.path.exists(lswj):
    28. print("目录已存在")
    29. else:
    30. print("目录不存在,创建成功")
    31. os.mkdir(lswj)
    32. # print(len(gradenum))# 8
    33. # radenum的长度=7,0-7,一共循环8次
    34. for num in range(0,len(gradenum)):
    35. L=[]# 这里的L等于list,因为和最后excle合并程序中的代码有冲突,所以全部改成大写的首字母
    36. L1=[]
    37. L3=[]
    38. L2=[]
    39. # 这里是8个运动场地,因为后面有递进,所以把最后一个 ,放到01前面,这样摆放后面才会正确)
    40. L3=['爬笼接力赛\n(爬笼、树屋、沙漏、书包、铃铛)',
    41. '小小交通车\n(平衡车、三轮车、扭扭车、自行车、木桥)',
    42. '平衡小勇士\n(长短竹梯、三脚架、长凳、轮胎、安全垫)',
    43. '百变小能手\n(小足球、箩筐、百变迷宫架、垫子、马甲)',
    44. '山洞大探险\n(轮胎、安全垫、麻绳)',
    45. '对战投投乐\n(弹力棉球、吸盘球、飞镖盘)',
    46. '跑跳小达人\n(轮胎、跨栏、锣鼓、接力棒)',]
    47. # '勇敢者道路\n(背篓、布袋、矿泉水瓶)',
    48. # 生成8个班级8组运动(第1个元素不同)
    49. for i in range(0,len(gradenum)): #
    50. b = L3.pop(0) # 在运动场地列表L3中 删除 第1个元素 大1班 先删除,就是从01开始
    51. L3.append(b) # 在运动场地列表L3最后 添加 第1个元素
    52. # print(L[0])
    53. L1.append(L3[0:len(gradenum)]) # 把不断变化的内容添加到L1
    54. # 8个班级场地“基本元素“构成了L1列表:[['01', '02', '03', '04', '05', '06', '07', ''], ['02', '03', '04', '05', '06', '07', '', '01'], ['03', '04', '05', '06', '07', '', '01', '02'], ['04', '05', '06', '07', '', '01', '02', '03'], ['05', '06',
    55. # print(L1)
    56. for b in range(23): # 把各班“场地基本元素8个”循环21次,数量多一点,便于后期提取内容
    57. for y in L1[num]: #抽取L1中的一组组内容 L1[0]=['01', '02', '03', '04', '05', '06', '07', '']、L1[1]=['02', '03', '04', '05', '06', '07', '', '01'],
    58. # print(y) # 在用 y提取L1[0]中的'01', '02', '03', '04', '05', '06', '07', ''三个元素
    59. L.append(y) #把y提取的单个元素一个个加到列表里,并且依次循环22次,数量足够多
    60. print(L)
    61. # 打印出来大1班 列表组=['01', '02', '03', '04', '05', '06', '07', '','01', '02', '03', '04', '05', '06', '07', '','01', '02', '03', '04', '05', '06', '07', '','01', '02', '03', '04', '05', '06', '07', '','01', '02', '03', '04', '05', '06', '07', '']
    62. print('---------第2步:如果一周有5天(不考虑跳过假日)------')
    63. #
    64. print('大{}班'.format(gradenum[num]))
    65. for i in range(1):#共20周这是第1周,是原始的位置81234
    66. a=L[0:5]# 列表有8个运动项目,但只要其中5个(周一到周五)
    67. for x1 in a:
    68. L2.append(x1)
    69. for i in range(2,22): #共20周 这是第2-20周 ,如果是21周,把2,21 改成2,22
    70. L=L[5:] # 5代表前面一个数已经取过5位
    71. L.append(L) # 将a安排到最后一个座位
    72. b=L[0:5] # 列表是八个循环,我只要其中5个
    73. for x2 in b:
    74. L2.append(x2)
    75. # print('大{}班'.format(gradenum[num]))
    76. # print('---------第3步:如果每周需要跳过假日(考虑跳过假日)------')
    77. # # 每周需要的天数 (跳过节日.如第1周只有2天工作,9月1-2日(周四周五) ,第3周周一是中秋节放假1天,所以只有4个工作日)
    78. # # day=['3','5','5','6','5','2','5','5','5','5','5','5','5','5','5','5','5','4','5','5','2']
    79. # kong=''
    80. # tt1='清明节'
    81. # tt2='劳动节'
    82. # tt3='端午节'
    83. # # 第1周 第2-7周开始 第8周部分
    84. # # for d in range(0,1):
    85. # L2.append(kong)
    86. # L2.append(kong)
    87. # for kk in L[0:int(3+5*6+2)]:
    88. # L2.append(kk)
    89. # # 清明
    90. # L2.append(tt1)
    91. # # 清明后到五一前
    92. # for kk in L[int(3+5*6+2):int((3+5*6+2)+(2+5*2))]:
    93. # L2.append(kk)
    94. # # 23日(周日)也上班 所以一共6天 一周排5填,28号周五放到下周周一算
    95. # for kk in L[int((3+5*6+2)+(2+5*2)):int((3+5*6+2)+(2+5*2)+6)]:
    96. # L2.append(kk)
    97. # # 劳动节休息休息3天,实际1天空格 (28日放到周一了 周二五一节)
    98. # L2.append(tt2)
    99. # # 劳动节456三天上班+6周5填天 1周3天(劳动节后到端午节前)
    100. # for kk in L[int((3+5*6+2)+(2+5*2+6)):int((3+5*6+2)+(2+5*2+6)+3+(5*6+3))]:
    101. # L2.append(kk)
    102. # # 端午节三天,占一个格子在周四 周日要上班顶替周五
    103. # L2.append(tt3)
    104. # for kk in L[int((3+5*6+2)+(2+5*2+6)+3+(5*6+3)):int((3+5*6+2)+(2+5*2+6)+3+(5*6+3))+6]:
    105. # L2.append(kk)
    106. print(L2)
    107. print('---------第4步:xls写入)------')
    108. workbook = xlwt.Workbook()# 新建xls工作簿
    109. sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
    110. # 第0列 写入“第1周、第2周、第3周……第21周
    111. dates=[]
    112. for i in range(1,22):
    113. n="第{}周".format(i) # 用遍历方法获得“第1周、第2周、第21周”字样,
    114. dates.append(n) # 添加到列表
    115. print(dates)
    116. # print(date)
    117. row=1
    118. for d in range(0, len(dates)):
    119. sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
    120. row += 1
    121. # 第0行 写入 星期一 '星期二','星期三','星期四','星期五 #
    122. weeks = ['周次','星期一','星期二','星期三','星期四','星期五']
    123. week = len(weeks)
    124. col=0
    125. for d in range(0, len(weeks)):
    126. sheet.write(0,col,weeks[d]) # 因为只有一行,所以就用有两种写法(enumerate和这种)
    127. col+= 1
    128. # 输入星期的另一种写法
    129. # col=0
    130. # for row,item in enumerate(weeks,0): # 可以这样写L2[i]=表格内的内容=item,索引数字=col 0代表在A1 1代表在B1
    131. # sheet.write(col,row,item) # 第1行第1列开始写入一行”星期X"
    132. # col+=1
    133. # 第B2开始写入 运动内容
    134. print('-----------第3步,保存到excle--------')
    135. # 以下是xls保存
    136. # 在list_date五个五个取值
    137. list3=[]
    138. for k in range(0,21):
    139. list3.append(L2[k*5:k*5+5])
    140. print(list3)
    141. # print(list)
    142. for opq in list3:
    143. print(opq)
    144. # arrlan2 = len(list_d)# 日期抽取5天一组
    145. arrlan = len(list3)# L2['07', '', '01', '02', '03']的长度 21组
    146. row = 1 # 第2行
    147. for i in range(arrlan): # 遍历21组[]的总数
    148. for col,item in enumerate(list3[i],1): # L2[i]=表格内的内容=item,索引数字=col
    149. sheet.write(row,col,item) # row,col,item 行=1、列=索引数字、内容=表格内容 写入第一行第一列
    150. row += 1
    151. print('---------第5步:xls保存N份工作簿(每份一页)------')
    152. try:
    153. workbook.save(lswj+'\\20230901大{}班分散运动.xls'.format(gradenum[num])) # 新建保存 只能xls
    154. print('计划生成成功')
    155. except e:
    156. print('失败...')
    157. print(e)
    158. print('---------第6步:把N份xls单页内容合并在1个工作簿的N个工作表内)------')
    159. time.sleep(2)
    160. # 获取目录下所有的表
    161. import os
    162. import pandas as pd
    163. # dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png'
    164. # 获取目录下所有的表
    165. origin_file_list = os.listdir(lswj)
    166. print(origin_file_list)
    167. with pd.ExcelWriter(r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\20230901大班分散运动( 不跳过节日).xls") as writer:
    168. # 循环遍历表格
    169. for i in origin_file_list:
    170. # 拼接每个文件的路径
    171. file_path = lswj + '\\' + i
    172. # 把表名赋予给对应的sheet
    173. sheet_name = i[:-4]
    174. df = pd.read_excel(file_path)
    175. # 变相解决表格中第一行第一列为空的缺陷
    176. ring = "".join(list(str(i) for i in df.index))
    177. # string = .join(list(str(i) for i in df.index))
    178. # 判断如果索引都为数字,则不保留索引(根据自己代码调整)
    179. if ring.isdigit():
    180. df.to_excel(writer, sheet_name,index=False)
    181. else:
    182. df.to_excel(writer, sheet_name)
    183. # 新建一个”装N份word和PDF“的文件夹
    184. if os.path.exists(lswj):
    185. shutil.rmtree(lswj)
    186. print("目录已存在")
    187. else:
    188. print("目录不存在,创建成功")

    结果展示:

    最后零时文件夹自动被删除了。只保留一个合并XLSX

    三、手动调整表格(补充节假日)

    原始表格展示

    1、有七个班级的工作表(每个表文字都挤在一起)

    2、每个班级都是五天(塞满,不考虑节假日)

    (一)选中所有班级标签

    没选中时时灰色底纹状态

    (二)选择列,拉宽

    (三)自动换行 居中

    四、手动删除内容,添加更改节日

    所有的班级的19周第一天都改成了元旦(全选标签,白色底纹状态下,才能批量修改)))

    同样的方法删除“第一周的前面几天”

    同样的方法修改“国庆节”(全选标签,删除文字,添加文字)

    完工了,发给大班组长

    给大班组长的相关解释:

    1、国庆节的补班(周六周日)

    2、验证排序正确性(以大1班为例,第1周是“小小交通车“开始,但”前面的4天删除了。图示说明正确性(保证各班每天出去分散运动,不会场地重复)

    3、每班一份五天,便于教师做周计划(贴文字,不需要日期)、也便于教师每天运动前看看班级张贴的运动表单,了解活动场地,(班级贴的运动表单最好有日期,但这又要按7天补日期和星期,写起来有点费力)

    目前这样已经够用了。

    继续测试更多的便利的工作表单吧!

  • 相关阅读:
    MQ消息队列篇:三大MQ产品的必备面试种子题
    PropType是一个TypeScript的类型,用于指定组件props的类型
    Java开发学习(三十三)----Maven私服(一)私服简介安装与私服分类
    【搜索】—— DFS之剪枝与优化
    [附源码]计算机毕业设计springboot学生宿舍维修管理系统
    1个月写900多条用例,2线城市年薪33W+的测试经理能有多卷?
    Mybatis-plus修改指定字段
    小半年被裁掉30多人,大厂“开猿节流”太狠了
    c-index的计算
    优先队列使用
  • 原文地址:https://blog.csdn.net/reasonsummer/article/details/132766875