
Excel的公式
去掉闵行区的“街道居委会”(区和)之间删除)
=IFERROR(LEFT(AB2,FIND("区",AB2)) & MID(AB2,FIND(")",AB2, FIND("区",AB2))+1,999),AB2)
去掉上海闵行的“区 弄”重复的
=IFERROR(LEFT(AD2,FIND("区",AD2))&MID(MID(AD2,FIND("区",AD2)+1,999),FIND("弄",MID(AD2,FIND("区",AD2)+1,999))+1,999),AD2)
一、背景需求
过去几年,我下载园园通的幼儿信息、地址、发现地址总是特别长——包含了上海市(省)、上海市(市)、闵行区(区)、街道(XXX街道)、居委(XXX居委会(X一居委))、路、弄、号、名。
之前用Python提取正则,去除重复的文字


以上用Python去重,但是只是在下载的Excel里面制作,没有重新改变园园通里的地址格式。三
二、手工去除长地址
本次我想从园园通下载中班的户籍地址和居住地址,然后在Excel里用公式或手动删除方式把所有地址变成规范地址“省市区路弄号”,(去重、补全省市区)
(一)园园通,中班幼儿信息下载


多年来,中大班园园通的幼儿地址,最大的问题就的“居住地址”太长了,因为它把左侧的“省市区街道居委”+路弄号室都包含了。导出后

(二)数据处理
1.现居地址
筛选排序(降序)——都是超长地址

所以我们要批量去掉所有的居委会,去掉两个“上海市”

去掉街道

没有闵行区
![]()

人工补“室”
![]()

补了12个室,发现一个没写全地址的
![]()


把区和)之间的的内容删除


#这是EXCEL
=IFERROR(LEFT(AH2,FIND("区",AH)) & MID(A1,FIND(")",AH2, FIND("区",AH2))+1,999),AH2)


发现“路和弄”出现了两次,需要删除一次






我还是用第一种
#EXCEL
=LEFT(A1,FIND("区",A1))&MID(MID(A1,FIND("区",A1)+1,999),FIND("弄",MID(A1,FIND("区",A1)+1,999))+1,999)
把A1替换成AH2(从第2行开始)









人工筛选参照原始地址,筛选,添补,缩减。把所有地址弄得差不多长(本园附近的地址都是差不多结构“上海市闵行区XX路XX弄XX号X室)

2.修改户籍地址(大量外省市的)

先用刚才的方法处理上海市闵行区的内容

先复制一份到右侧,以免搞错了数据
居右排列,补“室"

删除两个“上海市”


删除街道

删除“区”和“)”之间的数据(这个括号要复制里面的括号,有大小写不同)
=IFERROR(LEFT(A1,FIND("区",A1)) & MID(A1,FIND(")",A1, FIND("区",A1))+1,999),A1)


=IFERROR(LEFT(AB8,FIND("区",AB8)) & MID(AB8,FIND(")",AB8, FIND("区",AB8))+1,999),AB8)
只有上海闵行的地区里面的(街道(居委))被去掉了

去掉上海里面的重复的内容,但是要手动添补
=LEFT(AC2,FIND("区",AC2))&MID(MID(AC2,FIND("区",AC2)+1,999),FIND("弄",MID(AC2,FIND("区",AC2)+1,999))+1,999)
只有部分上海市闵行区的





上海所有区的地址都手动修改了

外省市地址是 省市重复



我问豆包要了集中代码,但是都没有删除“省市区县”的重复,最后还是手动
说不清楚,有些是重复的,有些就是正好,

发现一组规律:前面三个正好是之前按钮选择“省市区”,后面两个是家长填写的户口地址“只有省和区”,不包含“市”(可能户口本上的地址就是这样写的)


有的家长户口本上包含了省市区,所以就写全了


手动删减后

把短地址放到AA列,文本'值”黏贴

一共142,预设每次35人,分4次

由此,中班幼儿的户籍地址和居住地址都改成标准地址了
三、代码运行
用新地址(短地址)替换园园通里的(长地址)
火狐浏览器100%

