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

news2024/11/23 22:24:51

背景需求:

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

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

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

参数修改

1、修改运动场地列表

对比发现

(1)删除了勇敢者道路

(2)最后的”爬龙接力赛”放到索引0的位置,

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

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


'''
目的:2023年9月大班总部分散运动场地(各班滚动排)
作者:阿夏
时间:2023年9月6日15:30
'''

import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
import os,shutil

print('---------运动场地的循环------')
print('---------规则:------')
print('---------1.有7个运动场地,01 02 03 04 05 06 07 :------')
print('---------2.大1班从01开始游戏,01 02 03 04 05 06 07 :------')
print('---------3.大2班从02开始游戏,02 03 04 05 06 07 ,01 ------')
print('---------4.大3班从03开始游戏,03 04 05 06 07 ,01 02 ------')
print('---------依次类推,最后制作出所有大班的每周的运动排序表 ------')
print('---------通常是每周5天,需要跳过节假日 ------')
time.sleep(2)





print('---------第1步:把8个运动场地循环21次(105元素组成的列表)------')

# 本学期:大1,大2,大3,大4,大5,大7,大8,大9班,其中6班空缺,一共有8个大班
gradenum=['1','2','3','4','5','6','7']



# 新建一个”装N份word和PDF“的文件夹
lswj=r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\零时文件夹"
if os.path.exists(lswj):
        print("目录已存在")
else:
    print("目录不存在,创建成功")
    os.mkdir(lswj)

# print(len(gradenum))# 8

# radenum的长度=7,0-7,一共循环8次
for num in range(0,len(gradenum)):

    L=[]# 这里的L等于list,因为和最后excle合并程序中的代码有冲突,所以全部改成大写的首字母
    L1=[]
    L3=[]  
    L2=[]
    # 这里是8个运动场地,因为后面有递进,所以把最后一个 ,放到01前面,这样摆放后面才会正确)
    L3=['爬笼接力赛\n(爬笼、树屋、沙漏、书包、铃铛)',
        '小小交通车\n(平衡车、三轮车、扭扭车、自行车、木桥)',
        '平衡小勇士\n(长短竹梯、三脚架、长凳、轮胎、安全垫)',

        '百变小能手\n(小足球、箩筐、百变迷宫架、垫子、马甲)',
        '山洞大探险\n(轮胎、安全垫、麻绳)',
        '对战投投乐\n(弹力棉球、吸盘球、飞镖盘)',
        '跑跳小达人\n(轮胎、跨栏、锣鼓、接力棒)',]
# '勇敢者道路\n(背篓、布袋、矿泉水瓶)',




    # 生成8个班级8组运动(第1个元素不同)
    for i in range(0,len(gradenum)):        # 
        b = L3.pop(0)    # 在运动场地列表L3中 删除 第1个元素 大1班 先删除,就是从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', ''], ['02', '03', '04', '05', '06', '07', '', '01'], ['03', '04', '05', '06', '07', '', '01', '02'], ['04', '05', '06', '07', '', '01', '02', '03'], ['05', '06',  
    # print(L1)

    for b in range(23):        # 把各班“场地基本元素8个”循环21次,数量多一点,便于后期提取内容
        for y in L1[num]:    #抽取L1中的一组组内容  L1[0]=['01', '02', '03', '04', '05', '06', '07', '']、L1[1]=['02', '03', '04', '05', '06', '07', '', '01'],
            # print(y)               # 在用 y提取L1[0]中的'01', '02', '03', '04', '05', '06', '07', ''三个元素
            L.append(y)     #把y提取的单个元素一个个加到列表里,并且依次循环22次,数量足够多
    print(L)
    # 打印出来大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', '']


    print('---------第2步:如果一周有5天(不考虑跳过假日)------')
