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

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

时间:2024-08-01 12:27:34浏览次数:23  
标签:03 sheet 校历 53 cell 日期 2024 row

背景需求:

前期代码制作出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个班级轮流滚动,

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

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

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

标签:03,sheet,校历,53,cell,日期,2024,row
From: https://blog.csdn.net/reasonsummer/article/details/140844080

相关文章

  • C++竞赛初阶L1-05-第四单元-判断语句(第19课)100003: 最大数输出
    题目内容输入三个整数,输出最大的数。输入格式输入为一行,包含三个整数,数与数之间以一个空格分开。输出格式输出一行,包含一个整数,即最大的整数。样例1输入102056样例1输出56程序代码输出:#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b,c......
  • 在AWS Lightsail建立WordPress Multisite & Route 53 subdomains & Hexo Blog & WordP
    1.0前言玩Startup比賽,因需高效快速地做POC原型產品,所以利用AWS云端服務來更快地開發。你會學到:LightSail建立WordpressmultisiteRoute53註冊WordpressSubdomains&GithubCuostomDomainLightSailCustomDomain&SSLHexo快速搭建GihubPages博客+ Route53 Custom......
  • L1-030 一帮一 分数 15
    //11'52"#include<iostream>#include<vector>usingnamespacestd;intmain(){intn;cin>>n;vector<pair<int,string>>qian;vector<pair<int,string>>hou;for(inti=1;i<=......
  • Python之if __name__ ==' __main__ '语句
       每个程序都会有一个逻辑入口,if__name__='__main__'即表示当前Python程序的逻辑入口。Python本身并没有对此进行规定,使用if__name__=='__main__'只是一种编码习惯。   __name__是Python中的内置变量,用于表示当前模块的名字,而Python中一个类型的文件就可看成模块,......
  • 通过 python 连接到 Snowflake 时出错“UnpicklingError: invalid load key, '\x00'
    我在使用snowflake.connector.connect通过python连接到snowflake时遇到以下错误importsnowflake.connector#pipinstallsnowflake-connector-python#iamgettingtheenvfrom.envfileistoredlocallycnx=snowflake.connector.connect(user=os.getenv('USER'),pass......
  • Python爬虫入门03:用Urllib假装我们是浏览器
    文章目录引言Urllib库简介Request模块详解Error模块与异常处理Parse模块与URL解析Robotparser模块模拟浏览器请求使用Request方法添加请求头信息代码示例1.设置请求URL和请求头2.定义请求参数并转换为适当的格式3.使用Request方法封装请求4.发送请求并获取响应常用......
  • INFO6030 - Systems Analysis and Design
    **INFO****6030-****Systems********Analysis********and********Design****Assignment2PartB:SystemD****esign********(30%)****Due:11:59pmFriday2ndAu****gust(Week********12)****Introduction**TheUniversityofNewcastleisreplacingitso......
  • P1.53和P1.86的LED显示屏什么区别
    我们的夏游记有些客户在采购LED显示屏时,对点间距或其它的参数不是很了解,如P1.53和P1.86之间有什么区别,选择哪一款性价高更高呢?业角度为大家分析,希望能对大家提供到一些帮助。目前,LED显示屏在室内场合的应用中,P1.53和P1.86是应用比较广泛的两款小间距LED系列,它们在分辨率......
  • H7-TOOL自制Flash读写保护算法系列,为国民技术N32G031制作读写使能和解除算法,支持在线
    说明:很多IC厂家仅发布了内部Flash算法文件,并没有提供读写保护算法文件,也就是选项字节算法文件,需要我们制作。实际上当前已经发布的TOOL版本,已经自制很多了。但是依然有些厂家还没自制,所以陆续开始为这些厂家提供读写保护支持。实现效果:本次添加国民技术的N32G031,从2.26版本开......
  • 属性错误:'numpy.int64'。这是我的对象没有属性“loc”
    我试图根据2列的if条件求和一列的值,但出现错误AttributeError:'numpy.int64'这是我的对象没有属性locdf3=df3.loc[(df3['FeatureName']=='GI-MIPSPI-FilterScorecardDataPanel-Measures(All)-PI_HIE_1:SupportElectronicReferralLoo......