尧图精选

Python脚本实战:让Excel和网页重复操作全自动

🕒 发布时间:2026/10/1 17:50:41 📁 来源:尧图网络
先泼一盆冷水Excel 里那些 CtrlC、CtrlV、下拉填充浏览器里那些登录、查数据、导出、下载你每天重复的“低技术含量”动作恰恰是效率黑洞。技能再高也架不住一周有三天在手工维护报表。这篇东西专门聊聊怎么把“Excel 和网页里的重复操作”打包成脚本让它自己跑完你下班。我默认你是办公室人群里“最懂工具”的那类人会用 VLOOKUP、会录制宏、diss 过别人用空格对齐数据但还没系统写过一次脚本。无关职务和行业只要你的工作场景里出现“每天”“每周”“批量”“导出再加工”这些词这篇文章就能用上。先说清楚文章的结构会先带你看懂你的重复操作属于哪一类避免选错工具然后是实战环节给你一个完整的“网页导出报表 Excel 清洗合并 结果回填”案例配可直接跑的代码最后是高频故障速查和我的踩坑记录。1. 先搞清楚你到底在重复什么大部分人会犯一个错误听到“自动化”就往高级了想一上来就要学框架、搭平台然后把需求做成了一个需要三个月维护的“项目”。其实九成的重复操作都特别简单简单到只要分类对了一个脚本就能解决。1.1 Excel 类重复操作有哪些Excel 的重复劳动拆开看就三类数据清洗、数据合并、数据回填。数据清洗典型症状是“公式下拉到第 10000 行”“格式统一改半天”“把乱七八糟的文本拆成多列”。这类操作的共同点是操作本身不复杂但批量范围大手工容易漏。比如 3000 行姓名里混着全角和半角空格你要一个个去重、去空格、统一格式想想就头皮发麻。数据合并典型症状是“每月要把 12 个 sheet 的数据汇总到一张总表”“几十个文件要按同一列关联起来”。这类操作最容易出错因为手工滑动窗口时鼠标选错区域的概率跟数据处理量成正比。数据回填典型症状是“把 A 表的结果填到 B 表的对应位置”“模板不动只把数据填进第几列”。很多内勤岗位的日常就是把系统里导出的数据贴进一个“神圣不可改动”的模板每天重复几十次。1.2 网页类重复操作有哪些网页操作拆开看也是三类信息查找和汇总、表单填写、报表导出下载。信息查找和汇总典型场景是做市场调研、竞品跟踪、舆情统计打开一个网页搜索关键词把结果复制回 Excel。看着是“浏览”实际是每小时能复制 30 条数据手腕先酸眼睛后花。表单填写典型场景是后台录入、工单提交、审批流程。如果每天都要填 200 条订单而每条订单只是字段不同、模板一样这种操作就该交给机器。报表导出下载典型场景是从 OA、ERP、CRM 或各种系统后台导出 Excel、PDF。很多系统单次导出的数据量有限制于是你得反复设置筛选条件、点击导出、重命名文件一上午就这么没了。1.3 选自动化还是选手工我的判断标准给个务实建议出现以下信号之一就值得自动化否则老老实实手工继续干。第一同一套操作每周重复超过两次且单次耗时超过 15 分钟。第二操作过程中需要人工记忆的“步骤”超过五步。第三只要一次漏操作就会导致数据对不上需要反复核对。第四这个操作未来三个月还会继续出现。判断逻辑很简单人适合做决策不适合做重复执行。如果一个任务不需要你现场判断只需要按固定次序执行固定动作那它就是脚本的菜。反之如果任务需要你根据上下文灵活调整比如领导说“看情况处理一下”那还是别强行自动化先跟人确认需求。2. 工具选型解析与核心库构建选工具是自动化项目里最容易翻车的一步。我的经验是先明确需求边界再选工具别一上来就“我要学 XX 框架”。2.1 运维视角选出的最优组合针对“Excel 重复操作 网页重复操作”这个场景最稳的组合是 Python。不要觉得 Python 只属于程序员现在的 Python 早就成了办公自动化圈子的“通用语言”因为 Excel 和浏览器这两大方向都有非常成熟的库。操作 Excel 用 openpyxl 和 pandas。openpyxl 适合处理 .xlsx 格式能读写单元格、合并单元格、设置样式最关键是它能做到“模板不变只填数据”。pandas 适合做内存中的表格运算合并、过滤、分组、透视一条龙处理几千行数据毫无压力。操作网页用 Playwright 或 Selenium。我个人更偏向 Playwright因为它的 API 设计更简洁自动等待做得更好跑起来比 Selenium 稳很多。如果你之前被 Selenium 的“找不到元素”折磨过换 Playwright 会有种“终于不用伺候浏览器了”的感觉。2.2 为什么不是先学 RPA市面上的 RPA 工具比如按键精灵、各种商业 RPA 平台确实能通过录屏的方式记录你的鼠标键盘操作然后回放。这类工具适合“纯鼠标点击、没有复杂逻辑”的操作但它们的致命弱点是脚本和界面强绑定页面按钮位置一变脚本就废了。我见过很多团队上了商业 RPA录制了一堆流程结果系统改版一次所有流程重录一遍维护成本比手工还高。而用 Python 配合 Playwright 这类工具是通过网页的 DOM 结构元素的属性来定位按钮页面样式变了但元素的属性没变脚本还能跑。退一步说真遇到属性也变了的情况改一行选择器就行不用从头录制。2.3 环境搭建与基础封装搭环境的步骤很固定我给你列一个“能跑起来”的最小集合。先用 pip 安装几个库pip install openpyxl pandas playwright playwright install chromium第一行装的是 Excel 处理和网页自动化库第二行是把 Chromium 浏览器内核下载到本地供自动化脚本调用。注意这里的浏览器是“无头”运行的也可以有头方便调试和日常用的 Chrome 互不干扰。如果你之前完全没接触过 Python我建议先把 Python 3.9 以上版本装好然后按上面两条命令执行。装完库之后核心就两步第一步用 OpenAI 的接口也好、用自己本地模型也好先让“人话”变成代码第二步把你手头的重复操作拆成“输入是什么、输出是什么、中间步骤固定不变”三个要素然后照着下面的实战案例抄作业。我习惯把 Excel 操作封装成一个小模块因为几乎每个项目都会用到from openpyxl import load_workbook from copy import copy def fill_excel_template(template_path, output_path, row_data): wb load_workbook(template_path) ws wb.active for row_idx, data in enumerate(row_data, start2): for col_idx, value in enumerate(data, start1): cell ws.cell(rowrow_idx, columncol_idx) cell.value value wb.save(output_path)这段代码的用途是打开一个固定模板从第二行开始填数据填完另存为新文件。为什么从第二行开始因为第一行通常是表头。为什么另存为新文件因为模板不能被破坏下个月还要再用。这个封装解决了日常 80% 的“按模板填数”需求你只需要把数据整理成二维列表传进去。3. 真实场景实战网页报表抓取 Excel 批量合并理论聊够了直接实战。以一个我最近帮人处理过的场景为例子某运营专员每天要从后台导出几十个子账号的销售报表然后把它们合并成一张总表再把总表的关键数据回填到日报模板里。原来每天要花一个小时现在脚本跑三分钟。3.1 需求拆解与流程设计这个业务场景包含三个动作第一登录网页后台第二对每一个子账号分别设置筛选条件、导出当天报表第三把导出的多张 Excel 合并成一张总表按模板回填。自动化方案也按三步走但顺序值得讲究先把第二步和第三步分别跑通最后再做第一步的登录联调。因为登录环节最依赖页面结构放到最后做可以避免“登录没搞定后面全没法测”的死局。3.2 第一步用单账号验证网页基础操作写网页自动化脚本最忌讳一上来就写完整流程。先把单个账号的流程跑通确认所有元素定位没问题再写循环。下面是一段用 Playwright 实现的“登录 导出”脚本骨架from playwright.sync_api import sync_playwright import time def export_report(account, date_str): with sync_playwright() as p: browser p.chromium.launch(headlessFalse) page browser.new_page() page.goto(https://your-system.example.com/login) page.fill(#username, account[name]) page.fill(#password, account[pwd]) page.click(#login-btn) page.wait_for_load_state(networkidle) page.click(text销售报表) page.fill(#date-input, date_str) page.click(#export-btn) page.wait_for_timeout(3000) # 等待浏览器触发下载 browser.close()这里有个关键细节定位元素用的是 CSS 选择器和文本选择器比如#username、#login-btn、text销售报表。你得打开浏览器的开发者工具右键点击输入框选择“复制 selector”把它填进脚本。这个过程一开始有点烦但熟练后你会发现定位元素比想象中容易难的反而是等待时机。为什么只等 3 秒就关浏览器因为导出按钮触发后下载行为经常在浏览器层面处理短时间等待后文件就落盘了。如果网络慢或者报表数据量大建议改为轮询下载目录里是否出现新文件代码更稳。3.3 第二步多账号循环与动态文件处理单账号跑通后把函数套进循环然后加上“文件名乱跳”的处理逻辑。多个账号的账号密码放在一个 CSV 里用 pandas 读进来逐行执行。导出文件名一般会带时间戳比如“销售报表_20250610_123456.xlsx”我们需要找到最新生成的那个文件。import pandas as pd import glob import os accounts pd.read_csv(accounts.csv) date_str 2025-06-10 for idx, row in accounts.iterrows(): account {name: row[账号], pwd: row[密码]} export_report(account, date_str) # 找到最新下载的文件并重命名 list_of_files glob.glob(C:/Downloads/销售报表*.xlsx) latest_file max(list_of_files, keyos.path.getmtime) os.rename(latest_file, foutput/{row[账号]}_{date_str}.xlsx) print(f已完成: {row[账号]})这段代码里藏着两个值得注意的细节。其一glob 匹配到的文件列表用修改时间排序可以拿最新文件避免多个账号导出的文件重名覆盖。其二重命名时把账号名拼进去是为了后面合并时能区分数据归属。这一步如果漏了后续数据处理会非常痛苦。3.4 第三步Excel 批量合并与回填下载完所有子账号报表后合并工作交给 pandas 处理。绝大多数报表的列结构是一致的直接 concat 即可。import pandas as pd import glob all_files glob.glob(output/*.xlsx) df_list [] for file in all_files: df pd.read_excel(file) df[数据来源] os.path.basename(file).split(_)[0] df_list.append(df) merged_df pd.concat(df_list, ignore_indexTrue) merged_df.to_excel(合并总表.xlsx, indexFalse)这里加了一列“数据来源”用于标识每行数据属于哪个账号。这样后续不管按账号筛选、统计还是做数据透视都有据可查。总表生成之后还要回填到日报模板。回填的逻辑往往不是简单的“复制粘贴”而是需要按账号、按日期取数。比如日报模板里要填“每个账号今天的支付金额”那么用 pandas 的 groupby 按账号汇总即可汇总结果再通过前面封装的fill_excel_template写入模板。summary merged_df.groupby(账号)[支付金额].sum().reset_index() rows_to_fill summary.values.tolist() fill_excel_template(日报模板.xlsx, 日报_今日.xlsx, rows_to_fill)到这里原先 1 小时的手工流程就变成 3 分钟的脚本流程了。整套流程跑下来我通常会在最后加一个“核对步骤”用 pandas 读取合并总表检查行数是否等于所有子账号报表行数之和数量对不上就告警。自动化脚本再放心也要有校验环节这是工程习惯不是信不过自己。3.5 稳定性保障把脚本交给“定时任务”流程跑通之后下一步是把它变成“无人值守”的运行。Windows 上用“任务计划程序”macOS 上用 launchd 或 cron都可以。我给你个 Windows 任务计划的配置参考触发器选“按预定计划”每天设置一个具体时间操作选“启动程序”程序填你的 Python 可执行文件路径参数填脚本路径起始于填脚本目录。有一个高频坑是任务计划程序里运行的 Python 和你命令行里的 Python 不是同一个导致脚本运行时找不到库。解决办法是用绝对路径执行比如C:\Python39\python.exe D:\scripts\daily_report.py。配置完成后第一次执行时建议人留在电脑前盯着因为如果脚本有 bug弹出的错误窗口会一闪而过你至少要知道它到底死在哪一步。4. 常见问题与排查技巧实录这个部分真正值钱。脚本跑不起来的原因千奇百怪我把我踩过和见过的坑集中列一遍下次遇到能少掉一半头发。4.1 页面元素定位与浏览器版本问题网页自动化最常见的报错就是“找不到元素”。这类报错九成是三个原因元素还没加载出来、元素在 iframe 里、页面改版了元素属性变了。对应策略是第一不要裸用page.click()改用点击前等待比如page.wait_for_selector(#export-btn, timeout10000)等元素出现了再操作。第二留意 iframePlaywright 里需要用frame_locator或先进入 frame 再查找元素。第三把常用的页面操作包成函数页面一改版只改函数内部的选择器不改业务逻辑。浏览器版本的问题出现在 Selenium 用户身上更多因为你得手动下载对应版本的 WebDriver还要放到 PATH 路径里。Playwright 用playwright install chromium一条命令解决版本不匹配的烦恼小很多。4.2 Excel 表格操作常见坑用 pandas 写 Excel 时最容易翻车的是“列名对不上”。导出的原始报表可能表头有空格、有换行甚至有多余字符。我在实际项目中碰到过最奇葩的情况表头“金额”后面带着一个不可见字符直接导致按列名取值时报 KeyError。处理方法是加一层“表头清洗”逻辑把表头做 normalize去空格、去换行、统一大小写。简单粗暴但有效。另一个高频坑是数据类型。比如“金额”列在 Excel 里可能是文本也可能是数值读进 pandas 后如果直接求和会出现奇怪的结果。稳妥的做法是显式转换df[金额] pd.to_numeric(df[金额], errorscoerce)转换不了的值变成 NaN后续再统一处理就不会因为一个坏数据把整列算崩。再有一个坑是 openpyxl 和 pandas 的兼容性。pandas 的to_excel依赖 openpyxl如果你的 pandas 版本太老写出的 xlsx 文件可能打不开。建议保持 openpyxl 库版本较新实在打不开时用openpyxl重新读一遍文件看能否正常加载。4.3 脚本跑一半卡住或中断很多时候脚本不是报错而是卡住。最经典的是页面等待点击按钮后页面一直转圈脚本卡在wait_for_load_state上。解决方案是给所有等待加超时时间超时就跳过或重试而不是无限等待。另外断网、系统弹窗、意外的登录态失效都可能导致脚本中途停止。建议在脚本里加一个“断点续跑”的概念每处理完一个账号就把这个账号标记为已完成下次运行直接跳过。这个设计简单但实用程度远超你的想象尤其是你要跑几十个账号的时候。最后提一下“干跑模式”在脚本里加一个参数--dry-run只打印“将要执行的动作”不真正操作浏览器和文件。我在调试复杂流程的时候会先干跑一遍确认逻辑顺序天衣无缝再真正放数据进去这个习惯帮我躲过好几次“误操作生产系统”的尴尬。4.4 高频问题速查表我整理了一份速查表覆盖日常最常遇到的情况你可以直接把它贴到笔记软件里当 cheat sheet 用。现象可能原因排查方法解决思路Playwright 找不到元素元素未加载 / 在 iframe先用 wait_for_selector 等加载看 html 结构定位 iframe 后进入再找Excel 导出后打开乱码编码不一致用 pandas 读取时加 encoding 参数统一用 UTF-8 或 GBK 写测试后固定脚本能跑但数据不对原始表头有隐藏字符打印 df.columns 看真实值加表头清洗逻辑任务计划程序运行报错使用错误的 Python 环境查看错误日志路径用绝对路径指定 Python下载文件没生成浏览器下载机制被拦截检查浏览器下载设置配置无头模式下默认下载目录多表格合并后行数翻倍有重复表头行读取后先过滤空行读取时 skiprows 参数处理这份表不是万能的但你遇到问题时按行必查多数都能解决。真解决不了的就把报错信息完整贴出来去问 AI 或社区把“现象 代码 报错”三者一起放出来比自己闷头猜高效得多。5. 我的个人体会与下一步建议做了这么多自动化之后我最大的感受是自动化不是“把一件事做得更快”而是“把这件事从你的待办事项里彻底删掉”。手工操作 Excel 和网页这件事不该占据你每天的精神带宽哪怕它只要 20 分钟那也是每天的 20 分钟积少成多就是每月的一整天。顺着这个项目继续往下走有三个演进方向我觉得很值得尝试。第一个方向是“异常通知”脚本跑完不管成没成给你推一条微信或邮件出错时把错误截图发过来这样你每天早上一看通知就知道流程是否正常。第二个方向是把现有脚本改成“按需触发”的 Web 页面让同事也能自己点按钮跑生成而不是每次都来找你。第三个方向是引入数据校验规则比如对比今天导出的总金额和昨天相差超过 20% 就告警把自动化从“执行工具”升级成“监控工具”价值又上一个台阶。记住一件事脚本是给人省时间的不是给人找事儿的。如果你发现维护脚本的成本超过了手工操作的成本说明这个自动化方案设计得有问题要么是选错了工具要么是流程分得太细。真正可靠的自动化应该是写一次长期跑偶尔看一眼结果。希望这篇东西能帮你少走一段弯路。最后分享一个我的习惯每写完一个脚本我都会在旁边留一份 README记录三件事——“这个脚本解决什么问题”“运行前需要手动作什么”“踩过哪些坑”。半年后再打开这些脚本时你会发现这份 README 比代码本身还值钱。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →