【办公类-90-01】】20250213中班周计划四类活动的写法(分散运动、户外游戏、个别化(美工室图书吧探索室))
每学期的周计划制作模板都会调整
开学在即,组长发了新的运动、游戏、个别化安排表
今年的规则是
1,运动从一周五个项目变成了一个项目
2、游戏从一周五个项目变成了一个项目。
3、个别化-美工室轮到的周次(一学期大概有4周),个别化内容需要写“美术材料”
4、个别化-图书和探索室写法不变。不玩“美工”的周次,就是图书和探索(每个都是固定的两天)
我根据周计划模板,把内容分类编号
然后就对每个项目进行批量制作
一、分散运动
要求:
本次我设计的思路是,
1、做一个列表25个元素,场地1、2、3、4、5、场地2、3、4、5、1、场地3、4、5、1、2、场地4、5、1、2、3、场地5、1、2、3、4,然后复制4次。
2、班级A列是中2、2、2、2、2、中3、3、3、3、3
3、周次B列是第1、2、3、4、5周、第1、2、3、4、5周
4、场地做成1列(以前都是5列),场地1、2、3、4、5、场地2、3、4、5、1
代码展示:
'''
目的:2024年2月中班总部分散运动场地,每星期只有一条(各班滚动排)
(一周一次,就不用考虑节假日了)
作者:阿夏、星火讯飞
时间:2024年2月12日15:30
'''
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
import os, shutil
# 一共20周
w = 20
# 五周一循环
xz = 5
# 循环次数,多一点
y = int(w / xz)
print('---------第1步:把8个运动场地循环21次(105元素组成的列表)------')
# 本学期:总园中班只有5个
gradenum = ['2', '3', '4', '5', '6']
path = r"C:\Users\jg2yXRZ\OneDrive\桌面\202502 中班4类活动批量"
# 新建一个”装N份word和PDF“的文件夹
sport = []
classroom = []
week = []
# 这里是8个运动场地,因为后面有递进,所以把最后一个 ,放到01前面,这样摆放后面才会正确)
sportall = [
'场地1(主要材料:平衡车、三轮车、自行车、木桥等)',
'场地2(主要材料:竹梯、三脚架、长凳、轮胎、安全垫等)',
'场地3(主要材料:各类球、箩筐、百变迷宫架、马甲等)',
'场地4(主要材料:轮胎、跨栏、锣鼓、接力棒等)',
'场地5(主要材料:弹力棉球、吸盘球、滑滑梯、爬笼等)',
]
# sport=[1,2,3,4,5]
# 规律是,第一组12345,第二组23451 第三组34512 第四组45123,第五组51234
ss = sportall * 10
# radenum的长度=5,生成了25周 5周一循环,
for x in range(y): # 4
# # 场地
for i in range(len(gradenum)):
# 5个班级5周循环
start_index = i
end_index = i + 5
extracted_elements = ss[start_index:end_index]
print(f"第{i + 1}次提取的元素: {extracted_elements}")
for ww in extracted_elements:
sport.append(ww) # print(sport)
# print(len(sport))
# 班级名称,连续出现5次
for i in range(len(gradenum)):
for oo in range(xz):
classroom.append(f'中{gradenum[i]}班')
print(classroom)
print(len(classroom))
# 周次名称,连续出现5次
# for x in range(5): # 4
for o in range(xz): # x=5
for l in range(x * xz + 1, x * xz + xz + 1):
ww = f'第{l:02}周'
week.append(ww)
print(week)
print(len(week))
import openpyxl
from openpyxl import Workbook
# 创建一个工作簿对象
wb = Workbook()
ws = wb.active
ws.title = "总表"
# 在A1写入“班级”,B1写入“周次”,C1写入“运动场地”
ws['A1'] = '班级'
ws['B1'] = '周次'
ws['C1'] = '运动场地'
# 从A2开始写入classroom,B2开始写入week,C2开始写入sport
for i in range(len(classroom)):
ws[f'A{i + 2}'] = classroom[i]
ws[f'B{i + 2}'] = week[i]
ws[f'C{i + 2}'] = sport[i]
# 将总表内容按照班级拆分到同一个工作簿的不同工作表中,标签为“班级+分散运动安排”
for grade in gradenum:
ws_new = wb.create_sheet(title=f'中{grade}班分散运动安排')
ws_new['A1'] = '班级'
ws_new['B1'] = '周次'
ws_new['C1'] = '运动场地'
row = 2
for i in range(len(classroom)):
if classroom[i].startswith(f'中{grade}'):
ws_new[f'A{row}'] = classroom[i]
ws_new[f'B{row}'] = week[i]
ws_new[f'C{row}'] = sport[i]
row += 1
# 保存到文件
output_file = path + r'\01 中班分散运动..xlsx'
wb.save(output_file)
print(f"Excel文件已保存到: {output_file}")
把生成xlsx存到单独文件夹里
1、总表内容
2、各班表格
做出来的场地我都放在C列
二、户外游戏
要求:
分析:
1、游戏的场地写法和运动相同,复制运动的代码,微调
2、正好5个班,20周,所以正好复制4次就可以了
3、游戏需要加上场地
代码展示
'''
目的:2024年2月中班总部户外游戏场地,每星期只有一条(各班滚动排)
(一周一次,就不用考虑节假日了)
作者:阿夏、星火讯飞
时间:2024年2月29日15:30
'''
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
import os, shutil
# 一共20周
w = 20
# 五周一循环
xz = 5
# 循环次数,多一点
y = int(w / xz)
print('---------第1步:把8个游戏场地循环21次(105元素组成的列表)------')
# 本学期:总园中班只有5个
gradenum = ['2', '3', '4', '5', '6']
path = r"C:\Users\jg2yXRZ\OneDrive\桌面\202502 中班4类活动批量"
# 新建一个”装N份word和PDF“的文件夹
game = []
classroom = []
week = []
# 这里是8个游戏场地,因为后面有递进,所以把最后一个 ,放到01前面,这样摆放后面才会正确)
gameall = [
'角色游戏1——南侧草坪东',
'角色游戏2——南侧草坪西',
'表演游戏——绿操场西',
'沙水游戏——中庭沙水区',
'建构游戏——绿操场东',
]
# game=[1,2,3,4,5]
# 规律是,第一组12345,第二组23451 第三组34512 第四组45123,第五组51234
ss = gameall * 10
# radenum的长度=5,生成了25周 5周一循环,
for x in range(y): # 4
# # 场地
for i in range(len(gradenum)):
# 5个班级5周循环
start_index = i
end_index = i + 5
extracted_elements = ss[start_index:end_index]
print(f"第{i + 1}次提取的元素: {extracted_elements}")
for ww in extracted_elements:
game.append(ww) # print(game)
# print(len(game))
# 班级名称,连续出现5次
for i in range(len(gradenum)):
for oo in range(xz):
classroom.append(f'中{gradenum[i]}班')
print(classroom)
print(len(classroom))
# 周次名称,连续出现5次
# for x in range(5): # 4
for o in range(xz): # x=5
for l in range(x * xz + 1, x * xz + xz + 1):
ww = f'第{l:02}周'
week.append(ww)
print(week)
print(len(week))
import openpyxl
from openpyxl import Workbook
# 创建一个工作簿对象
wb = Workbook()
ws = wb.active
ws.title = "总表"
# 在A1写入“班级”,B1写入“周次”,C1写入“游戏场地”
ws['A1'] = '班级'
ws['B1'] = '周次'
ws['C1'] = '游戏场地'
# 从A2开始写入classroom,B2开始写入week,C2开始写入game
for i in range(len(classroom)):
ws[f'A{i + 2}'] = classroom[i]
ws[f'B{i + 2}'] = week[i]
ws[f'C{i + 2}'] = game[i]
# 将总表内容按照班级拆分到同一个工作簿的不同工作表中,标签为“班级+分散游戏安排”
for grade in gradenum:
ws_new = wb.create_sheet(title=f'中{grade}班分散游戏安排')
ws_new['A1'] = '班级'
ws_new['B1'] = '周次'
ws_new['C1'] = '游戏场地'
row = 2
for i in range(len(classroom)):
if classroom[i].startswith(f'中{grade}'):
ws_new[f'A{row}'] = classroom[i]
ws_new[f'B{row}'] = week[i]
ws_new[f'C{row}'] = game[i]
row += 1
# 保存到文件
output_file = path + r'\02 中班户外游戏..xlsx'
wb.save(output_file)
print(f"Excel文件已保存到: {output_file}")
1、总表
2、班级表
三、个别化(提取探索室、图书吧的星期)
要求:
这个表有点麻烦,我看了半天。寻找规律:
第一组——基础模型
图书吧、空、空、空、探索室、探索室、图书吧、空、空、空、空、探索室、图书吧、空、空、空、空、探索室、图书吧、空、空、空、空、探索室、图书吧。
第二组:
探索室、图书吧、空、空、空、空、探索室、图书吧、空、空、空、空、探索室、图书吧、空、空、空、空、探索室、图书吧。图书吧、空、空、空、探索室、
变化就是对第一组组合,从第索引5开始取值+前5个
第三组:
空、探索室、图书吧、空、空、空、空、探索室、图书吧、空、空、空、空、探索室、图书吧。图书吧、空、空、空、探索室、探索室、图书吧、空、空、空、
结论:最终这五周(蓝色),实际滚动了四次(红色),每次都是对前一组的“第5个到最后+前五个进行组合”
基于这个规律
代码展示
'''
目的:2024年2月个别化两个房间
(一周两次,写一条,就不用考虑节假日了)
作者:阿夏、星火讯飞
时间:2024年2月29日15:30
'''
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
import os, shutil
# 一共20周
w = 20
# 五周一循环
xz = 5
# 循环次数,多一点
y = int(w / xz)
print('---------第1步:把8个个别化循环21次(105元素组成的列表)------')
# 本学期:总园中班只有5个
gradenum = ['2', '3', '4', '5', '6',]
gradenums=gradenum*10
path = r"C:\Users\jg2yXRZ\OneDrive\桌面\202502 中班4类活动批量"
# 新建一个”装N份word和PDF“的文件夹
studyall=[]
study = []
classroom = []
week = []
# for x in range(y): # 4
# 初始化基础模型
a = ['图书吧', '', '', '', '探索室']
b = ['探索室', '图书吧', '', '', '', ''] * 3
c = ['探索室', '图书吧']
studyall1 = a + b + c
print("初始 studyall1:", studyall1)
print("初始长度:", len(studyall1))
# 添加第1组
studyall = studyall1.copy()
# 添加第2-4组
for i in range(3): # 总共需要添加4次,因为已经有一个初始组
studyall1 = studyall1[5:] + studyall1[:5]
print(f"第{i + 2}次提取的元素: {studyall1}")
for x in studyall1:
studyall.append(x)
# 手动复制4次
studyall=studyall[:125]*4
print("最终 studyall:", studyall)
print("最终长度:", len(studyall))
for i in range(1,len(gradenum)+1):
# 提取当前子序列
current_sequence = gradenum[i:] + gradenum[:i]
for y in current_sequence:
classroom.append(f'中{y}班')
# 一共25个,只要前20个
classroom=classroom[:20]*4
print("最终结果:", classroom,len(classroom))
# 周次名称,连续出现5次
for l in range(1,w+1): # 20周
for oo in range(4): # 每一周有4次(5个班级实际只有4个班玩)
ww = f'第{l:02}周'
week.append(ww)
print(week)
print(len(week))
import openpyxl
from openpyxl import Workbook
# 创建一个工作簿对象
wb = Workbook()
ws = wb.active
ws.title = "总表"
# 在A1写入“班级”,B1写入“周次”,C1写入“个别化”
ws['A1'] = '班级'
ws['B1'] = '周次'
ws['C1'] = '个别化'
ws['D1'] = '周一'
ws['E1'] = '周二'
ws['F1'] = '周三'
ws['G1'] = '周四'
ws['H1'] = '周五'
# ws['I1'] = '房间2'
# 从A2开始写入classroom,B2开始写入week,C2开始写入studyall,按每五个一组写入C2到G2的位置
for i in range(len(classroom[:80])):
ws[f'A{i + 2}'] = classroom[i]
ws[f'B{i + 2}'] = week[i]
for j in range(5): # 每个班级有5天的活动安排67C 68D
ws[chr(68 + j) + str(i + 2)] = studyall[i * 5 + j] if (i * 5 + j) < len(studyall) else ""
# 处理H列的房间信息
# 遍历指定范围的单元格
for row in range(2, len(classroom[:80]) + 2):
book_cell = None
explore_cell = None
# 查找图书吧和探索室所在的单元格
for col in range(68, 73): # D到H列
cell_value = ws[chr(col) + str(row)].value
if cell_value == "图书吧":
book_cell = chr(col) + str(row)
elif cell_value == "探索室":
explore_cell = chr(col) + str(row)
# 如果找到了图书吧和探索室,则提取相关信息并组合
if book_cell and explore_cell:
# 获取该单元格所在列的第一行单元格的值
book_first_row_value = ws[chr(ord(book_cell[0])) + '1'].value
explore_first_row_value = ws[chr(ord(explore_cell[0])) + '1'].value
# 将结果写入目标单元格(例如H列)
ws[f'C{row}'] = f"{book_first_row_value}{ws[book_cell].value};{explore_first_row_value}{ws[explore_cell].value}"
# ws[f'I{row}'] = f""
else:
ws[f'C{row}'] = ""
# ws[fI{row}'] = ""
# 将总表内容按照班级拆分到同一个工作簿的不同工作表中,标签为“班级+个别化安排”
for grade in gradenum:
ws_new = wb.create_sheet(title=f'中{grade}班个别化安排')
ws_new['A1'] = '班级'
ws_new['B1'] = '周次'
ws_new['C1'] = '个别化'
ws_new['D1'] = '周一'
ws_new['E1'] = '周二'
ws_new['F1'] = '周三'
ws_new['G1'] = '周四'
ws_new['H1'] = '周五'
row = 2
for i in range(len(classroom[:80])):
if classroom[i].startswith(f'中{grade}'):
ws_new[f'A{row}'] = classroom[i]
ws_new[f'B{row}'] = week[i]
for j in range(5): # 每个班级有5天的活动安排
ws_new[chr(68 + j) + str(row)] = studyall[i * 5 + j] if (i * 5 + j) < len(studyall) else ""
ws_new[f'C{row}'] = ws[f'C{i + 2}'].value if i + 2 <= len(classroom[:80]) + 1 else ""
# ws_new[f'I{row}'] = ws[f'I{i + 2}'].value if i + 2 <= len(classroom[:80]) + 1 else ""
row += 1
# 如果F列不满20条,补足
# 如果C列(从第二行开始算)不满20条,就复制C1列的内容到CX列
for row in range(2, 22):
col_c_value = ws_new[f'C{row}'].value
if not col_c_value:
ws_new[f'C{row}'] = ws_new['C2'].value
# 保存到文件
output_file = path + r'\03 中班个别化..xlsx'
wb.save(output_file)
print(f"Excel文件已保存到: {output_file}")
1、总表样式
与预设表格进行核对
需要将两个有活动室的星期与活动室组合再一个格子里
内容正确
2、班级表:
我发现有些周是空缺的(空缺周)
与个别化-美工室的表格核对,原来02、07、12、17周是用来玩“美工室学习了”
询问组长,说20周都写一样的内容
所以代码里写了,不足20条,就不足20条
先图书、再探索