'''
园园通中班孩子 两个地址补全(省市区)再次写入园园通。
火狐浏览器,必须100%
为防止园园通变慢,30-40人一组。完成后关闭园园通,再次开启
豆包,阿夏
20260819
'''
import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw
# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
win = vscode_wins[0]
# 自动最小化VSCode
win.minimize()
print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
time.sleep(5) # 等待5秒给你放鼠标
import random
# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
t = random.uniform(2, 3)
time.sleep(t)
file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260819中班幼儿地址补全.xlsx"
wb = openpyxl.load_workbook(file_path)
# 读取表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
# for row in ws.iter_rows(min_row=51, values_only=True): # 从第二行开始读取姓名
# for row in ws.iter_rows(min_row=2, max_row=36, values_only=True): # 做测试第一组人员,防止园园通卡通。 36=杨
# for row in ws.iter_rows(min_row=36, max_row=67, values_only=True): # 做测试第2组人员,防止园园通卡通。36还是杨, 67=汪 要从68开始+35 68刘
# for row in ws.iter_rows(min_row=68, max_row=103, values_only=True): # 第3组
# for row in ws.iter_rows(min_row=104, max_row=141, values_only=True): #第4组
for row in ws.iter_rows(min_row=142, max_row=142, values_only=True): #第4组
# for row in ws.iter_rows(min_row=21, values_only=True): # 如果出问题,断了,从第X行读取孩子姓名
name = row[2] # 姓名3
Registered_Address = row[26] # 户口地址27
Residential_Address = row[34] # 居住地址35
# print(name,Residential_Address)
# 点击姓名栏,
pyautogui.click(861,376)
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(name)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 搜索
pyautogui.click(758,497)
rand_sleep()
# 编辑
pyautogui.click(1652,671)
time.sleep(3)
# 模拟滚动到底部
pyautogui.click(1652,671)
for _ in range(2):
pyautogui.scroll(-1000)
rand_sleep()
# time.sleep(0.3) # 每滚轮一下间隔0.3秒
# 户籍地址点击三次
for i in range(3):
pyautogui.click(1404,473)
rand_sleep()
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(Registered_Address)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 居住地址点击三次
for i in range(3):
pyautogui.click(1173,771)
rand_sleep()
# 1. 复制指定文字到剪贴板
# print('写入姓名:',name)
pyperclip.copy(Residential_Address)
# 2. 模拟Ctrl+V粘贴
pyautogui.hotkey("ctrl", "v")
rand_sleep() # 延迟2秒切换窗口
# 下移到底部
for _ in range(1):
pyautogui.scroll(-1000)
rand_sleep()
# 确认,回到最初的界面
pyautogui.click(1027,857)
time.sleep(6) # 保存时间长一点
# 自动最大化VSCode
win.maximize()
print("VSCode已自动最大化,程序结束")
园园通运行时间久了,就会卡顿,所以我把142人拆分成4组,每组35人左右,运行了五次

每一次35人运行大约平均18分钟。
运行过程中拍的照片




四、验证成果
(一)再次下载园园通中班幼儿数据



(二)地址列,做升序检查
户口地址升序-格式非常统一


还是有“漏网之鱼”,数量较少,在园园通里人工修改

中班就完工了。
五、制作大班双地址优化
同理制作大班,也是超长地址
(一)下载园园通 大班幼儿的所有数据


(二)隐藏不需要的列,保留姓名,户籍地址、现居地址,也是超长地址

(三)修改现居地址

=IFERROR(LEFT(A1,FIND("区",A1)) & MID(A1,FIND(")",A1, FIND("区",A1))+1,999),A1)









同样方式做户籍地址,先升序。
![]()
右侧插入空列
=IFERROR(LEFT(AA2,FIND("区",AA2)) & MID(AA2,FIND(")",AA2, FIND("区",AA2))+1,999),AA2)


只有地址变成“值”,才能进行内容替换,才能被其他单元格援引数据。

去掉居委会居右,补“室”

右侧插入空列
=IFERROR(LEFT(AB2,FIND("区",AB2))&MID(MID(AB2,FIND("区",AB2)+1,999),FIND("弄",MID(AB2,FIND("区",AB2)+1,999))+1,999),AB2)


上海其他区域地址,人工批量

把整列贴成“值”


上海的其他区县的*街道 居委(都是其他)”要手动删除
外省户籍,也是两款,
![]()

