尧图精选

Excel与网页重复操作自动化:从工具选型到Python实战

🕒 发布时间:2026/10/2 15:13:48 📁 来源:尧图网络
你电脑里是不是也有这样一批“手工活”每天上班先把Excel打开复制一列单号切到网页系统里一个接一个地查状态查到结果再切回Excel填上去。几十行还好几百行的时候整个人就是一只人肉复制粘贴机器人。这类工作本质上就是“重复性操作Excel网页”说白了是在两套系统之间做数据搬运也是全天下最典型的自动化目标。这篇文想聊的就是遇到这类重复性操作怎么一步步把它交给程序去做以及选方案时怎么避坑。不管你是完全不懂代码的办公室文员还是刚接触Python的转岗选手这篇都能给你一条走得通的路线。1. 动手之前先判断你的任务属于哪一类1.1 重复性操作不止一种别对错号入座很多人一听说“自动化”就兴奋装了一堆工具最后没有一个用得对问题就出在没先搞清楚自己手上那个活到底是什么类型。以我自己的经验Excel和网页的重复性操作能分成三大类。第一类是“只在Excel内部折腾”合并十几个表格、清洗脏数据、把一列拆成三列、按条件统计求和、批量改格式。这类操作本质上没离开Excel解法也最便宜有时原生功能就够不需要写任何代码。第二类是“只在网页上折腾”批量填表单、批量查数据、批量下载文件、挨个点击页面翻页采集。这类操作跟Excel无关纯粹是浏览器里的机械化动作适合用网页自动化工具。第三类最磨人也是标题里那个“”真正想表达的——“Excel和网页之间来回搬运”从Excel里取一列数据去网页系统查结果再回到Excel把结果填上去。这类任务单看每一步都不难但循环几十上百次之后时间和出错率都让人崩溃。第三类也是本文的重点我会在第四章给出一套完整可复制的代码。所以拿到一个重复性操作先别急着打开教程问自己一句这个活的数据流是只在Excel里打转还是只跟网页打交道还是两边来回倒你的答案直接决定了该用什么工具。1.2 五大方案怎么选一张表讲清楚我见过的自动化方案五花八门但能稳定扛住日常办公需求的翻来覆去就这么几条路。一条一条说清楚你就能对号入座了。方案适合谁上手难度典型场景主要注意点Excel原生功能 Power Query零基础只想快点把活干完极低多表合并、拆分列、清洗数据只能处理Excel内部的事VBA宏会用Excel但不熟代码的办公人员低格式调整、简单批量计算只能在Windows带宏的Excel里跑Pythonopenpyxl / pandas愿意装Python环境的数据处理者中批量读写、汇总统计、报表生成需要处理依赖和编码问题Selenium / Playwright会点Python想搞定网页自动化中高网页填表、查询、下载要处理登录态、元素等待、反爬RPA工具影刀、UiBot不想写代码的业务人员中Excel 网页混合流程鼠标坐标点击太脆弱优先用控件识别我自己给新人的建议一直是四个字能白嫖就白嫖。如果你的任务属于第一类先花半天研究Power Query学会了就是终身受用别一上来就装Python写pandas。经常需要操作网页的直接学Playwright比Selenium少踩很多坑。至于混合流程又完全不想碰代码的RPA工具是真正的救星只是别把流程录得太死后面我会细说。2. Excel重复操作先从能白嫖的方案下手2.1 原生功能和Power Query是真正的性价比之王先把最高性价比的方案放在最前面。很多Excel里的“重复性操作”其实根本不需要自动化工具原生功能就能搞定只是很多人不知道而已。我举几个最常见的例子。两列数据要合并成一列并加上分隔符不用写公式在第一行手动输入“张三-北京”然后按CtrlEExcel会自动推断规律给你填充整列这叫快速填充。日期的年月日混在一起要拆开选中数据用“数据→分列”选好分隔符或固定宽度一次性拆完。“查找和替换”也是被低估的大杀器批量替换错别字、统一格式、清洗空格都比写代码快得多。还有一个小技巧我几乎天天用选中一列数据按CtrlG调出“定位条件”选“空值”就能一次性选中所有空白单元格再输入内容按CtrlEnter所有空格同时填好。这个操作在“补齐名单里的缺省部门”这种场景下比任何脚本都省事。如果你的数据量到了“从几十个Excel里整理出一张总表”的程度那就该上Power Query了。路径是数据 → 获取数据 → 从文件 → 从文件夹。选定文件夹后Power Query会把里面所有Excel的表读进来你可以在查询编辑器里统一删列、改表头、替换错误值、追加合并整个清洗链路会被记录下来。下次有新的Excel放进这个文件夹只需要点一下“刷新”结果表自动更新。这个功能相当于“录制了一套清洗流程”但完全零代码非常值得花一天学透。2.2 VBA录制宏入门很快但别被它绑架如果你需要在Excel里做的重复操作涉及“格式处理”和“固定流程”比如每周把同一份报表调成指定样式、把多个工作簿的特定区域复制到汇总表那么VBA可能是最快的解法。方法也简单开发工具 → 录制宏 → 手动操作一遍 → 停止录制。代码已经生成了你只需要学会在VBA编辑器里改循环范围就能把刚才的手工操作重复执行N遍。但我必须提醒三件坑事。第一VBA宏只适合“你自己电脑上、偶尔跑一次”的场景换一台电脑、换个Excel版本宏可能就废了。第二含宏的.xlsm文件经常被公司的安全策略拦下来你能看到“Excel加载项被禁用”这样的提示那多半就是加载项被策略禁了。第三数据量上了几十万行VBA的数组处理会明显变慢这时候不如用Python。所以我的判断标准是VBA适合格式型操作Python适合数据型操作。如果你的活涉及“按条件计算、透视汇总、生成新表”直接跳过VBA学Python不要花时间在宏上。2.3 用Python处理Excelopenpyxl和pandas怎么分工Python读写Excel有两个主力库很多人搞不清它们的区别。我这么说吧openpyxl是“操作Excel细胞”的工具适合读读写写单个单元格、保留原有表格的行列结构pandas是“操作数据表”的工具适合做分组、汇总、透视这类分析。实际项目里经常两个配合用但入门阶段先学会openpyxl的读写就够解决八成问题了。openpyxl最核心的几行代码长这样from openpyxl import load_workbook # 读取工作簿默认data_onlyFalse拿到的是公式字符串 wb load_workbook(订单.xlsx) ws wb.active # 遍历第2行到最后一行的第1列 for row in range(2, ws.max_row 1): cell_value ws.cell(row, 1).value print(cell_value) # 在C列写值并另存为新文件 ws.cell(2, 3).value 已完成 wb.save(订单_结果.xlsx)这里有一个新手必踩的坑load_workbook如果不加data_onlyTrue读到的是公式本身比如SUM(A1:A10)而不是计算后的值。但加了data_onlyTrue能读到值的前提是这个文件被Excel打开保存过缓存里才有值。如果是程序生成的、从没被Excel开过的文件data_onlyTrue读出来全是None。碰到这种情况要么用代码里的另一个库重新算要么先用Excel打开一下再保存。如果你的需求是“把一列按另一列汇总”比如按姓名统计金额合计这时候就别用openpyxl一个个迭代了效率太低。pandas一行就够import pandas as pd df pd.read_excel(流水.xlsx) result df.groupby(姓名, as_indexFalse)[金额].sum() result.to_excel(汇总.xlsx, indexFalse)read_excel需要指定引擎通常默认openpyxl就行。数据量越大pandas的优势越明显几万行的表对它来说是小意思。但要注意to_excel写出来的文件是全新生成的任何原表里的格式都不会保留如果你的下游只认某种模板样式那还是得靠openpyxl在原有文件上改。3. 网页重复操作Selenium还是Playwright还是RPA3.1 先想清楚网页自动化最难的三个环节网页自动化表面上是“让程序帮你点击”但真正难的不是点而是三个绕不开的环节登录态、动态加载、反自动化策略。这三个坑不解决脚本跑起来就是东倒西歪。登录态是最烦人的。很多业务系统需要扫码或验证码登录程序没法自动扫码。我的解决办法是让浏览器记住登录状态。Selenium启动的时候可以用user-data-dir参数挂载一个你手动登录过的浏览器目录这样每次启动都是已登录状态省掉扫码。Playwright更简单直接用playwright codegen导出的脚本会保留浏览器上下文登录后把storage_state存下来下次直接加载。动态加载则是另一个大头。现在的网站大量使用AJAX你打开页面时表格还是空的数据是JS异步加载进来的。如果程序打开页面后立刻去找元素大概率找不到。解决的核心不是多等几秒而是用“显式等待”——明确告诉程序等某个元素出现在页面上再执行下一步。这个后面代码部分会详细讲。反自动化策略主要表现是操作频率太高被网站风控盯上弹验证码或者直接拒绝服务。应对思路很朴素批量任务里加随机延迟别用固定间隔操作节奏模拟真人但不要做得太假。遇到真验证码别硬破解设计一个“程序弹窗提示人工输入验证码”的交互人工输完程序继续这才是合规且稳的做法。3.2 Selenium实战从安装到跑通一个查询我先说Selenium虽然它比Playwright老但网上资料最多、生态最成熟适合入门。安装分两步pip install selenium然后下载跟你本地Chrome版本对应的chromedriver放在任意目录并记住路径。下面这段代码是Selenium最经典的操作流程打开网页、输入内容、点击按钮、等待结果、读取结果。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver webdriver.Chrome() driver.get(http://your-system.com/query) # 显式等待等输入框出现再输入 input_box WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, orderNo)) ) input_box.clear() input_box.send_keys(20240001) # 点击查询按钮 driver.find_element(By.ID, searchBtn).click() # 等结果元素出现再取它的文本 result WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, result)) ).text print(result) driver.quit()为什么我坚持用WebDriverWait而不是time.sleep(3)因为固定等待要么等太久慢要么等不够挂。显式等待是“等到条件满足才继续”页面加载快就快跑加载慢就多等到上限了再报错。这个习惯是网页自动化稳定性的分水岭建议从第一天就养成。另外注意每次输入前先clear()否则上一次输入的内容还残留在框里会导致查询结果错乱——这个坑我帮很多人排查过。3.3 RPA和浏览器插件不懂代码的人怎么自救如果你完全不想写代码RPA工具是救星。影刀RPA、UiBot这类工具的基本逻辑是你在界面上录制一遍Excel操作和网页操作工具会把鼠标键盘动作记录下来之后就能自动重放。它们还自带“Excel读取”“网页元素识别”等封装好的组件拼接流程就像搭积木。但我必须泼一盆冷水RPA录制出来的流程很脆。尤其是“鼠标坐标点击”窗口一移动、分辨率一变、网页改版一换流程立刻废掉。所以使用RPA的第一原则是能用“元素识别”就绝不用坐标。大部分工具都支持在录制时指定“窗口控件”或“网页元素”你要选那些跟位置无关的绑定方式。另一个轻量级方案是浏览器插件。比如Tempermonkey油猴脚本懂一点JavaScript的话可以在目标网页里直接注入脚本自动填表单、自动点击、自动下载效率极高。适合那种“固定网站、固定操作、天天都要做”的场景。缺点是网页一旦改版脚本也得跟着改需要有一定前端知识。还有一类人我建议直接用浏览器自带能力只是登录重复的话密码管家插件自动填充用户名密码就够了连脚本都不用写。别把自动化的范围扩大到自己维护不起的程度这句话是真心话。4. 完整实战从Excel批量读取到网页查询再把结果写回4.1 场景还原这就是最典型的“Excel网页”重复性操作理论说了一堆来一个我能直接抄作业的完整案例。假设你手上有一份几百行的订单表A列是订单号B列是客户名C列需要填入“订单状态”而这个状态只能去公司后台系统一个个查。人工流程是Excel复制一个单号 → 切到网页系统 → 粘进搜索框 → 点查询 → 复制状态 → 切回Excel → 填进C列。一行最快20秒300行就是1.5小时中间稍微一走神状态还填错行。自动化流程则是程序自动读A列的单号 → 逐个到网页查询 → 把结果填进C列 → 另存为一个新文件。全程不用人管300行数据几分钟跑完。值得自动化是因为这个任务满足三个条件频率高我每周都要做、规则固定查询逻辑完全一样、出错代价低干错最多重跑。如果一件事三天才做一次又涉及一堆让人拿不准的异常分支那自动化反而可能比手工更慢。4.2 完整代码与逐段拆解这段代码直接用openpyxl Selenium组合实现。注释我已经写得很细你复制后改一下选择器就能用。import time from openpyxl import load_workbook from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # ---------- 1. 读取Excel中的待查询数据 ---------- wb load_workbook(待查询订单.xlsx) ws wb.active # 记录每个单号对应的行号后面写回结果要用 orders [] for row in range(2, ws.max_row 1): order_no ws.cell(row, 1).value if order_no: orders.append((row, str(order_no).strip())) # ---------- 2. 启动浏览器并手动完成登录只做一次 ---------- driver webdriver.Chrome() driver.get(http://your-system.com/login) input(登录完成后按回车继续...) # 程序暂停你手动登录完回到终端按回车 # ---------- 3. 循环查询并把结果写回Excel ---------- for index, (row, order_no) in enumerate(orders): try: # 每次都用显式等待输入框出现避免页面没加载完就操作 search_input WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, searchBox)) ) search_input.clear() search_input.send_keys(order_no) driver.find_element(By.ID, searchBtn).click() # 等结果元素出现读取文本 status WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, result-status)) ).text ws.cell(row, 3).value status print(f第{index1}/{len(orders)}条单号 {order_no} 状态{status}) except Exception as e: ws.cell(row, 3).value f查询失败:{e} driver.save_screenshot(ferror_{order_no}.png) print(f单号 {order_no} 查询失败已截图) # 每个单号之间随机停一下降低对目标系统的压力 time.sleep(1 index % 3) # ---------- 4. 保存结果到新文件避免覆盖原始数据 ---------- wb.save(待查询订单_结果.xlsx) driver.quit()这段代码里几个设计上的心思我解释一下。用openpyxl而不是pandas来读写是为了保留原始Excel的格式和行号对应关系。pandas读进来是全新的DataFrame写回去是一张新表行号、列宽、颜色全丢。用openpyxl在原来的工作簿上操作填完C列保存其他所有内容原封不动。每次查询失败不直接崩溃而是在那一行写上“查询失败”并截图存档。这个设计在长时间运行时太关键了几百条数据跑到第287条出问题程序不该从头再来而是跳过、记录、继续。跑完以后打开结果文件对着截图一眼就知道哪几条要人工补一下。最后强调三个运行前置条件先备份原始Excel文件、先用三五条数据跑通、确保目标Excel没被你自己打开。最后一条很多人忽略openpyxl保存时如果目标文件正被Excel打开会直接报权限错误。保险起见程序里保存的是_结果.xlsx新文件跟原文件分开这个问题就不存在了。4.3 大批量运行时的资源与异常兜底数据量超过两三百条以后有几个工程问题会浮现出来。第一个是自动化的“断点续跑”问题。程序跑了半小时中间网断了、报错了怎么办从头再来一遍太蠢。我在代码里没写但实际项目里建议加一个“进度标记列”在D列或E列写一个“已处理”状态程序每次启动时先扫一遍跳过那些已经有标记的行。这样不管中断多少次重新启动就能从断点继续。第二个是“对目标系统的礼貌”问题。一个查询接口如果被几百毫秒一次的频率疯狂调用很容易被风控盯上。不难理解一个正常人类怎么可能每秒操作一次网页所以批量场景里一定要加随机睡眠甚至可以把总量拆成几批每批之间隔个几分钟。这既保护了目标系统也保护了你的脚本寿命。第三个是运行时的可视化和监控。命令行print进度是最朴素的方案我一直在用。跑起来后每隔几十条看一次终端确认进度在走、没有连续报错然后该干嘛干嘛。真出了问题终端日志和异常截图是排查的第一手材料。5. 高频问题排查与避坑清单按真实出现频率排序5.1 和Excel有关的那几个老问题Excel本身的问题看着小但每一个都能让自动化断在半路我按踩坑频率整理了一份速查表。现象常见原因处理办法Excel加载项被禁用安全策略或加载项冲突文件 → 选项 → 加载项 → 管理COM加载项 → 勾选启用或把目录加入受信任位置CtrlV失效剪贴板被其他程序占用、输入法冲突、Excel处于编辑模式重启Excel、清空剪贴板历史、关闭第三方剪贴板增强工具openpyxl保存后格式丢失openpyxl不保留图表/复杂样式需要严格保格式的场景改用win32com调用本地Excel或直接写VBA公式列读出来是Noneload_workbook没开data_onlyTrue且文件没有Excel公式缓存值读取时指定data_onlyTrue还是None就先用Excel打开再保存一次5.2 网页自动化最常见的三个报错网页自动化跑了半天最常见的三个报错我一个个说清楚。NoSuchElementException元素没找到。多半是页面还没加载完就去找元素了或者这个元素在iframe里。排查顺序把显式等待时间加长检查页面前面是否有iframe有的话先driver.switch_to.frame(...)再找元素。别急着怀疑选择器写错了先确认元素在不在。ElementNotInteractableException元素找到了但没法点击。常见原因是元素被遮住、还没完全渲染、或者是个隐藏弹层里的按钮。解法是先把页面滚动到元素位置再用element_to_be_clickable条件代替presence_of_element_located后者只管元素存在不管能不能点。莫名其妙的登录失效跑着跑着突然跳回登录页。基本是Cookie过期了或者浏览器上下文被清理了。解决办法就是我在第三章说的用固定的user-data-dir挂载已登录的浏览器目录程序每次都用同一个身份启动这个问题基本绝迹。5.3 组合场景里你没注意到的细节组合场景Excel网页写回有几个“单独跑都正常、合起来就出问题”的细节我在这里一次性交代完。Excel文件占用问题前面说过保存前必须确保目标文件没被Excel打开。解决方案是程序保存为带_结果后缀的新文件从根上避雷。循环里写回的数据错行是另一个高频问题。根因多半是Excel表格中间有隐藏行、筛选状态没取消或者max_row算出来的行数和实际数据对不上。应对办法读取时不要盲目从头循环到尾先检查第一列是否为空值为空就跳过。查询结果为空很多情况下不是真的没结果而是输入框没清空。Selenium里clear()清不掉某些框架预填的数据你可以多清一次或直接用CtrlA全选再删除。还有一种更阴间的网页输入框自带“查询历史下拉”把你要输入的文本覆盖掉了这种就要在输入后主动按一下回车或点击页面空白处。最后说说异常链。程序跑批时任何一个单号出问题你都会面临一个选择是继续还是停下。我的经验是批量任务默认“记录异常并继续”因为一个网页元素偶发抽风太常见了但如果连续失败超过一定条数比如5条就强制停因为大概率是系统层面出问题了再跑下去只会产生一堆垃圾数据。这个“连续失败阈值”逻辑是脚本稳定性的最后一道防线。最后分享一点个人的真实体会我做自动化这么多年判断一个重复性操作值不值得自动化的标准一直很朴素一件事要做第二遍的时候就开始琢磨有没有办法让电脑做要是做第三遍还没自动化那就是我自己在偷懒。但自动化也不是越复杂越好能用Excel原生功能白嫖的就别写代码能用三行代码解决的就别写三十行能用RPA快速录完的就别学Selenium。工具永远是手段把时间省下来才是目的。希望这篇能帮你把那些最无聊的复制粘贴真正交还给程序。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →