背景需求:
保健老师打了两个语音电话,需求是:利用园园通下载托、小新生的所有数据,然后拆分成一个个班级的xlsx名单,发给新生班主任,班主任填写“儿童基本情况登记表”,发给保健老师。
因为还有十几位孩子8月新生数据没有进入园园通,所以我没有全部的数据,因此准备明天(26日)再登陆网页,看看数据完整情况。
但是下午,我想到之前有新插班生的人工填写上报数据(园园通不能园所自主添加孩子,都是上级把数据导入系统)。我完全可以把下载的园园通幼儿信息与手动填写数据合并。新生人数就满了(小班都是25人,6个班都满员了)
分析发现:
1、已有信息:
这张表姓名、性别、身份证号、出生年月、现居住地址(家庭地址)、家长姓名、手机号。都是可以直接从园园通下载的EXCEL里面找到相应的列。
2、学号:
园园通没有办法输入学号,所以下载excel中孩子有班级无学号,
所以根据”姓名“与“班级信息表(含有学号和姓名的点名册)”进行vlookup匹配。
3、户籍所在地(✔判断):
下载的园园通表格只有“户口省市、城市、地区”
所以需要根据”户口所在地区”判断
(1)如果是闵行区,就在"本区”勾选
(2)如果是上海其他区,就在“外区”勾选
'黄浦区', '徐汇区', '长宁区', '静安区', '普陀区', '虹口区', '杨浦区',
'浦东新区', '宝山区', '嘉定区', '金山区', '松江区', '青浦区', '奉贤区', '崇明区'
如果“户口所在身份”非上海市”,就在“外地”勾选
思考完成后,开始具体操作
实现步骤:
1、园园通下载已有的新生名单,托班、小班新生正好在一分院、二分院
下载两个园区的所有新生名单
样式标题是
开始正式代码:
思路:
1:园园通下载的两个园区的新生名单
2:合并两个名单变成一个名单+手动补充插班生名单。
3:把带有学号的22个班级工作表的“班级信息表,放到这个文件夹里
4:匹配”班级信息表“和”园园通托小班信息合并“两个表中的姓名,把学号添加到”园园通托小班信息合并“的最左侧。获得匹配学号的xlsx
5:读取"匹配学号的xlsx"所有列和“2025学年出入园儿童基本信息表”,按照班级学号,把指定的信息写入“2025年表”,另存到(托小)2025的文件夹里。
6:因为现居住地址(都是闵行区)的长度太长,尝试去除重复的文字,缩减地址(少量重复词删除,居委会删除不了),可能考虑添加固定词组进行检索)本次还是老师手动删减
2.把两份xlsx合并在一起。
'''
20250825_2025_学年出入所(园)儿童基本情况登记 表一空 01
1、下载园园通新生名册.xls,把两个新生名册合并在一起
2、部分插班生信息手动添加
deepseek,阿夏
20250827
'''
import pandas as pd
import os
import re
def merge_and_format_excel():
# 定义文件路径
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\_2025_学年出入所(园)儿童基本情况登记 表一空'
folder_path = path + r"\园园通下载"
output_path = path + r'\园园通托小班信息合并.xlsx'
# 获取文件夹中的所有Excel文件
excel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xlsx', '.xls'))]
if len(excel_files) < 2:
print("234文件夹中Excel文件数量不足2个")
return
# 读取所有Excel文件
dfs = []
for file in excel_files[:2]: # 只处理前两个文件
file_path = os.path.join(folder_path, file)
df = pd.read_excel(file_path)
dfs.append(df)
print(f"已读取文件: {file}")
# 合并数据
merged_df = pd.concat(dfs, ignore_index=True)
# 格式化班级列(处理所有班级类型)
def format_class_name(class_name):
if pd.isna(class_name):
return class_name
class_str = str(class_name)
# 定义班级类型和对应的前缀
class_types = {
'托班': '托', '托': '托',
'小班': '小', '小': '小',
'中班': '中', '中': '中',
'大班': '大', '大': '大'
}
# 中文数字到阿拉伯数字的映射
chinese_to_arabic = {
'一': '1', '二': '2', '三': '3', '四': '4', '五': '5',
'六': '6', '七': '7', '八': '8', '九': '9', '十': '10',
'1': '1', '2': '2', '3': '3', '4': '4', '5': '5',
'6': '6', '7': '7', '8': '8', '9': '9', '10': '10'
}
# 尝试匹配各种班级格式
patterns = [
r'([托小中大])班(\S+?)班', # 如:大班一班
r'([托小中大])(\S+?)班', # 如:大一班
r'(\S+?)([托小中大])班', # 如:一班大班
r'([托小中大])班', # 如:大班(没有具体班号)
]
for pattern in patterns:
match = re.search(pattern, class_str)
if match:
if len(match.groups()) >= 2:
# 有班级类型和班号
class_type = match.group(1)
class_num = match.group(2)
# 获取班级前缀
prefix = class_types.get(class_type, class_type)
# 转换班号
if class_num in chinese_to_arabic:
num = chinese_to_arabic[class_num]
return f"{prefix}{num}班"
else:
return f"{prefix}{class_num}班"
else:
# 只有班级类型,没有班号
class_type = match.group(1)
prefix = class_types.get(class_type, class_type)
return f"{prefix}班"
# 如果没有匹配到任何模式,返回原值
return class_str
# 查找包含班级信息的列
class_columns = [col for col in merged_df.columns if any(keyword in col for keyword in ['班', 'class', '班级'])]
if class_columns:
for class_col in class_columns:
print(f"检测到班级列: {class_col}")
merged_df[class_col] = merged_df[class_col].apply(format_class_name)
else:
print("未检测到班级列,跳过格式转换")
# 保存合并后的文件
merged_df.to_excel(output_path, index=False)
print(f"文件已保存至: {output_path}")
print(f"合并完成,共{len(merged_df)}条记录")
# 显示一些样本数据以供验证
print("\n前5条数据的班级信息:")
if class_columns:
for class_col in class_columns:
print(f"{class_col}列的前5个值:")
print(merged_df[class_col].head().tolist())
# 执行函数
if __name__ == "