(四)户籍地址修改
外省地址需要手动修改。如果识别出原理,应该也能用公式制作,现在还做不出来。



(五)大班双地址(短地址)也要在园园通内修改掉
一共157人,按40人一组,分4次生成

'''
园园通中班孩子 两个地址补全(省市区)再次写入园园通。
火狐浏览器,必须100%
为防止园园通变慢,30-40人一组。完成后关闭园园通,再次开启
豆包,阿夏
20260819
'''
import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw
# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
win = vscode_wins[0]
# 自动最小化VSCode
win.minimize()
print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
time.sleep(5) # 等待5秒给你放鼠标
import random
# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
t = random.uniform(2, 3)
time.sleep(t)
file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260819大班幼儿地址补全.xlsx"
wb = openpyxl.load_workbook(file_path)
# 读取表格
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
# for row in ws.iter_rows(min_row=51, values_only=True): # 从第二行开始读取姓名
for row in ws.iter_rows(min_row=2, max_row=42, values_only=True): # 做测试第一组人员,防止园园通卡通。 36=杨
# for row in ws.iter_rows(min_row=43, max_row=83, values_only=True): # 做测试第2组人员,防止园园通卡通。36还是杨, 67=汪 要从68开始+35 68刘
# for row in ws.iter_rows(min_row=84, max_row=124, values_only=True): # 第3组
# for row in ws.iter_rows(min_row=125, max_row=159, values_only=True): #第4组
# for row in ws.iter_rows(min_row=21, values_only=True): # 如果出问题,断了,从第X行读取孩子姓名
name = row[2] # 姓名3
Registered_Address = row[26] # 户口地址27
Residential_Address = row[33] # 居住地址34
print(name,Residential_Address)
# # 点击姓名栏,
# pyautogui.click(861,376)
# # 1. 复制指定文字到剪贴板
# # print('写入姓名:',name)
# pyperclip.copy(name)
# # 2. 模拟Ctrl+V粘贴
# pyautogui.hotkey("ctrl", "v")
# rand_sleep() # 延迟2秒切换窗口
# # 搜索
# pyautogui.click(758,497)
# rand_sleep()
# # 编辑
# pyautogui.click(1652,671)
# time.sleep(3)
# # 模拟滚动到底部
# pyautogui.click(1652,671)
# for _ in range(2):
# pyautogui.scroll(-1000)
# rand_sleep()
# # time.sleep(0.3) # 每滚轮一下间隔0.3秒
# # 户籍地址点击三次
# for i in range(3):
# pyautogui.click(1404,473)
# rand_sleep()
# # 1. 复制指定文字到剪贴板
# # print('写入姓名:',name)
# pyperclip.copy(Registered_Address)
# # 2. 模拟Ctrl+V粘贴
# pyautogui.hotkey("ctrl", "v")
# rand_sleep() # 延迟2秒切换窗口
# # 居住地址点击三次
# for i in range(3):
# pyautogui.click(1173,771)
# rand_sleep()
# # 1. 复制指定文字到剪贴板
# # print('写入姓名:',name)
# pyperclip.copy(Residential_Address)
# # 2. 模拟Ctrl+V粘贴
# pyautogui.hotkey("ctrl", "v")
# rand_sleep() # 延迟2秒切换窗口
# # 下移到底部
# for _ in range(1):
# pyautogui.scroll(-1000)
# rand_sleep()
# # 确认,回到最初的界面
# pyautogui.click(1027,857)
# time.sleep(6) # 保存时间长一点
# # 自动最大化VSCode
# win.maximize()
# print("VSCode已自动最大化,程序结束")
(六)验证有没有遗漏
因为没法单独把中班和大班一起挑出来,所以我下载全部孩子的地址


先查看居住地,地址长度统一

这个地址补全,应该是XXX路210弄(不是小区名称)



再看户籍地址,有缺失
![]()
![]()
少一个市
![]()
![]()

筛选一遍以后再园园通里修改,
(七)第二次下载全园幼儿数据
然后再次下载全园的rar进行筛查。总会发现一些问题
三个孩子一个户籍,原来是公共户口



&spm=1001.2101.3001.5002&articleId=163880207&d=1&t=3&u=92b6eedad4404a5e9b9e71547b7589c4)
1万+

被折叠的 条评论
为什么被折叠?



