【办公类-54-08】20250903 各班周计划+教案的日期更改

 

背景需求:

孩子越来越少了,2025年9月我又脱产机动班了,所以不需要用Python做班级资料(特别是周计划教案)。

为了更好的用信息技术服务同事,我想为所有班级都批量做好周计划+教案的日期更改内容

1、周计划部分-标题

2、周计划部分-短日期

3、教案部分:长日期

 

Python代码

一、根据起止日期制作EXCEL表格,制作实际上班的黄色天数填充

'''
2025学年第一学期校历,制作教案用日期
星火讯飞 阿夏
20240703
'''


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

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

# for 


path=r'C:\Users\jg2yXRZ\OneDrive\桌面\20250903各班周计划里的时间更改'
os.makedirs(path,exist_ok=True)


title='2025学年第一学期校历'

tt=path+fr"\02-01 {title}.xlsx"

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

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

# 设置日期范围
start_date = datetime.date(2025, 9, 1)
end_date = datetime.date(2026, 1, 30)

# 计算周数和日期
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")    # 9-1
    # 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(2025, 10, 1), datetime.date(2025, 10, 2),
                    datetime.date(2025, 10,3), datetime.date(2025, 10, 6),datetime.date(2025, 10, 7),datetime.date(2025, 10, 8),\
                    datetime.date(2026, 1, 1),datetime.date(2026, 1, 2)]
    # 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(2025, 4, 27) or current_day == datetime.date(2024, 9, 29) or current_day == datetime.date(2024, 10, 12):
    special_yellow_dates = [datetime.date(2025, 9, 28), 
                       datetime.date(2025, 10, 11), 
                       datetime.date(2026, 1, 4)]
    if current_day in special_yellow_dates:
        yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
        cell.fill = yellow_fill
    
    # 移动到下一天
    current_day += datetime.timedelta(days=1)


   

# 保存工作簿
workbook.save(tt)
time.sleep(2)



import openpyxl
from openpyxl.styles import PatternFill

# 打开已存在的Excel文件
workbook = openpyxl.load_workbook(tt)
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 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)
            # 获取黄色单元格所在列的第一行的文字
            first_row_value = sheet.cell(row=1, column=col).value
            # 将文字写入R列对应的单元格
            sheet.cell(row=row, column=16+len(yellow_cells)).value = first_row_value
    # 将黄色单元格的值复制到I列开始的单元格
    # for index, value in enumerate(yellow_cells):
    #     sheet.cell(row=row, column=9+index).value = value





# 设置列宽
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(tt)
# 再以下这份里面手动复制黏贴起止日期
workbook.save(tt[:-5]+'人工修改用.xlsx')

生成两个一样的xlsx,

第一个效果如下,标出了实际上班的黄色日期

第二个人工修改版是一样的(原来是在这里改起止时间)

二、提取黄色部分(每行第一个黄和最后一个黄)

'''
2025学年第一学期校历,制作教案用日期 提取长日期和短日期手动修改
做教案用
星火讯飞 阿夏
20240703
'''



import openpyxl

path=r'C:\Users\jg2yXRZ\OneDrive\桌面\20250903各班周计划里的时间更改'
title='2025学年第一学期校历'


# 打开Excel文件
file_path = path+fr"\02-01 {title}人工修改用.xlsx"
workbook = openpyxl.load_workbook(file_path)
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)

# 在A列后面插入两个空列
sheet.insert_cols(2, 2)

import openpyxl


# 遍历每一行,读取D列和H列的值,组合后写入B列
for row in range(2, sheet.max_row + 1):
    d_value = sheet.cell(row=row, column=4).value  # D列的值
    h_value = sheet.cell(row=row, column=8).value  # H列的值
    if h_value is not None:  # 检查h_value是否为None
        combined_value = f"{d_value}——{h_value[5:]}"  # 组合值,只保留H列单元格内容的[5:]部分
        sheet.cell(row=row, column=2).value = combined_value  # 写入B列
    else:
        print(f"Row {row} has a None value in column H")

for row in range(2, sheet.max_row + 1):
    d_value = sheet.cell(row=row, column=4).value  # D列的值
    h_value = sheet.cell(row=row, column=8).value  # H列的值
    combined_value = f"{d_value}—{h_value}"  # 组合值
    sheet.cell(row=row, column=3).value = combined_value  # 写入B列

for col in range(2, 4):
    sheet.column_dimensions[openpyxl.utils.get_column_letter(col)].width = 30

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


# 保存修改后的Excel文件
workbook.save(path+fr"\02 {title}组合教案用.xlsx")

会有空白

如果提取不到第1列、第5列的黄色,就会出现空白

需要手动调整5天的起止(可能会变成每周6天7天,或只有4天,凑足5天等)这里需要人工判断,补全空格。

这两条就是短日期和长日期

三、正式批量生成20个班级22周的周计划+教案部分三个地方的填充

1、生成汉字1-22周

2、制作班级(有括号、无括号)

