【办公类-53-03】2024年第一学期校历制作(“月/日(星期)”版、排班表、跳过节日和周三)

news2024/9/20 16:57:38

背景需求:

前期代码制作出2024年第一学期校历,按照5天一周的方法,提取实际工作日。制作成“周计划教案”使用的长日期、短日期

-【办公类-53--01】2024年第一学期校历制作(星火讯飞提取实际工作日,5天一行)-CSDN博客文章浏览阅读489次,点赞19次,收藏5次。-【办公类-53--01】2024年第一学期校历制作(星火讯飞提取实际工作日,5天一行)https://blog.csdn.net/reasonsummer/article/details/140773531【办公类-53-02】2024年第一学期校历制作(“年月日去0”版、周计划短日期、教案长日期)-CSDN博客文章浏览阅读334次,点赞11次,收藏4次。【办公类-53-02】2024年第一学期校历制作(“年月日去0”版、周计划短日期、教案长日期)https://blog.csdn.net/reasonsummer/article/details/140822416

本学期,我又脱离班级,真舍不得中4班这批聪明守规则的孩子(中4班都找不出一位调皮的孩子,他们表现太优秀,领导就安排给了其他学校来轮岗一年的骨干老师了)

所以我开始机动班。每周要带四个半天的下午班。通常是带每个年级的组长班。每个班级滚动轮流带。因而我需要一份“排班表”

去年的一份排班表模板,但是日期都是每周手动输入的,星期也都是周一到周五。

因为是复制原来的日期模版,很容易出现忘记修改日期的情况。

今年我也想基于已经生成实际工作日,跳过节日、周三,轮流输入每个班级。先做一份基础模板的“排班表”

首先我希望日期和星期写再一起,所以日期用了简写的“月/日(星期)

其次,我希望班级能够跳过节日和周三,滚动轮流,而不是直接跳过某个班级。

一共有2个代码

第一个代码:生成月/日(星期)格式的基本日期

'''
2024学年第一学期校历排版,制作教案用日期
星火讯飞 阿夏
2024年7月31日
'''


# -*- coding: utf-8 -*-

import datetime
import openpyxl
from openpyxl.styles import Alignment, PatternFill
import time

# for 


# 创建一个新的Excel工作簿
workbook = openpyxl.Workbook()
sheet = workbook.active