可以看到虽然表格中排列复杂(因为星期和所有次数的错位),但是换算到班级,实际上班级在“轮到的几周”,都是统一的某一天的探索室或图书室。
特别说明:这套代码因为班级、周次、星期不匹配,所以参数范围要选定80条(这里测试了很多次)
四、美工室
要求:
虽然美工室排版要求简单,但是这是四张里代码最复杂的表。
改进:
1、制作成每个班级20条写法
用去年的代码,这张表生成了每班一行
本次,我想改成5个班级,每班20周20行(虽然内容都是一样的),便于制作一个“运动、游戏、个别化(美术)”的合并表单
2.对轮到的周次的哪一行进行黄色底纹填充。明确这周的个别化内容写“美术方面”
为了填充黄色,需要进行多次汉字匹配、数字匹配,最后我把把数字和汉字拆开来才实现了这种撇配,填充了黄色
代码展示
# -- coding:utf-8 --
'''
中班美工室,6个班级(总院中班)将它做成20周竖排样式样式
作者:阿夏
时间:2025年2月18日
'''
import xlrd,time
import xlwt
from openpyxl import load_workbook
path = r"C:\Users\jg2yXRZ\OneDrive\桌面\202502 中班4类活动批量"
# 新建一个”装N份word和PDF“的文件夹
gradenum = ['2', '3', '4', '5', '6']
classroom1=[]
for c in range(4):
for a in gradenum:
classroom1 .append('中{}班'.format(a))
print(classroom1)
print(len(classroom1))
# 38
week1 = []
week2 = []
# 定义数字和中文数字的列表
numbers = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
chinese_numbers = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十']
# 循环生成 week1 和 week2
for num, chinese in zip(numbers, chinese_numbers):
week1.append('第{}{}周'.format(num,chinese))
week2.append('{}{}'.format(num, chinese))
# 打印结果
print(week1)
print(len(week1))
# # 38
# # ['第01一周', '第02二周', '第03三周', '第04四周', '第05五周', '第06六周', '第07七周', '第08八周', '第09九周', '第10十周', '第11十一周', '第12十二周', '第13十三周', '第14十四周', '第15十五周',
# # '第16十六周', '第17十七周', '第18十八周', '第19十九周', '第20二十周']
print(week2)
print(len(week2))
# ['01一', '02二', '03三', '04四', '05五', '06六', '07七', '08八', '09九', '10十', '11十一', '12十二', '13十三', '14十四', '15十五', '16十六', '17十七', '18十八', '19十九', '20二十']
# 20
big=[]
for f in classroom1:
for d in range(len(week1)):
if classroom1[d]==f:
bigbig='{} {}'.format(f,week1[d])
big.append(bigbig)
big=sorted(set(list(big)))
print(big)
print(len(big))
# # # # # 在第一周前面加上01 ,进行从小到大排序,不加01,会按照一、二的拼音字母排序
# # # # # ['中1班 第01一周', '中1班 第02二周', '中1班 第13十三周', '中1班 第14十四周', '中1班 第15十五周', '中2班 第01一周', '中2班 第02二周', '中2班 第03三周', '中2班 第04四周', '中2班 第15十五周', '中2班 第16十六周', '中3班 第03三周', '中3班 第04四周', '中3班 第05五周', '中3班 第06六周', '中3班 第16十六周', '中3班 第17十七周', '中4班 第05五周', '中4班 第06六周', '中4班 第07七周', '中4班 第08八周', '中4班 第17十七周', '中4班 第18十八周', '中5班 第07七周', '中5班 第08八周', '中5班 第09九周', '中5班 第10十周', '中5班 第18十八周', '中5班 第19十九周', '中6班 第09九周', '中6班 第10十周', '中6班 第11十一周', '中6班 第12十二周',
# # # # # '中6班 第19十九周', '中7班 第11十一周', '中7班 第12十二周', '中7班 第13十三周', '中7班 第14十四周']
k=[]
kk=[]
# for x in range(20):
for g in classroom1:
k.clear()
for x in range(len(big)):
# print(big[x])
if big[x][:3]==g:
# if big[x][:3]==g:
# print(big[x][3:])
if len(big[x])==10: # 第十七周 一共有10个字符
k.append(big[x][7:9]) # 汉字
# k.append(big[x][5:7]) # 数字
else:
k.append(big[x][7:8]) # 汉字
# k.append(big[x][6:7]) # 数字
print(k)
result = '、'.join(k)
print(result)
# ['五', '十', '十五', '二十']
# 五、十、十五、二十
kk.append(f'{g}第{result}周“快乐玩色彩”专用活动室')
kk=sorted(set(list(kk)))
print(kk)
# ['中2班第一、六、十一、十六周“快乐玩色彩”专用活动室', '中3班第二、七、十二、十七周“快乐玩色彩”专用活动室', '中4班第三、八、十三、十八周“快乐玩色彩”专用活动室', '中5班第四、九、十四、十九周“快
# 乐玩色彩”专用活动室', '中6班第五、十、十五、二十周“快乐玩色彩”专用活动室']
# # print(len(kk))
# 做成20周的
art=[]
for k2 in kk:
for bb in range(20):
art.append(k2[3:]) # 不要班级名了。
print(art)
print(len(art))
# 100天,20周5个班
# # # 汉字版本
# # # 第五、十、十五、二十周“快乐玩色彩”专用活动室
classroom=[]
# 班级名称,连续出现5次
for i in gradenum:
for oo in range(20):
classroom.append('中'+i+'班')
print(classroom)
print(len(classroom))
# 100
week=[]
# 周次名称,连续出现5次
# for x in range(5): # 4
for l in range(5): # 五个班级
for o in range(1,21): # 1-20周的名称
ww = f'第{o:02}周'
week.append(ww)
print(week)
print(len(week))
# 400
# 写入EXCLE
import openpyxl
from openpyxl import Workbook
# 创建一个工作簿对象
wb = Workbook()
ws = wb.active
ws.title = "总表"
# 在A1写入“班级”,B1写入“周次”,C1写入“美工室”
ws['A1'] = '班级'
ws['B1'] = '周次'
ws['C1'] = '美工室'
# 从A2开始写入classroom,B2开始写入week,C2开始写入game
for i in range(len(classroom)):
ws[f'A{i + 2}'] = classroom[i]
ws[f'B{i + 2}'] = week[i]
ws[f'C{i + 2}'] = art[i]
# 将总表内容按照班级拆分到同一个工作簿的不同工作表中,标签为“班级+分散游戏安排”
for grade in gradenum:
ws_new = wb.create_sheet(title=f'中{grade}班分散游戏安排')
ws_new['A1'] = '班级'
ws_new['B1'] = '周次'
ws_new['C1'] = '美工室'
row = 2
for i in range(len(classroom)):
if classroom[i].startswith(f'中{grade}'):
ws_new[f'A{row}'] = classroom[i]
ws_new[f'B{row}'] = week[i]
ws_new[f'C{row}'] = art[i]
row += 1
# 保存到文件
output_file = path + r'\04 中班美工室游戏..xlsx'
wb.save(output_file)
print(f"Excel文件已保存到: {output_file}")
time.sleep(1)
# # 打开已经保存的 Excel 文件
wb = openpyxl.load_workbook(output_file)
# # ws = wb['中3班分散游戏安排']
# 定义一个函数来填充单元格颜色
def fill_cell_color(ws, col, row, color):
cell = f'{col}{row}'
ws[cell].fill = openpyxl.styles.PatternFill(start_color=color, end_color=color, fill_type='solid')
# 遍历每一张表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
# 遍历 C 列所有单元格,如果满足条件则填充颜色
for row in range(2, ws.max_row + 1): # 从第二行开始遍历,因为第一行是标题行
cell_value = ws[f'C{row}'].value
# 第五、十、十五、二十周“快乐玩色彩”专用活动室
if cell_value is not None:
# 读取来的结果取第1-10个字符,10个字符中间有顿号,我希望以顿号切割
first_ten_chars = str(cell_value)[1:10]
print(first_ten_chars)
# 五、十、十五、二十
parts = first_ten_chars.split('、')
print(parts)
# # 检查分割后的部分是否满足你的条件,这里假设条件是部分长度大于1
# if len(parts) > 1 and len(parts[0]) > 1 and len(parts[1]) > 1:
# ws[f'C{row}'].fill = fill
# # print(f"Sheet: {sheet_name}, Row: {row}, Cell Value: {cell_value}") # 打印调试信息
if cell_value:
for item in week2:
print('0:'+item)
# 无论01一、12十二、35三十五,都是从索引2开始提取)
chinese_part = item[2:]
# print(chinese_part)
if chinese_part in parts: # 检查 C 列的值是否包含 chinese_part
week_number = item[:2] # 提取数字部分并补零
print('1'+week_number)
if ws[f'B{row}'].value == f'第{week_number}周': # 检查 B 列的值是否匹配
fill_cell_color(ws, 'B', row, 'FFFF00') # 黄色
fill_cell_color(ws, 'C', row, 'FFFF00') # 黄色
break # 如果找到匹配项,跳出内层循环找到
# 保存更改后的文件
wb.save(output_file)
print("特定单元格已填充颜色并保存到文件中。")
星火讯飞写了无数次,反复调试了无数次,总算磕磕绊绊地实现了想要地结果。(调整里面地数字,用了不少时间)
1、总表
2、班级表
看上去简单,实际上代码目前写起来,并不简单。
五、将四表合并成一个共享版XCLX
因为本次运动、游戏变成1天(原来是5天),所以,完全可以将“运动场地”“游戏场地”美术+个别化“合在一个表里。老师们用起来也方便。
继续绞尽脑汁在星火讯飞里写”需求,反复调整。
'''
05 组合四类安排表内容到 一个excel(因为本次运动\游戏都是一天,而不是五天,可以合并在一起,便于复制.黄色一条说明是美术室周,个别化要写美术地内容)
作者:阿夏
时间:2025年2月18日
'''
import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter
from copy import deepcopy
import xlrd,time
import xlwt
import openpyxl
from openpyxl import load_workbook
# 定义文件夹路径和文件名列表
folder_path = r'C:\Users\jg2yXRZ\OneDrive\桌面\202502 中班4类活动批量'
new = folder_path + r'\四类表格'
new_name = folder_path + r'\05 总园中班周计划三类活动写法.xlsx'
# 过滤出所有的 Excel 文件(假设扩展名为 .xlsx)
excel_files = [file for file in os.listdir(new) if file.endswith('.xlsx')]
print("Excel 文件名:", excel_files)
# ['01 中班分散运动..xlsx', '02 中班户外游戏..xlsx', '03 中班个别化..xlsx', '04 中班美工室游戏..xlsx']
# 读取第一个 Excel 文件并复制它
first_file = os.path.join(new, excel_files[0])
wb = load_workbook(first_file)
wb.save(new_name)
# 打开复制后的文件以进行修改
copied_file = new_name
wb_copy = load_workbook(copied_file)
ws_copy = wb_copy.active
# 假设excel_files, new, ws_copy, and copied_file已经在其他地方定义
n=1
for file in excel_files[1:]:
file_path = os.path.join(new, file)
wb_source = load_workbook(file_path)
# 获取所有工作表名称
sheet_names = [sheet.title for sheet in wb_source.worksheets]
print("表名:", sheet_names)
for sheet_name in sheet_names[1:]:
# 检查工作表名称前3个字是否匹配
matched_sheet = None
for target_sheet_name in ws_copy.parent.sheetnames:
if sheet_name[:3] == target_sheet_name[:3]:
matched_sheet = target_sheet_name
break
if matched_sheet:
print(f"正在处理工作表: {sheet_name} -> {matched_sheet}")
# 读取源工作表的C列数据(包括标题)
source_df = pd.read_excel(file_path, sheet_name=sheet_name, usecols='C')
print(source_df)
# 调试:打印源数据框的列(针对工作表名称)
print(f"源数据框的列 {sheet_name}: {source_df.columns}")
# 获取源数据框的列名,这里应该是'C'列
column_name = source_df.columns[0]
if column_name in source_df.columns:
# 获取目标工作表对象
target_ws = ws_copy.parent[matched_sheet]
# 将数据写入目标工作表的D列(包括标题)
# 首先写入标题
target_ws.cell(row=1, column=n+3).value = column_name # Column n+4 corresponds to 'D', 'E', 'F', etc.
# 然后写入数据
for i, value in enumerate(source_df[column_name], start=2): # Start from row 2 to leave space for the header
target_ws.cell(row=i, column=n+3).value = value
# 复制源单元格样式到目标单元格
source_cell = wb_source[sheet_name].cell(row=i, column=3) # Source cell is in column C (index 3)
target_cell = target_ws.cell(row=i, column=n+4)
else:
print(f"Column '{column_name}' not found in {sheet_name}")
else:
print(f"没有找到与工作表 {sheet_name} 前3个字匹配的目标工作表")
# 增加列索引以处理下一个文件的数据到下一列
n += 1
# 把列名为“个别化”和“美工室”的单元格内容合并,并删除“美工室”列
for sheet in wb_copy.sheetnames:
ws = wb_copy[sheet]
max_row = ws.max_row
max_col = ws.max_column
# 查找“个别化”和“美工室”列的索引
individualized_col = None
meishuoshi_col = None
for col in range(1, max_col + 1):
column = ws.cell(row=1, column=col).value
if column == "个别化":
individualized_col = col
elif column == "美工室":
meishuoshi_col = col
if individualized_col and meishuoshi_col:
# 合并“个别化”和“美工室”列的内容
for row in range(2, max_row + 1):
individualized_value = ws.cell(row=row, column=individualized_col).value or ""
meishuoshi_value = ws.cell(row=row, column=meishuoshi_col).value or ""
combined_value = f"{meishuoshi_value};{individualized_value}".strip()
ws.cell(row=row, column=individualized_col).value = combined_value
# 删除“美工室”列
ws.delete_cols(meishuoshi_col)
else:
print(f"Sheet {sheet} does not contain both '个别化' and '美工室' columns")
# 自动调整最适合的列宽
for sheet in wb_copy.sheetnames:
ws = wb_copy[sheet]
for col in ws.columns:
max_length = 0
column = col[0].column_letter # Get the column name
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2) * 1.8 # Adding a little extra space
ws.column_dimensions[column].width = adjusted_width
# # 填充颜色
week1 = []
week2 = []
# 定义数字和中文数字的列表
numbers = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
chinese_numbers = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十']
# 循环生成 week1 和 week2
for num, chinese in zip(numbers, chinese_numbers):
week1.append('第{}{}周'.format(num,chinese))
week2.append('{}{}'.format(num, chinese))
# 打印结果
print(week1)
print(len(week1))
print(week2)
print(len(week2))
# ['01一', '02二', '03三', '04四', '05五', '06六', '07七', '08八', '09九', '10十', '11十一', '12十二', '13十三', '14十四', '15十五', '16十六', '17十七', '18十八', '19十九', '20二十']
# 20
# 定义一个函数来填充单元格颜色
def fill_cell_color(ws, col, row, color):
cell = f'{col}{row}'
ws[cell].fill = openpyxl.styles.PatternFill(start_color=color, end_color=color, fill_type='solid')
# 遍历每一张表格
for sheet_name in wb.sheetnames:
# ws = wb_copy[sheet]
ws = wb_copy[sheet_name]
# 遍历 C 列所有单元格,如果满足条件则填充颜色
for row in range(2, ws.max_row + 1): # 从第二行开始遍历,因为第一行是标题行
cell_value = ws[f'E{row}'].value
# 第五、十、十五、二十周“快乐玩色彩”专用活动室
if cell_value is not None:
# 读取来的结果取第1-10个字符,10个字符中间有顿号,我希望以顿号切割
first_ten_chars = str(cell_value)[1:10]
print('1:'+first_ten_chars)
# 五、十、十五、二十
parts = first_ten_chars.split('、')
print(parts)
if cell_value:
for item in week2:
print('0:'+item)
# 无论01一、12十二、35三十五,都是从索引2开始提取)
chinese_part = item[2:]
# print(chinese_part)
if chinese_part in parts: # 检查 C 列的值是否包含 chinese_part
week_number = item[:2] # 提取数字部分并补零
print('1'+week_number)
if ws[f'B{row}'].value == f'第{week_number}周': # 检查 B 列的值是否匹配
# 假设 ws 是你的工作表对象,row 是你要填充的行号
# fill_cell_color(ws, 'B', row, 'FFFF00') # 黄色
for col in ['A', 'B', 'C', 'D', 'E']:
fill_cell_color(ws, col, row, 'FFFF00') # 黄色
break # 如果找到匹配项,跳出内层循环找到
# 删除第一张工作表“总表”
first_sheet = wb_copy.worksheets[0]
wb_copy.remove(first_sheet)
# 保存修改后的文件
wb_copy.save(copied_file)
print("操作完成!")
调试代码地不提了,都是泪。直接看结果
1、把四类表格文件夹里放四个文件
2、复制第一个文件“运动.xlsx”的所有工作表到另外地文件夹,包含A班级B星期C运动
3、匹配表名”前三个字“(中X班),后读取第2-4个文件对应的表名(前3字),如果一样,就把第3列(C)的内容和列标题到第1个文件中的DEF列
3、美工室+图书探索需要合并在一起”;分隔
4、调整最适合列宽,便于看清所有文字
5、填充美工室所属周的黄色底纹,把一行都填充黄色
5、删除第一张总表(就是运动的总表)
代码展示
'''
05 组合四类安排表内容到 一个excel(因为本次运动\游戏都是一天,而不是五天,可以合并在一起,便于复制.黄色一条说明是美术室周,个别化要写美术地内容)
作者:阿夏
时间:2025年2月18日
'''
import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter
from copy import deepcopy
import xlrd,time
import xlwt
import openpyxl
from openpyxl import load_workbook
# 定义文件夹路径和文件名列表
folder_path = r'C:\Users\jg2yXRZ\OneDrive\桌面\202502 中班4类活动批量'
new = folder_path + r'\四类表格'
new_name = folder_path + r'\05 总园中班周计划三类活动写法.xlsx'
# 过滤出所有的 Excel 文件(假设扩展名为 .xlsx)
excel_files = [file for file in os.listdir(new) if file.endswith('.xlsx')]
print("Excel 文件名:", excel_files)
# ['01 中班分散运动..xlsx', '02 中班户外游戏..xlsx', '03 中班个别化..xlsx', '04 中班美工室游戏..xlsx']
# 读取第一个 Excel 文件并复制它
first_file = os.path.join(new, excel_files[0])
wb = load_workbook(first_file)
wb.save(new_name)
# 打开复制后的文件以进行修改
copied_file = new_name
wb_copy = load_workbook(copied_file)
ws_copy = wb_copy.active
# 假设excel_files, new, ws_copy, and copied_file已经在其他地方定义
n=1
for file in excel_files[1:]:
file_path = os.path.join(new, file)
wb_source = load_workbook(file_path)
# 获取所有工作表名称
sheet_names = [sheet.title for sheet in wb_source.worksheets]
print("表名:", sheet_names)
for sheet_name in sheet_names[1:]:
# 检查工作表名称前3个字是否匹配
matched_sheet = None
for target_sheet_name in ws_copy.parent.sheetnames:
if sheet_name[:3] == target_sheet_name[:3]:
matched_sheet = target_sheet_name
break
if matched_sheet:
print(f"正在处理工作表: {sheet_name} -> {matched_sheet}")
# 读取源工作表的C列数据(包括标题)
source_df = pd.read_excel(file_path, sheet_name=sheet_name, usecols='C')
print(source_df)
# 调试:打印源数据框的列(针对工作表名称)
print(f"源数据框的列 {sheet_name}: {source_df.columns}")
# 获取源数据框的列名,这里应该是'C'列
column_name = source_df.columns[0]
if column_name in source_df.columns:
# 获取目标工作表对象
target_ws = ws_copy.parent[matched_sheet]
# 将数据写入目标工作表的D列(包括标题)
# 首先写入标题
target_ws.cell(row=1, column=n+3).value = column_name # Column n+4 corresponds to 'D', 'E', 'F', etc.
# 然后写入数据
for i, value in enumerate(source_df[column_name], start=2): # Start from row 2 to leave space for the header
target_ws.cell(row=i, column=n+3).value = value
# 复制源单元格样式到目标单元格
source_cell = wb_source[sheet_name].cell(row=i, column=3) # Source cell is in column C (index 3)
target_cell = target_ws.cell(row=i, column=n+4)
else:
print(f"Column '{column_name}' not found in {sheet_name}")
else:
print(f"没有找到与工作表 {sheet_name} 前3个字匹配的目标工作表")
# 增加列索引以处理下一个文件的数据到下一列
n += 1
# 把列名为“个别化”和“美工室”的单元格内容合并,并删除“美工室”列
for sheet in wb_copy.sheetnames:
ws = wb_copy[sheet]
max_row = ws.max_row
max_col = ws.max_column
# 查找“个别化”和“美工室”列的索引
individualized_col = None
meishuoshi_col = None
for col in range(1, max_col + 1):
column = ws.cell(row=1, column=col).value
if column == "个别化":
individualized_col = col
elif column == "美工室":
meishuoshi_col = col
if individualized_col and meishuoshi_col:
# 合并“个别化”和“美工室”列的内容
for row in range(2, max_row + 1):
individualized_value = ws.cell(row=row, column=individualized_col).value or ""
meishuoshi_value = ws.cell(row=row, column=meishuoshi_col).value or ""
combined_value = f"{meishuoshi_value};{individualized_value}".strip()
ws.cell(row=row, column=individualized_col).value = combined_value
# 删除“美工室”列
ws.delete_cols(meishuoshi_col)
else:
print(f"Sheet {sheet} does not contain both '个别化' and '美工室' columns")
# 自动调整最适合的列宽
for sheet in wb_copy.sheetnames:
ws = wb_copy[sheet]
for col in ws.columns:
max_length = 0
column = col[0].column_letter # Get the column name
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length + 2) * 1.8 # Adding a little extra space
ws.column_dimensions[column].width = adjusted_width
# # 填充颜色
week1 = []
week2 = []
# 定义数字和中文数字的列表
numbers = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']
chinese_numbers = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十']
# 循环生成 week1 和 week2
for num, chinese in zip(numbers, chinese_numbers):
week1.append('第{}{}周'.format(num,chinese))
week2.append('{}{}'.format(num, chinese))
# 打印结果
print(week1)
print(len(week1))
print(week2)
print(len(week2))
# ['01一', '02二', '03三', '04四', '05五', '06六', '07七', '08八', '09九', '10十', '11十一', '12十二', '13十三', '14十四', '15十五', '16十六', '17十七', '18十八', '19十九', '20二十']
# 20
# 定义一个函数来填充单元格颜色
def fill_cell_color(ws, col, row, color):
cell = f'{col}{row}'
ws[cell].fill = openpyxl.styles.PatternFill(start_color=color, end_color=color, fill_type='solid')
# 遍历每一张表格
for sheet_name in wb.sheetnames:
# ws = wb_copy[sheet]
ws = wb_copy[sheet_name]
# 遍历 C 列所有单元格,如果满足条件则填充颜色
for row in range(2, ws.max_row + 1): # 从第二行开始遍历,因为第一行是标题行
cell_value = ws[f'E{row}'].value
# 第五、十、十五、二十周“快乐玩色彩”专用活动室
if cell_value is not None:
# 读取来的结果取第1-10个字符,10个字符中间有顿号,我希望以顿号切割
first_ten_chars = str(cell_value)[1:10]
print('1:'+first_ten_chars)
# 五、十、十五、二十
parts = first_ten_chars.split('、')
print(parts)
if cell_value:
for item in week2:
print('0:'+item)
# 无论01一、12十二、35三十五,都是从索引2开始提取)
chinese_part = item[2:]
# print(chinese_part)
if chinese_part in parts: # 检查 C 列的值是否包含 chinese_part
week_number = item[:2] # 提取数字部分并补零
print('1'+week_number)
if ws[f'B{row}'].value == f'第{week_number}周': # 检查 B 列的值是否匹配
# 假设 ws 是你的工作表对象,row 是你要填充的行号
# fill_cell_color(ws, 'B', row, 'FFFF00') # 黄色
for col in ['A', 'B', 'C', 'D', 'E']:
fill_cell_color(ws, col, row, 'FFFF00') # 黄色
break # 如果找到匹配项,跳出内层循环找到
# 删除第一张工作表“总表”
first_sheet = wb_copy.worksheets[0]
wb_copy.remove(first_sheet)
# 保存修改后的文件
wb_copy.save(copied_file)
print("操作完成!")