#   
    print('大{}班'.format(gradenum[num]))

    for i in range(1):#共20周这是第1周,是原始的位置81234
        a=L[0:5]# 列表有8个运动项目,但只要其中5个(周一到周五)
        for x1 in a:
            L2.append(x1)
    for i in range(2,22):  #共20周    这是第2-20周  ,如果是21周,把2,21 改成2,22 
        L=L[5:]  #  5代表前面一个数已经取过5位
        L.append(L) # 将a安排到最后一个座位
        b=L[0:5] # 列表是八个循环,我只要其中5个
        for x2 in b:
            L2.append(x2)  
    


        

    # print('大{}班'.format(gradenum[num]))

    # print('---------第3步:如果每周需要跳过假日(考虑跳过假日)------')
    
    # #  每周需要的天数 (跳过节日.如第1周只有2天工作,9月1-2日(周四周五) ,第3周周一是中秋节放假1天,所以只有4个工作日)
    # # day=['3','5','5','6','5','2','5','5','5','5','5','5','5','5','5','5','5','4','5','5','2']
    # kong=''
    # tt1='清明节'
    # tt2='劳动节'
    # tt3='端午节'
   
    # # 第1周 第2-7周开始 第8周部分
    # # for d in range(0,1):       
    # L2.append(kong) 
    # L2.append(kong) 
    # for kk in L[0:int(3+5*6+2)]:
    #     L2.append(kk) 
    # # 清明
    # L2.append(tt1) 
    #  # 清明后到五一前 
    # for kk in L[int(3+5*6+2):int((3+5*6+2)+(2+5*2))]:
    #     L2.append(kk)    

    # # 23日(周日)也上班 所以一共6天 一周排5填,28号周五放到下周周一算
    # for kk in L[int((3+5*6+2)+(2+5*2)):int((3+5*6+2)+(2+5*2)+6)]:
    #     L2.append(kk)      
    # # 劳动节休息休息3天,实际1天空格 (28日放到周一了 周二五一节) 
    # L2.append(tt2)    
    # # 劳动节456三天上班+6周5填天 1周3天(劳动节后到端午节前)
    # 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))]:
    #     L2.append(kk)    
    # # 端午节三天,占一个格子在周四 周日要上班顶替周五
    # L2.append(tt3) 
    # 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]:
    #     L2.append(kk)    
     
    print(L2) 
    
   

    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开始写入 运动内容

    print('-----------第3步,保存到excle--------')
    # 以下是xls保存
     #  在list_date五个五个取值   
    list3=[]
    for k in range(0,21):
        list3.append(L2[k*5:k*5+5])       
    print(list3)

    # print(list)
    for opq in list3:
        print(opq)
        
    
    # arrlan2 = len(list_d)# 日期抽取5天一组

    arrlan = len(list3)# L2['07', '', '01', '02', '03']的长度 21组
    row = 1     # 第2行
    for i in range(arrlan):         # 遍历21组[]的总数
        for col,item in enumerate(list3[i],1):            # L2[i]=表格内的内容=item,索引数字=col
            sheet.write(row,col,item)  # row,col,item 行=1、列=索引数字、内容=表格内容 写入第一行第一列
        row += 1   
   
    print('---------第5步:xls保存N份工作簿(每份一页)------')             
    try:
        workbook.save(lswj+'\\20230901大{}班分散运动.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\jg2yXRZ\OneDrive\桌面\word2pdf2png'
# 获取目录下所有的表
origin_file_list = os.listdir(lswj)
print(origin_file_list)

with pd.ExcelWriter(r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\20230901大班分散运动( 不跳过节日).xls") as writer:
	# 循环遍历表格
    for i in origin_file_list:
        # 拼接每个文件的路径
        file_path = lswj + '\\' + 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)

# 新建一个”装N份word和PDF“的文件夹

if os.path.exists(lswj):
    shutil.rmtree(lswj)
    print("目录已存在")
else:
    print("目录不存在,创建成功")
    

结果展示:

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

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

原始表格展示:

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

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

(一)选中所有班级标签

没选中时时灰色底纹状态

(二)选择列,拉宽

(三)自动换行 居中

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

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

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

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

完工了,发给大班组长

给大班组长的相关解释:

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

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

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

目前这样已经够用了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32定时器的One Pulse Mode,OPM应用

文章目录 OPM应用1-精准延时应用2-精准定时 OPM T IMx_CR1的OPM位 位 3 OPM:单脉冲模式 (One-pulse mode) 0:计数器在发生更新事件时不会停止计数 1:计数器在发生下一更新事件时停止计数(将 CEN 位清零) 应用1-精准延时…

光学显微镜算法(OMA)(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

期权开户必读:费用、保证金和稳定性安全性必须兼备

期权开户的核心是判断50ETF方向,上涨下跌都能赚钱,其次选择0门槛期权平台要考量期权手续费和安全性是第一位,下文为大家科普期权开户的核心:费用、保证金和稳定性安全性必须兼备的知识点。本文来自 :期权酱 一、期权开…

如何把Android Framework学彻底?一条龙学习

Framework通俗易懂 平时学习 Android 开发的第一步就是去学习各种各样的 API,如 Activity,Service,Notification 等。其实这些都是 Framework 提供给我们的。Framework 层为开发应用程序提供了非常多的API,我们通过调用这些 API …

自然语言处理——数据清洗

一、什么是数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。与问卷审核不同,录入后的数据清理一般是由计算机而不是人工完成。 ——百度百科 二、为什么要数据清洗 现实生…

Apipost:你API管理中的得力助手

API管理的难点在哪? 相信无论是前端,还是后端的测试和开发人员,都遇到过这样的困难。不同工具之间数据一致性非常困难、低效。多个系统之间数据不一致,导致协作低效、频繁出问题,开发测试人员痛苦不堪。 开发人员在 …

STM32F4X RTC

STM32F4X RTC 什么是RTCSTM32F4X RTCSTM32F4X RTC框图STM32F4X RTC计数频率STM32F4X RTC日历STM32F4X RTC闹钟 STM32F4X RTC例程 什么是RTC RTC全程叫Real-Time Clock实时时钟,是MCU中一个用来计时的模块。RTC的一个主要作用是用来显示实时时间,就像日常…

Visual Studio 2019下使用C++与Python进行混合编程——环境配置与C++调用Python API接口

前言 在vs2019下使用C与Python进行混合编程,在根源上讲,Python 本身就是一个C库,那么这里使用其中最简单的一种方法是把Python的C API来嵌入C项目中,来实现混合编程。当前的环境是,win10,IDE是vs2019,python版本是3.9&#xff0c…

一个帮各位填秋招表格省一点事的浏览器插件

最近应该很多和我一样的双非鼠鼠在秋招等面试,而且处于海投阶段,为了不忘记投了哪些公司,可以用这样一个表格来记录: 其中有些字段,比如状态、投递时间、查看进度的网址其实可以不手动输入,所以搞个插件来…

2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)

题目简评:看下来C题是三道题目里简单一些的,考察的点比较综合,偏数据分析。涉及预测模型和运筹优化(线性规划),还设了一问开放型问题,适合新手入门,发挥空间大。 题目分析与思路: 背景&#x…

部署zookeeper集群

zookeeper和jdk下载地址 jdk 链接:https://pan.baidu.com/s/13GpNaAiHM5HSDJ66ebBtEg 提取码:90se zookeeper 链接:https://pan.baidu.com/s/1nSFKEhSGNiwgSPZWdb7hkw 提取码:u5l2 在所有的机器上面执行下面步骤: 1.上…

C++的纯虚函数和抽象类

在C++中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) = 0; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。 最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。…

