背景需求
8月13日就接到通知,园园通的新生导入了,需要分班(前几年都是20号才导入,23日才分班)

前期操作
1.转园区:分院班级转院到总园(如二分院小3-小6,整班转园区到总园,只能一个一个班级转,转后二分院为空,如一分院托1托2消失了,中1班整班转园区总园,只能一个一个班级转,转后一分院为空.在总园里面把所有班级升班,改成中1-6、大1-6

2,新建托小班,今年托班、小班的班级少(孩子越来越少了),就手动建。二分院建立小3-小6,一分院建立托 1-2,小1-2

因为园园通不允许幼儿园自己添加幼儿信息,虽然能把幼儿已有数据下载后,再匹配添加信息,但是无法批量上传。

所以前几年都是用uibot模拟人工操作,打开一个个孩子的词条,逐一编辑,
1.分班,选择显示的班级(不是按顺序排列的)

2.信息1:统一写法(无论籍贯和出生地,都写上海)
就读方式都选日托、户口性质都选非农、籍贯都选上海、健康状况选健康或良好、农业户口类型选城市、出生地上海、港澳台侨外选非港澳台侨

3、信息2:以下全部点“否”(独生子女、低保也全部选否,后续有需求再修改)
军烈子女、优抚子女、随迁子女、孤儿、残疾幼儿、独生子女、部队子女,低保,寄宿生),

4、人户一致(今年只有托班没有选择,两个点都是空,导致无法保存。其他年龄段无论正确都至少选了一个)

部分外省户籍地址不全,红色框,咨询班主任才补全
感悟:UIBOT时间很长,但是减轻人工操作的繁琐和错误率。(不过还是需要人工监控,因为有时候网页卡顿,UIBOT会报错停止或者持续性无效执行)
今年我想试试python模拟点击鼠标来分班
因为有师生个人信息,图片就不放了,只有代码,自己用
一、先用vlookup把园园通已经有的孩子名单与学校自己统计的点名单进行匹配,确定null所属的班级