3、提取短日期和长日期,添加周次、班级、补全标题行、短日期行、长日期行的一整行内容

4、5分列导入excle,根据班级拆分

'''
周计划+教案里面的标题、短日期、长日期(批量20个班级)
deepseek、阿夏
20250703
'''
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Border, Side, Alignment

# 周次大写
def number_to_chinese(num):
    """将数字转换为中文大写(1-99)"""
    chinese_digits = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
    if num <= 10:
        return chinese_digits[num] if num != 10 else "十"
    elif num < 20:
        return "十" + chinese_digits[num % 10]
    else:
        tens = num // 10
        units = num % 10
        return chinese_digits[tens] + "十" + (chinese_digits[units] if units != 0 else "")

n = 22
week_list = [number_to_chinese(i) for i in range(1, n + 1)]

# 组合班级
grades = ["托", "小", "中", "大"]
class_counts = [2, 6, 6, 6]
classes = [f"{grade}({i})" for grade, count in zip(grades, class_counts) for i in range(1, count + 1)]
classes2 = [f"{grade}{i}" for grade, count in zip(grades, class_counts) for i in range(1, count + 1)]

# 获取两组日期
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\20250903各班周计划里的时间更改'
# 读取 Excel 文件
df = pd.read_excel(path + r"\02 2025学年第一学期校历组合教案用.xlsx", header=None)

# 提取第 2 列和第 3 列
datelong = df.iloc[1:, 1].tolist()
dateshort = df.iloc[1:, 2].tolist()

# 组合列表
all_data = []
for x in range(len(classes)):
    for y in range(len(week_list)):
        a = f'第{y+1:02}周'
        b = f'{classes[x]}班'
        c = f'{classes[x]}班  第{week_list[y]}周  活动安排'
        d = f'{datelong[y]}'         
        e = f'日期 {dateshort[y]}        第({y+1})周        班级  {classes2[x]}班'
        all_data.append([a, b, c, d, e])

# 创建DataFrame
df_output = pd.DataFrame(all_data, columns=["周次", "班级", "标题", "短日期", "长日期"])

# 创建Excel文件并设置列宽
output_path = path +  r"\各班周计划教案的日期.xlsx"
wb = Workbook()

# 先创建一个汇总表
ws_summary = wb.active
ws_summary.title = "汇总"

# 写入标题行
ws_summary.append(["周次", "班级", "标题", "短日期", "长日期"])

# 设置标题行文字居中
for cell in ws_summary[1]:  # 第一行是标题行
    cell.alignment = Alignment(horizontal='center', vertical='center')

# 写入数据,从第3行开始
for row in dataframe_to_rows(df_output, index=False, header=False):
    ws_summary.append(row)

# 设置列宽
column_widths = [10, 15, 33, 28, 80]
for i, width in enumerate(column_widths, start=1):
    ws_summary.column_dimensions[chr(64 + i)].width = width

# 添加边框
thin_border = Border(left=Side(style='thin'), 
                     right=Side(style='thin'), 
                     top=Side(style='thin'), 
                     bottom=Side(style='thin'))

# 为有内容的单元格添加边框
for row in ws_summary.iter_rows():
    for cell in row:
        if cell.value:  # 如果单元格有内容
            cell.border = thin_border

# 按班级拆分到不同工作表
class_groups = df_output.groupby('班级')

for class_name, group in class_groups:
    # 创建新工作表
    ws_class = wb.create_sheet(title=class_name.replace('班', ''))  # 去掉"班"字作为工作表名
    
    # 写入标题行
    ws_class.append(["周次", "班级", "标题", "短日期", "长日期"])
    
    # 设置标题行文字居中
    for cell in ws_class[1]:  # 第一行是标题行
        cell.alignment = Alignment(horizontal='center', vertical='center')
    
    # 写入数据
    for row in dataframe_to_rows(group, index=False, header=False):
        ws_class.append(row)
    
    # 设置列宽
    for i, width in enumerate(column_widths, start=1):
        ws_class.column_dimensions[chr(64 + i)].width = width
    
    # 添加边框
    for row in ws_class.iter_rows():
        for cell in row:
            if cell.value:  # 如果单元格有内容
                cell.border = thin_border

# 删除默认创建的Sheet工作表(如果存在且为空)
if "Sheet" in wb.sheetnames and len(wb["Sheet"].rows) == 0:
    del wb["Sheet"]

# 保存文件
wb.save(output_path)

print(f"文件已保存到: {output_path}")
print(f"总记录数: {len(all_data)}")
print("列宽已设置为: [10, 15, 33, 28, 80]")
print("已为所有有内容的单元格添加边框")
print("已按班级拆分数据到不同工作表")
print("所有标题行文字已设置为居中")

把所有数据5个一行写入汇总表,调整列宽,边框,标题居中

根据班级拆分:右侧三列是要贴的内容

左侧的班级不同,三列中关于班级的地方也改过了

模版做好了,等开学,各位年级组长统一了每周有几天后,再进行批量

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值