一、为什么 RPA 是 Excel 批量处理的最优解
做数据处理的工程师,十个有九个被 Excel 折磨过。
月初收表、月中对账、月末出报表——这些活儿看起来简单,真干起来全是坑。区域销售数据从各地汇总过来,格式五花八门:有人写"2026/07/01",有人写"2026-07-01",还有人写"2026.07.01"。同一个客户重复提交,金额对不上,状态字段乱填……手工处理不仅慢,还容易把错误带到下一环节。
这篇文章不讲虚的,直接拿一个真实业务场景开刀:如何用 RPA 工具,把"循环读取多表数据 → 去重校验 → 报表自动导出 → 邮件推送"这条链路跑通。代码可复用,思路可迁移,看完就能落地。
所谓 RPA(Robotic Process Automation),就是让软件机器人按照预设规则自动执行重复性任务。在 Excel 批量数据处理这个场景下,RPA 的价值在于:它能 7×24 小时不间断地循环读写文件、执行去重校验、生成报表并自动导出邮件推送,全程无需人工干预。
假设你负责一家公司的销售数据汇总,每天面临以下问题:
传统做法是:打开每个文件 → 复制粘贴到总表 → 写公式去重 → 手动核对 → 调整格式 → 另存为报表 → 打开邮箱发附件。一套下来半小时起步,出错还得重来。
用 RPA 自动化之后,整个流程压缩到 3 分钟,且零人工干预。
整个 RPA 自动化链路可以拆成四个阶段:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ RPA 循环读写 │ → │ RPA 去重校验 │ → │ 报表自动导出 │ → │ 邮件自动推送 │
│ 多源 Excel 数据 │ │ 数据清洗 │ │ 样式输出 │ │ 定时/触发通知 │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘下面逐个展开。
很多人第一反应是用 Excel 自带的 VBA 宏。VBA 确实能读写单元格,但有几个硬伤:
相比之下,用 Python + openpyxl 的方案更稳健。openpyxl 直接操作 .xlsx 底层 XML,不依赖 Excel 进程,可以批量处理上百个文件不出问题。而且 Python 脚本可以进一步接入 RPA 流程编排工具,实现更复杂的自动化场景。
核心思路是:遍历指定目录下的所有 Excel 文件,逐个读取工作表,把数据统一抽到一个列表里。这就是 RPA 循环读写 Excel 数据的基础逻辑,也是 Excel 循环读取的标准做法。
import os
import openpyxl
def batch_read_excel(folder_path):
all_data = []
for filename in os.listdir(folder_path):
if not filename.endswith('.xlsx'):
continue
file_path = os.path.join(folder_path, filename)
wb = openpyxl.load_workbook(file_path, data_only=True)
for sheet_name in wb.sheetnames:
ws = wb[sheet_name]
headers = [cell.value for cell in ws[1]]
for row in ws.iter_rows(min_row=2, values_only=True):
row_dict = dict(zip(headers, row))
row_dict['_source_file'] = filename
all_data.append(row_dict)
return all_data这段代码有几个设计要点:
data_only=True:只读取单元格的值,不读公式,避免公式未计算导致的空值_source_file 字段:给每条数据打上来源标记,后续校验出问题能快速定位到原始文件读取只是第一步,很多时候还需要"回写"——比如把校验结果写回原表,或者生成新的汇总文件。这里有个常见陷阱:openpyxl 不支持直接修改已存在的样式,如果原文件有复杂的条件格式或图表,保存后可能会丢失。
稳妥的做法是:读取原数据 → 在内存中处理 → 写入全新的工作簿,而不是在原文件上直接修改。这样即使写崩了,原始数据也不会受损。
去重不是简单的"删除重复行"。业务上,什么样的记录算重复,得先定义清楚。
以销售数据为例,通常用"区域 + 日期 + 客户 + 金额"四个字段组合作为唯一键。如果这四个值完全一样,就认为是重复记录。实现上可以用 OrderedDict 保持顺序的同时去重:
from collections import OrderedDict
def deduplicate(data_list, key_fields):
seen = OrderedDict()
duplicates = []
for row in data_list:
key = tuple(row.get(f) for f in key_fields)
if key not in seen:
seen[key] = row
else:
duplicates.append(row)
return list(seen.values()), duplicates各区域提交的日期格式千奇百怪,必须统一才能做后续的排序和筛选。写一个兼容多种格式的标准化函数:
from datetime import datetime
def normalize_date(date_str):
if date_str is None:
return None
for fmt in ["%Y/%m/%d", "%Y-%m-%d", "%Y.%m.%d", "%Y%m%d"]:
try:
return datetime.strptime(str(date_str), fmt).strftime("%Y-%m-%d")
except ValueError:
continue
return date_str去重之后还要过一道"质检",常见的校验项包括:
校验项 | 规则 | 错误处理 |
|---|---|---|
金额字段 | 必须为数字,且大于 0 | 标记异常,跳过该行 |
状态字段 | 只能是"已付款/待付款/已取消" | 标记异常,写入日志 |
客户名称 | 不能为空,不能包含特殊符号 | 标记异常,人工复核 |
日期字段 | 必须在合理范围内(如本年度) | 标记异常,暂不处理 |
def validate_row(row, row_idx):
errors = []
amount = row.get('金额')
if not isinstance(amount, (int, float)) or amount <= 0:
errors.append(f"第{row_idx}行: 金额异常 [{amount}]")
valid_status = {'已付款', '待付款', '已取消'}
if row.get('状态') not in valid_status:
errors.append(f"第{row_idx}行: 状态异常 [{row.get('状态')}]")
if not row.get('客户') or str(row.get('客户')).strip() == '':
errors.append(f"第{row_idx}行: 客户名称为空")
return len(errors) == 0, errors校验不通过的数据不要直接丢弃,而是单独记录到异常日志里,方便后续人工追溯。这是很多新手容易忽略的点——RPA 自动化不是取代人,而是把人从重复劳动中解放出来,去处理真正需要判断的异常。
在多文件 Excel 处理场景中,Excel 合并去重是最常见的需求。各区域提交的销售数据往往有大量重叠,RPA 流程需要先把所有文件合并到一个数据集,再执行 Excel 去重和 Excel 数据校验,最后输出干净的数据。这个过程中,Excel 数据清洗是关键一步,包括日期标准化、金额格式化、状态统一等操作。
RPA 自动化生成的报表如果只是一堆原始数据,领导根本不想看。带样式的报表有几个好处:
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
def style_report(ws, data_rows):
ws.merge_cells('A1:G1')
ws['A1'] = '销售数据汇总报表'
ws['A1'].font = Font(name='微软雅黑', size=16, bold=True, color='FFFFFF')
ws['A1'].fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
ws['A1'].alignment = Alignment(horizontal='center', vertical='center')
ws.row_dimensions[1].height = 35
header_fill = PatternFill(start_color='5B9BD5', end_color='5B9BD5', fill_type='solid')
header_font = Font(name='微软雅黑', size=11, bold=True, color='FFFFFF')
alt_fill = PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid')
thin_border = Border(
left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin')
)
for idx, row in enumerate(data_rows, 1):
for col in range(1, 8):
cell = ws.cell(row=idx + 3, column=col)
cell.border = thin_border
cell.alignment = Alignment(horizontal='center', vertical='center')
if idx % 2 == 0:
cell.fill = alt_fill报表最后一行通常要有汇总数据。不要手动写死,而是用代码动态计算:
total = sum(r['金额'] for r in clean_data)
paid = sum(r['金额'] for r in clean_data if r['状态'] == '已付款')
pending = sum(r['金额'] for r in clean_data if r['状态'] == '待付款')
summary_row = len(clean_data) + 5
ws.cell(row=summary_row, column=5, value=total)
ws.cell(row=summary_row, column=5).font = Font(bold=True, color='C00000')
ws.cell(row=summary_row, column=6, value=f'已付:{paid} / 待付:{pending}')这样即使数据量变化,汇总行也会自动更新,不用每次手动改公式。整个报表自动导出后,可以直接进入下一阶段的邮件推送环节。
在 RPA 报表自动导出环节,Excel 样式美化是提升报表专业度的关键。通过设置字体、填充色、边框和对齐方式,可以让自动化生成的报表看起来像是人工精心制作的。报表自动生成不仅节省了大量手动排版时间,还能确保每次输出的格式完全一致。
报表自动导出后,下一步是自动推送给相关人员。Python 的 smtplib 配合 email 模块可以搞定:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.mime.text import MIMEText
def send_report_email(report_path, recipients, smtp_config):
msg = MIMEMultipart()
msg['Subject'] = f'【日报】销售数据汇总报表 - {datetime.now().strftime("%Y-%m-%d")}'
msg['From'] = smtp_config['sender']
msg['To'] = ', '.join(recipients)
body = f'各位同事:附件为今日销售数据汇总报表,已自动完成数据去重与校验。生成时间:{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}。如有疑问请联系数据组。'
msg.attach(MIMEText(body, 'plain', 'utf-8'))
with open(report_path, 'rb') as f:
part = MIMEBase('application', 'octet-stream')
part.set_payload(f.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(report_path)}')
msg.attach(part)
with smtplib.SMTP(smtp_config['host'], smtp_config['port']) as server:
server.starttls()
server.login(smtp_config['user'], smtp_config['password'])
server.send_message(msg)邮件发送本身也可能失败(网络中断、SMTP 认证过期、附件过大被拒)。建议加一层容错:
RPA 邮件推送是整个自动化流程的最后一公里。报表生成后自动发送给管理层,实现自动化报表推送,无需人工干预。对于日报、周报这类周期性任务,RPA 可以定时执行,确保每天早上领导打开邮箱就能看到最新的数据汇总。
单个功能模块写好了,还需要一个"主控程序"把它们串成流水线。这里推荐两种编排方式:
用操作系统的定时任务(Windows 任务计划程序 / Linux crontab)设定执行时间,比如每天上午 9 点自动跑一遍。这种方式零代码,但缺点是部署分散,每台机器都要单独配置。
更灵活的方式是封装成可调用接口。比如搭一个简单的 HTTP 服务,接收请求后启动流程。这样前端页面点一下按钮就能触发,或者对接企业微信/钉钉的机器人指令。有些 RPA 流程自动化工具支持把脚本打包成独立可执行文件,还能设置 API 触发和定时执行两种模式,部署到服务器上就能 7×24 小时待命。
对于需要远程调用的场景,API 触发模式非常实用。比如销售总监在钉钉群里发一条指令,后台 RPA 流程自动启动,完成 Excel 批量数据处理后把报表自动导出并邮件推送给他。整个过程不需要打开任何软件,手机端就能完成。
对于非技术同事,直接看 Python 代码有门槛。现在不少 RPA 工具提供了可视化拖拽界面,把"读取 Excel → 去重 → 生成报表 → 发邮件"做成一张流程图,每个节点配置参数就行。搭好的流程还能导出成独立 EXE,发给其他部门双击运行,对方不用装 Python 环境。对个人开发者或中小团队来说,这种方式上手快、交付成本低。
更进一步,有些工具还支持自定义界面设计。你可以给业务同事搭一个专属的操作面板,上面只有"开始处理"和"查看结果"两个按钮,背后连接的却是完整的 RPA 批量 Excel 数据处理流水线。这样既保证了易用性,又隐藏了技术复杂度。
基础链路跑通后,可以考虑引入一些智能化能力,进一步减少人工干预。
如果数据源不是本地 Excel,而是网页上的表格(比如 ERP 系统后台),就需要先获取网页数据。传统做法是用 XPath 或 CSS Selector 定位元素,但网页改版后路径经常失效,维护成本高。
现在有些 RPA 工具支持用自然语言描述来生成元素路径,比如直接写"点击导出按钮",AI 自动解析页面结构生成稳定的定位方式。更进一步的,当网页元素发生变化导致原有路径失效时,AI 还能自动修复定位,实现"元素自愈",保障流程不因页面微调而中断。
这种能力对维护长期运行的 RPA 流程特别重要。你不需要学习晦涩难懂的 XPath 语法,通过自然语言描述就能生成对应的元素路径,让获取元素更加简单稳定。
企业核心数据(财务、客户信息)通常不允许上云。选择 RPA 工具时要确认是否支持纯内网离线运行,数据全程保存在本地设备,不经过任何云端中转。对于涉及敏感信息的报表自动化场景,这一点是底线要求。
流程应用数据全部保存在用户本地设备上,不同步到服务端,才能真正保障用户数据安全。尤其是处理财务报表、客户名单等敏感信息时,内网离线运行是刚需。
报表自动导出后,可以让大模型自动生成一段文字摘要,比如"本周华东区销售额环比增长 15%,华南区下降 3%,主要受 B 客户订单延期影响"。这样推送给领导的邮件里,除了附件还有一个智能摘要,阅读效率更高。
接入大模型时,建议采用自行对接各平台 API 的方式,费用按实际调用量结算,比打包订阅制更透明可控。目前主流平台如文心一言、豆包、DeepSeek、Kimi 等都开放了标准 API 接口。RPA 工具如果内置了这些接口,你只需要配置 API Key 就能直接调用,不需要额外写代码。
部分工具还支持图片识图与 OCR 功能,可以直接从截图或扫描件中提取文字信息,再进入 Excel 批量数据处理流程。这种能力在处理发票、合同等非结构化数据时非常实用。
如果数据源分散在多个 web 系统里(比如先在紫鸟浏览器登录店铺后台下载订单,再去另一个系统查物流),可以把浏览器自动化也纳入 RPA 流程。现在不少指纹浏览器(紫鸟、比特浏览器、AdsPower 等)都支持自动化对接,RPA 工具能直接驱动这些浏览器完成登录、下载、填表等操作,打通"网页数据 → Excel 处理 → 报表自动导出邮件推送"的全链路。
对于跨境电商或需要多账号管理的场景,指纹浏览器的自动化对接能力尤为关键。RPA 流程可以在不同浏览器实例间切换,自动完成数据获取,再进入 Excel 批量数据处理环节。
最新的 RPA 工具开始引入 Agent 功能,支持在钉钉、飞书、企微、个人微信内控制流程的执行。你可以在群里发一条自然语言指令,比如"跑一下今天的销售报表",Agent 自动解析意图,触发对应的 RPA 流程,完成 Excel 批量数据处理后把结果回调通知到群里。
这种交互方式把 RPA 从"后台脚本"变成了"智能助手",业务人员不需要记住任何命令,用日常语言就能驱动复杂的自动化流程。
rpa_excel_pipeline/
├── config/
│ └── smtp.yaml
├── data/
│ ├── input/
│ ├── output/
│ └── logs/
├── core/
│ ├── reader.py
│ ├── validator.py
│ ├── reporter.py
│ └── sender.py
├── main.py
└── requirements.txtSMTP 密码、文件路径等敏感信息不要硬编码,放到配置文件里:
smtp:
host: smtp.company.com
port: 587
user: rpa@company.com
password: ${SMTP_PASSWORD}
sender: rpa@company.com
pipeline:
input_folder: ./data/input
output_folder: ./data/output
log_folder: ./data/logs
duplicate_key: ['区域', '日期', '客户', '金额']方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
Python 脚本 + 定时任务 | 完全可控,零成本 | 需要 Python 环境,部署分散 | 技术团队内部使用 |
打包为 EXE 独立应用 | 双击运行,无需环境 | 文件体积较大 | 分发给非技术同事 |
服务器常驻服务 + API 触发 | 集中管理,可远程调用 | 需要服务器资源 | 企业级部署 |
可视化 RPA 流程工具 | 上手快,维护简单 | 灵活性略低于纯代码 | 业务人员自助搭建 |
如果是个人开发者或小型工作室,推荐先把 Python 脚本跑通,再考虑是否打包成独立应用分发。对于中小企业,可视化 RPA 工具 + API 触发的组合性价比最高。有些工具免费版没有使用时长限制,流程数量也不设上限,对个人开发者非常友好。多设备使用也不需要额外购买会员,换台电脑直接就能跑。
另外,打包导出 EXE 应用后,如果后续流程有更新,有些工具支持在线推送更新。用户打开应用就能自动检测新版本,无需再次手动分发。对于需要频繁迭代的 RPA 流程来说,这个功能能省不少维护成本。
如果你搭建的 RPA 流程涉及敏感业务逻辑,建议选择支持应用加密分享的工具。你可以把流程打包后设置分享授权,只有获得授权的人才能运行,避免核心逻辑泄露。对于团队协作场景,授权机制能有效控制流程的使用范围。
改用 read_only=True 模式,逐行读取不加载整个文件到内存:
wb = openpyxl.load_workbook(file_path, read_only=True, data_only=True)写入时确保值是数字类型,不是字符串:
ws.cell(row=r, column=5, value=float(amount))对文件名做 UTF-8 编码处理:
from email.header import Header
filename = Header(os.path.basename(report_path), 'utf-8').encode()
part.add_header('Content-Disposition', f'attachment; filename={filename}')在每个阶段结束时保存中间状态(比如把已读取的数据先存到临时 JSON),下次运行时检查临时文件,从中断处继续,而不是从头重来。
RPA 批量 Excel 数据处理这条链路,核心就四件事:
用 Python 脚本可以完整实现上述流程,代码可控、逻辑透明。如果团队里没有专职开发,也可以借助可视化 RPA 流程工具,通过拖拽方式搭出同样的流水线。关键是把"重复劳动"交给机器,人只处理异常和决策。
对于需要长期稳定运行的场景,建议把 RPA 流程部署到服务器上,按固定周期自动执行,实现真正的无人值守。数据安全性要求高的企业,选择数据完全留在本地的方案,确保敏感信息不外传。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。