筛选总园“中班、大班”插班生的分班
#
# 总园中大班插班生的分班(python模拟点击 火狐100%页面
# 20250814from openpyxl import load_workbook
import os,time
import pyautogui
import pyperclip
import re
import win32api
import win32con
import sys
import ctypes# 文件路径
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\信息不全幼儿'
file_path = path + r"\上海市闵行区XX幼儿园.xlsx"try:# 加载工作簿wb = load_workbook(filename=file_path, read_only=False)# 获取第一个工作表sheet = wb.worksheets[0]# 创建两个空列表分别存储D列和J列内容name = []classroom = []# 遍历所有行for row in sheet.iter_rows(values_only=True):# 检查J列(索引9)是否包含"中"或"大"if row[9] and ("中" in str(row[9]) or "大" in str(row[9])):# 将D列内容添加到namename.append(row[3])# 将J列内容添加到classroomclassroom.append(row[9])# 打印两个列表print("D列内容列表:")print(name)print("\nJ列内容列表:")print(classroom)except FileNotFoundError:print(f"错误:文件 {file_path} 未找到")
except Exception as e:print(f"发生错误: {str(e)}")
finally:# 确保关闭工作簿if 'wb' in locals():wb.close()# # 进入园园通页面num=7
def minimize_active_window():try:if sys.platform == 'win32':# 获取当前活动窗口的句柄hwnd = ctypes.windll.user32.GetForegroundWindow()# 最小化窗口ctypes.windll.user32.ShowWindow(hwnd, 6) # 6 对应 SW_MINIMIZEreturn Trueelse:print("此功能仅支持Windows系统")return Falseexcept Exception as e:print(f"最小化窗口时出错: {e}")return Falseprint("程序运行中...")
time.sleep(2) # 等待2秒,让你有时间切换到VS Code窗口# 尝试最小化活动窗口
if minimize_active_window():print("窗口已最小化")
else:print("无法最小化窗口")# 幼儿姓名
for i in range(len(name)): pyautogui.moveTo(535, 221)pyautogui.click() time.sleep(1)# 复制名字pyperclip.copy(name[i])# 黏贴图片地址pyautogui.hotkey('ctrl', 'v')time.sleep(1)# 查询 pyautogui.moveTo (1000, 218)pyautogui.click() time.sleep(1)# 编辑 pyautogui.moveTo (1466, 321)# pyautogui.moveTo(1569, 320)pyautogui.click() time.sleep(4)# 班级134562 # 如果等于中1,按1下,如果等于中3按2下,如果等于中4 按3下pyautogui.moveTo(1437, 614)pyautogui.click() time.sleep(1)# 定义按键规则:值 -> 按 down 次数press_rules = {'中1': 1,'中2': 6,'中3': 2,'中4': 3,'中5': 4,'中6': 5,'大1': 2,'大2': 6,'大3': 4,'大4': 5,'大5': 3,'大6': 1,}# # 延迟3秒让你切换窗口# print("3秒后开始按键,请切换到目标窗口...")# time.sleep(3)current_class = classroom[i]if current_class in press_rules:presses = press_rules[current_class]print(f"'{current_class}' 需要按 down {presses} 次")for _ in range(presses):pyautogui.press('down')time.sleep(0.1)pyautogui.press('enter')time.sleep(3)else:print(f"未找到班级 '{current_class}' 的按键规则")# 就读方式-日托pyautogui.moveTo (605, 648)pyautogui.click() time.sleep(1)pyautogui.press('down')time.sleep(1) pyautogui.press('enter')time.sleep(1)# 户口性质-非农pyautogui.moveTo(577, 718)pyautogui.click() time.sleep(1)for i in range(1):pyautogui.press('down')time.sleep(0.1) time.sleep(1) pyautogui.press('enter')time.sleep(1)# 籍贯-上海 16pyautogui.moveTo (588, 805)pyautogui.click() time.sleep(1)for i in range(16):pyautogui.press('down')time.sleep(0.1) time.sleep(0.5) pyautogui.press('enter')time.sleep(1)# 健康状况-健康或良好pyautogui.moveTo (1414, 690)pyautogui.click() time.sleep(1)for i in range(1):pyautogui.press('down')time.sleep(0.1) time.sleep(0.5) pyautogui.press('enter')time.sleep(1)# 非农户口类型-城市pyautogui.moveTo(1428, 728)pyautogui.click() time.sleep(1)for i in range(1):pyautogui.press('down')time.sleep(0.1) time.sleep(0.5) pyautogui.press('enter')time.sleep(1)# 出生地-上海pyautogui.moveTo (1438, 763)pyautogui.click() time.sleep(1)for i in range(16):pyautogui.press('down')time.sleep(0.1) time.sleep(0.5) pyautogui.press('enter')time.sleep(1)# 港澳台-非港澳台pyautogui.moveTo (1426, 809)pyautogui.click() time.sleep(1)for i in range(1):pyautogui.press('down')time.sleep(0.1) time.sleep(0.5) pyautogui.press('enter')time.sleep(1)# 留守儿童-非pyautogui.moveTo (1396, 851)pyautogui.click() time.sleep(1)for i in range(2):pyautogui.press('down')time.sleep(0.1) time.sleep(0.5) pyautogui.press('enter')time.sleep(1)# 模拟滚轮拖动# 模拟鼠标滚轮向下滚动10次for _ in range(10):pyautogui.scroll(-100) # 负数表示向下滚动time.sleep(0.1) # 每次滚动间隔0.1秒# 点击指定坐标的按钮# 左侧coordinates = [(565, 296), # 原(564,296)(565, 339), # 原(565,339)(565, 371), # 原(561,371)(565, 409), # 原(565,409)(565, 446) # 原(567,446)]# 遍历并点击每个坐标点for x, y in coordinates:pyautogui.click(x, y) # 点击指定坐标time.sleep(1) # 间隔1秒print("所有坐标点点击完成!")# 右侧coordinates = [(1414, 296), # 原(564,296)(1414, 339), # 原(565,339)(1414, 371), # 原(561,371)(1414, 409), # 原(565,409)]# 遍历并点击每个坐标点for x, y in coordinates:pyautogui.click(x, y) # 点击指定坐标time.sleep(1) # 间隔1秒print("所有坐标点点击完成!")# input('人工判断人户一致,按回车键继续...')# 全部人户选不一致pyautogui.click (1415, 675) # 点击指定坐标time.sleep(2) # 间隔1秒print("继续执行后续代码")# 保存提交pyautogui.click(1703, 980) # 点击指定坐标time.sleep(5) # 间隔1秒# 确定pyautogui.click(1294, 343) # 点击指定坐标time.sleep(5) # 间隔1秒
python不能像uibot,识别户籍地址文字和居住地址文字是否相同,所以这里我默认选择人户不一致

后期导出excle,用excel判断两个地址是否一致,筛选出不一致的地址和姓名,再次写代码调整。
分园的分班(因为小班有市级编号、托班没有,编辑按钮的位置不一样,加上2个园区,所以拆成3代码)
二分园小班
# 二分园四个小班新生分班 没有市级编号,编辑按钮靠左(python模拟点击 火狐100%页面
# 20250814from openpyxl import load_workbook
import os,time
import pyautogui
import pyperclip
import re
import win32api
import win32con
import sys
import ctyp