# 设置标题行
title_row = ["周次", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
sheet.append(title_row)

# 设置日期范围
start_date = datetime.date(2024, 9, 2)
end_date = datetime.date(2025, 1, 17)

# 计算周数和日期
current_week = 1
current_day = start_date
while current_day <= end_date:
    # 获取当前周的第一天(星期一)
    week_start = current_day - datetime.timedelta(days=current_day.weekday())
    
    # 如果当前日期是新的一周,添加新行并更新周数
    if current_day == week_start:
        sheet.append([f"第{current_week:02d}周"])
        current_week += 1
    
    # 在正确的单元格中添加日期
    column_index = current_day.weekday() + 2  # 从B列开始,所以加2
    cell = sheet.cell(row=current_week, column=column_index)
    
    # 不同的表示方法
    # cell.value = current_day.strftime("%Y-%m-%d")    # 2024-09-01    
    # cell.value = current_day.strftime("%Y-%#m-%#d")    # 2024-9-1
    # cell.value = current_day.strftime("%m/%d")      # 09-01

    cell.value  = current_day.strftime("%#m/%#d (%a)")
    print(cell.value )
   
    
    # 格式化日期为 "月/日 (星期)" 形式
    
    # cell.value = current_day.strftime('%Y{y}%m{m}%d{d}').format(y='年', m='月', d='日')   # 2024年09月01日
    # cell.value = current_day.strftime('%Y{y}%#m{m}%#d{d}').format(y='年', m='月', d='日')  # 2024年9月1日
    
    
    
    cell.alignment = Alignment(horizontal='center', vertical='center')
    
     # 如果日期不等于周六和周日,就把这个单元格填充为浅黄色
    if current_day.weekday() not in (5, 6):
        light_yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
        cell.fill = light_yellow_fill

    
    
    # 如果日期等于2024-09-14、2024-10-12、9月16日、9月17日、10月1日到10月8日、2025年1月1日,单元格填充为白色
    special_dates = [datetime.date(2024, 9, 14), datetime.date(2024, 10, 12), datetime.date(2024, 9, 16), datetime.date(2024, 9, 17)]
    for i in range(1, 8):
        special_dates.append(datetime.date(2024, 10, i))
    special_dates.append(datetime.date(2025, 1, 1))
    if current_day in special_dates:
        white_fill = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
        cell.fill = white_fill

    # 如果日期等于2024-09-14或2024-10-12,单元格填充为黄色
    if current_day == datetime.date(2024, 9, 14) or current_day == datetime.date(2024, 9, 29) or current_day == datetime.date(2024, 10, 12):
        yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
        cell.fill = yellow_fill
    
    # 移动到下一天
    current_day += datetime.timedelta(days=1)


# 每个单元格最后【-4:-1】的内容替换中文
weekdays_chinese = {
    'Mon': '一',
    'Tue': '二',
    'Wed': '三',
    'Thu': '四',
    'Fri': '五',
    'Sat': '六',
    'Sun': '日'
}

# 遍历工作表中的所有单元格,替换星期英文缩写为中文
for row in sheet.iter_rows():
    for cell in row:
        if isinstance(cell.value, str) and len(cell.value) >= 4:
            last_four_chars = cell.value[-4:-1]
            if last_four_chars in weekdays_chinese:
                cell.value = cell.value[:-4] + weekdays_chinese[last_four_chars]+')'

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\校历排版'
# 保存工作簿
workbook.save(path+r"\2024学年第一学期校历排版.xlsx")
time.sleep(2)



import openpyxl
from openpyxl.styles import PatternFill

# 打开已存在的Excel文件
workbook = openpyxl.load_workbook(path+r"\2024学年第一学期校历排版.xlsx")
sheet = workbook.active

# 设置黄色填充样式
yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")


# 遍历每一行
for row in range(2, sheet.max_row + 1):
   # 读取每行里面的所有黄色单元格,复制到I列开始的单元格
    yellow_cells = []
    for col in range(2, sheet.max_column + 1):
        cell = sheet.cell(row=row, column=col)
        if cell.fill == yellow_fill:
            yellow_cells.append(cell.value)
    for index, value in enumerate(yellow_cells):
        sheet.cell(row=row, column=10+index).value = value

# 定义黄色填充样式
yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")


# 设置列宽
for col in range(1, 30):
    sheet.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 15
# for col in range(9, 12):
#     sheet.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 35
# 设置单元格文字居中
for row in sheet.iter_rows():
    for cell in row:
        cell.alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center')

workbook.save(path+r"\2024学年第一学期校历排版.xlsx")
workbook.save(path+r"\2024学年第一学期校历排版(修改).xlsx")

生成了两个文件,

校历排版.xlsx

打开校历排版(修改).xlsx

手动调整右侧的日期(改成5天一周

第二个代码:对“修改.xlsx"进行周次、日期(星期)的提取,读取所有的日期做成列表,4个滚动班做成列表。如果日期等于“节日”,就写入节日名称,如果日期中-2的文字是三,就写入空,其他都写入班级(用n+=1)

'''
2024学年第一学期校历排版,制作教案用日期 提取长日期和短日期
星火讯飞 阿夏
2024年7月31日
'''

import openpyxl
from openpyxl.styles import Alignment
from openpyxl.styles import Font
from openpyxl.styles import Border, Side

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\校历排版'


# 打开原始Excel文件
workbook = openpyxl.load_workbook(path+r"\2024学年第一学期校历排版(修改).xlsx")
sheet = workbook.active

# 删除B列到I列 反复删除第2列
for x in range(8):
    for col in range(2,3):  # B列是第2列,I列是第9列,所以范围是2到9
        sheet.delete_cols(col)

# 读取B2-F21的数字
# 创建一个空列表来存储单元格内容
cell_values = []

# 遍历B2到F21单元格
for row in range(2, 22):
    for col in ['B', 'C', 'D', 'E', 'F']:
        cell = sheet[f'{col}{row}']
        cell_values.append(cell.value)

print(cell_values)
print(len(cell_values))
# 100

# 插入班级 (暂时定组长班),有20周
c=['托1(一)','小3(二)','中3(总)','大3(总)']*30
print(c)
print(len(c))
# 120

p=[]
m=0
for d in range(len(cell_values)):    
    
       
    # 如果等于周三、等于国庆、中秋、元旦,就添加空
    if cell_values[d]=="中秋" or cell_values[d]=="元旦" or cell_values[d]=="国庆":
        t2=cell_values[d]
        p.append(t2)   

    elif cell_values[d][-2:-1]=='三':
        t1='空'
        p.append(t1)   
    
    else:
        p.append(c[m])
        m+=1
print(p)
print(len(p))
# 105


result = []
for i in range(0, len(p), 5):
    result.append("上午")
    for b in range(5):
        result.append('')

   
    result.append("下午")
    result.extend(p[i:i+5])

print(result)
print(len(result))
# 126
 
# 插入空行
n=2# 第2行开始添加空行
# 遍历原始工作表的每一行
for row in sheet.iter_rows():
    # 将当前行的内容复制到新工作表的一行
    for cell in row:
        sheet[cell.coordinate].value = cell.value
    # 在新工作表的下一行插入一个空行

    for y in range(3):        # 一条插入3个空行
        sheet.insert_rows(row[0].row + n)
        n+=1

# 写入数据到指定的单元格范围
row_start = 3
col_start = 1
for i in range(0, len(result), 12):
    end_index = min(i + 12, len(result))
    data = result[i:end_index]
    for j, value in enumerate(data):
        sheet.cell(row=row_start + (j // 6), column=col_start + (j % 6), value=value)
    row_start += 4
    
# 设置单元格居中对齐
for row in sheet.iter_rows():
    for cell in row:
        # 单元格文字居中
        cell.alignment = Alignment(horizontal='center', vertical='center')
        # 设置字体,加粗
        cell.font = Font(name='宋体', size=15, bold=True)

        # 设置边框样式
    
        if cell.value is not None:
            cell.border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))


# 定义边框样式
# thin_border = Border(left=Side(style='thin', color="000000"),
#                      right=Side(style='thin', color="000000"),
#                      top=Side(style='thin', color="000000"),
#                      bottom=Side(style='thin', color="000000"))

# # 设置边框宽度为2.25磅(注意:openpyxl不支持直接设置边框宽度,这里我们使用最细的边框作为替代)
# thick_border = Border(left=Side(style='thick', color="000000"),
#                       right=Side(style='thick', color="000000"),
#                       top=Side(style='thick', color="000000"),
#                       bottom=Side(style='thick', color="000000"))

# # 设置单元格边框
# for row in range(1, 80):
#     for col in range(1, 6):
#         cell = sheet.cell(row=row, column=col)
#         if (row - 1) % 4 == 0:
#             cell.border = thick_border
#         else:
#             cell.border = thin_border

# # 保存新的Excel文件
workbook.save(path+r"\2024学年第一学期校历排版(排班表).xlsx")

重点代码

、作品展示

从生成表格看,班级顺序是托1(一分院)、小2(二分园)、中3(总部)、大3(总部)4个班级轮流滚动,

同时,班级循环时,跳过了周三,和节假日,确保了带班次数的平均。

等开学后再看领导怎么安排班级的,有可能会是单双周排班、班级数量更多,或者某个大班多带。到时候就是想办法做出基础列表,跳过节日和周三。制作出实际带班表。

即使做出带班表,也只是一个基础(都在下午),实际带班中,班主任会调整日期和上下午时段。但是好处就是,实际的上班日期(星期)被确定好了。避免手动复制带班表出现的日期错误(忘记替换日期)

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

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

相关文章

Spring-Retry 框架实战经典重试场景

Spring-Retry框架是Spring自带的功能&#xff0c;具备间隔重试、包含异常、排除异常、控制重试频率等特点&#xff0c;是项目开发中很实用的一种框架。 1、引入依赖 坑点&#xff1a;需要引入AOP&#xff0c;否则会抛异常。 xml <!-- Spring-Retry --> <dependency&…

【AI大模型】通义千问:开启语言模型新篇章与Function Call技术的应用探索

文章目录 前言一、大语言模型1.大模型介绍2.大模型的发展历程3.大模型的分类a.按内容分类b.按应用分类 二、通义千问1.通义千问模型介绍a.通义千问模型介绍b.应用场景c.模型概览 2.对话a.对话的两种方式通义千问API的使用 b.单轮对话Vue页面代码&#xff1a;Django接口代码 c.多…

【C++】—— 类与对象(一)

【C】—— 类与对象&#xff08;一&#xff09; 1、类的定义1.1、类定义1.1.1、类定义格式1.1.2、成员变量的标识1.1.3、C 中的 s t r u c t struct struct1.1.4、C 中的内联函数1.1.5、总结 1.2、访问限定符1.3、类域 2、实例化2.1、实例化的概念2.2、对象大小2.2.1、对象的大…

【Hot100】LeetCode—1143. 最长公共子序列

目录 题目1- 思路2- 实现⭐最长公共子序列——题解思路 3- ACM 实现 题目 原题连接&#xff1a;1143. 最长公共子序列 1- 思路 模式识别1——> 求子序列问题 ——> dp数组定义为 i-1 和 j-1 动规五部曲 1- 创建dp数组 dp[i][j]&#xff0c;代表以 i-1 结尾的 text1 和…

“外挂”——逆向软件的分析与破解

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11458.html#maodian1 前言&#xff1a; “外挂”的制作离不开软件的分析破解&#xff0c;这平时做ctf中的逆向题是有⼀定的差别的。最直观的区别体现在…

Leetcode 438. 找到字符串中所有字母异位词(java实现)

解题思路&#xff1a;滑动窗口。 异位词的典型解题方法就是用数组来统计出现的个数。本题也不例外。 直接上代码来进行讲解&#xff1a; public List<Integer> findAnagrams(String s, String p) {//初始化返回数组List<Integer> res new ArrayList<>();if …

百问网全志T113-PRO LVGL环境配置

运行LVGL示例 启动开发板 ​ 按要求接入电源或Type-c数据线&#xff0c;拨动拨码开关&#xff0c;将开发板上电 运行LVGL示例 ​ 打开串口终端软件&#xff0c;这里我使用MobaXterm软件演示&#xff0c;选择开发板的串口终端号&#xff0c;可以在设备管理中查看 这里我的串…

喜加一!望繁信科技再摘「2023年度新锐技术品牌奖」

1月31日&#xff0c;望繁信科技再次获颁由全球知名科技社区InfoQ评选的「2023年度新锐技术品牌奖」。这是InfoQ连续第二年将该奖项授予望繁信科技&#xff0c;用以肯定过去一年中&#xff0c;望繁信科技在流程挖掘与智能领域的技术创新与业务价值创造。 InfoQ在颁奖词中写到&…

【STM32】GPIO口以及EXTI外部中断

个人主页~ 有关结构体的知识在这~ 有关枚举的知识在这~ GPIO口以及EXTI外部中断 GPIO一、简介二、基本结构三、输入输出模式1、输入模式&#xff08;1&#xff09;上拉输入&#xff08;2&#xff09;下拉输入&#xff08;3&#xff09;浮空输入&#xff08;4&#xff09;模拟输…

【Python】面向对象的程序设计

一、面向对象的介绍 1.对象 对象是一种抽象概念&#xff0c;表示客观世界存在的实物&#xff0c;现实世界中能够看到的、触碰到的都可以成为对象&#xff0c;如&#xff1a;人、大象、小猫等。 对象通常分为两个部分&#xff0c;即静态部分和动态部分。静态部分为“属性”&a…

UE4 SLUA IOS打包报错解决办法

IOS打包报错&#xff1a;Fatal error "lua.h" file not found &#xff1a; SLua Unreal 在IOS远程打包编译的时候 Exteral没有copy过去&#xff0c;导致lua.h文件报错找不到&#xff0c;看了网上也没有写解决办法 错误信息截图&#xff1a; github上也有很多遇到改…

【每日一题】【动态规划(DP) 】【分治 迭代】“葡萄城杯”牛客周赛 Round 53 D题 小红组比赛 C++

“葡萄城杯”牛客周赛 Round 53 D题 小红组比赛 题目背景 “葡萄城杯”牛客周赛 Round 53 题目描述 小红希望出一场题目&#xff0c;但是他的实力又不够&#xff0c;所以他想到可以从以前的比赛中各抽一题&#xff0c;来组成一场比赛。不过一场比赛的难度应该是有限制的&a…

【nginx】nginx日志出现on文件

问题描述 生产发现容器里多出了一个on文件&#xff0c;非常大。 去看nginx配置已经这样保持16个月了&#xff08;已经去掉其他无关内容&#xff09; 原因解释 这个问题是因为nginx配置了access_log on; 有两个知识点&#xff1a; 1.access_log只有off的特殊值&#xff0c…

三菱电火花设备采集

三菱电火花机器一般情况下应该很少能见到,但在模具行业应该说是一种常见的加工设备。 一、通过官方手册采集数据 1.资料使用 连接方式: 这里重点关注下端口是1112 这里主要讲NC的状态转换 我们重点关注的是状态相关命令,手册中还支持NC程序上传和下载,感兴趣的话可以研究…

排序算法:堆排序,golang实现

目录 前言 堆排序 代码示例 1. 算法包 2. 堆排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 堆排序的思想 堆排序的实现逻辑 1. 构建最大堆 2. 排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 假设 5000 条数据…

数据库——战德臣

1. 数据存储体系 1.1 计算机系统的存储体系 1.将不同性价比的存储组织在一起&#xff0c;满足高速的、大容量、低价格需求 2.CPU与内存直接交换信息&#xff0c;按存储单元&#xff08;存储字&#xff09;进行访问 3.外存按存储块进行访问&#xff0c;其信息先装入内存&…

NSSCTF-GDOUCTF 2023新生赛

[GDOUCTF 2023]hate eat snake 考察&#xff1a;js代码审计 打开题目&#xff0c;发现需要坚持60秒&#xff0c;那么简单的一个思路就是修改得分的变量>60即可 办法1&#xff1a;修改变量 右键查看源代码&#xff0c;之后发现有一个snake.js的文件&#xff0c;ctrlf搜索i…

健康小贴士丨中考考生怎么吃得好?

文章目录 引言三餐最佳的进食时间引言 中考正值初夏,气温急剧升高,食物易滋生细菌,发生食物中毒的风险也随之增加,医生建议 选择新鲜的食材,煮熟煮透,现吃现做,尽量不食用剩饭剩菜;不在路边露天摊点、不到无证和食品安全状况差的餐馆用餐;尽量减少在外就餐和点外卖的…

客服中心:高效知识库管理,6步提高70%用户体验

在当今快节奏的商业环境中&#xff0c;客服中心作为企业与客户沟通的重要桥梁&#xff0c;其运作的顺畅与否直接影响着客户的满意度和忠诚度。而知识库作为客服中心的核心资源之一&#xff0c;其管理水平的高低更是直接影响着客服的工作效率和问题解决能力。本文将深入探讨一系…

Django之JsonResponse对象

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 在Django框…