继承的偏移量问题

下面是实际测试: p1 p3 ! p2 Base1* p1 &d; Derive* p3 &d;! Base2* p2 &d; 图解:

斯坦福小镇升级版——AI-Town搭建指南

导语: 8月份斯坦福AI小镇开源之后,引起了 AIGC 领域的强烈反响,但8月份还有另一个同样非常有意义的 AI-Agent 的项目开源,a16z主导的 AI-Town 本篇文章主要讲解如何搭建该项目,如有英文基础或者对这套技术栈熟悉&#…

监控系统prometheus部署

wget -c https://github.com/prometheus/prometheus/releases/downloa d/v2.37.1/prometheus-2.37.1.linux-amd64.tar.gz下载必要的组件。 mkdir -p /opt/prometheus创建目录。 此文章为9月Day 8学习笔记,内容来源于极客时间《运维监控系统实战笔记》。

docker安装开发常用软件MySQL,Redis,rabbitMQ

Docker安装 docker官网:Docker: Accelerated Container Application Development docker镜像仓库:https://hub.docker.com/search?qnginx 官网的安装教程:Install Docker Engine on CentOS | Docker Docs 安装步骤 1、卸载以前安装的doc…

Reqable项目技术栈全方面总结

大家好,最近有知乎网友问我Reqable技术选型的问题,恰好Reqable也刚刚发布了非常重要的1.3版本更新,所以此次写一篇关于Reqable项目技术栈的全方面总结。 本篇文章的目的,是向大家分享我关于Reqable项目的一些技术思考、细节和填坑…

鸿蒙应用程序入口UIAbility详解

一、UIAbility概述 UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。UIAbility也是系统调度的单元,为应用提供窗口在其中绘制界面。每一个UIAbility实例,都对应于一个最近任务列表中的任务。一个应用可以有一个UIAbility&am…

Kafka生产与消费示例

Kafka生产与消费流程 Kafka是一款消息中间件,消息中间件本质就是收消息与发消息,所以这节课我们会从一条消息开始生产出发,去了解生产端的运行流程,然后简单的了解一下broker的存储流程,最后这条消息是如何被消费者消…

GNU Linux 的退出码规定

参考:https://tldp.org/LDP/abs/html/exitcodes.html 从这张表里来看,小于 128 的是被程序员捕捉的错误,大于等于 128 的是真正的 bugs ?