首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >RPA 批量 Excel 数据处理实战:循环读写、去重校验与报表自动导出邮件推送的完整方案

RPA 批量 Excel 数据处理实战:循环读写、去重校验与报表自动导出邮件推送的完整方案

原创
作者头像
用户12579380
发布2026-07-10 14:18:19
发布2026-07-10 14:18:19
310
举报

一、为什么 RPA 是 Excel 批量处理的最优解

做数据处理的工程师,十个有九个被 Excel 折磨过。

月初收表、月中对账、月末出报表——这些活儿看起来简单,真干起来全是坑。区域销售数据从各地汇总过来,格式五花八门:有人写"2026/07/01",有人写"2026-07-01",还有人写"2026.07.01"。同一个客户重复提交,金额对不上,状态字段乱填……手工处理不仅慢,还容易把错误带到下一环节。

这篇文章不讲虚的,直接拿一个真实业务场景开刀:如何用 RPA 工具,把"循环读取多表数据 → 去重校验 → 报表自动导出 → 邮件推送"这条链路跑通。代码可复用,思路可迁移,看完就能落地。

所谓 RPA(Robotic Process Automation),就是让软件机器人按照预设规则自动执行重复性任务。在 Excel 批量数据处理这个场景下,RPA 的价值在于:它能 7×24 小时不间断地循环读写文件、执行去重校验、生成报表并自动导出邮件推送,全程无需人工干预。


二、业务场景拆解:一个典型的 RPA Excel 批量处理需求

假设你负责一家公司的销售数据汇总,每天面临以下问题:

  • 数据来源杂:华东、华南、华北、西南四个区域,各用一个 Excel 文件提交,字段名可能不一致
  • 格式不统一:日期、金额、状态字段写法各异,需要标准化
  • 重复数据多:同一笔订单在不同文件里出现多次,必须去重
  • 校验规则多:金额不能为负、状态只能是特定枚举值、客户名不能为空
  • 输出要求高:生成带样式的汇总报表,自动推送给管理层

传统做法是:打开每个文件 → 复制粘贴到总表 → 写公式去重 → 手动核对 → 调整格式 → 另存为报表 → 打开邮箱发附件。一套下来半小时起步,出错还得重来。

用 RPA 自动化之后,整个流程压缩到 3 分钟,且零人工干预。


三、RPA 批量 Excel 数据处理的核心流程设计

整个 RPA 自动化链路可以拆成四个阶段:

代码语言:javascript
复制
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│  RPA 循环读写    │ → │  RPA 去重校验   │ → │  报表自动导出   │ → │  邮件自动推送   │
│  多源 Excel 数据 │    │  数据清洗       │    │  样式输出       │    │  定时/触发通知  │
└─────────────────┘    └─────────────────┘    └─────────────────┘    └─────────────────┘

下面逐个展开。


四、第一阶段:RPA 循环读写多源 Excel 数据

4.1 为什么不用 VBA?

很多人第一反应是用 Excel 自带的 VBA 宏。VBA 确实能读写单元格,但有几个硬伤:

  • 跨文件能力弱:循环打开十几个 Excel 文件,VBA 容易卡死或内存溢出
  • 格式兼容性差:.xls 和 .xlsx 混用时经常报错
  • 部署麻烦:换了台电脑要重新配置宏安全级别,普通同事根本用不了
  • 无法独立运行:必须依赖 Excel 软件本身,不能后台静默执行

相比之下,用 Python + openpyxl 的方案更稳健。openpyxl 直接操作 .xlsx 底层 XML,不依赖 Excel 进程,可以批量处理上百个文件不出问题。而且 Python 脚本可以进一步接入 RPA 流程编排工具,实现更复杂的自动化场景。

4.2 循环读取的实现

核心思路是:遍历指定目录下的所有 Excel 文件,逐个读取工作表,把数据统一抽到一个列表里。这就是 RPA 循环读写 Excel 数据的基础逻辑,也是 Excel 循环读取的标准做法。

代码语言:javascript
复制
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 字段:给每条数据打上来源标记,后续校验出问题能快速定位到原始文件
  • 表头自动识别:不硬编码列名,适应不同区域提交时字段顺序不一致的情况

4.3 数据写入的坑

读取只是第一步,很多时候还需要"回写"——比如把校验结果写回原表,或者生成新的汇总文件。这里有个常见陷阱:openpyxl 不支持直接修改已存在的样式,如果原文件有复杂的条件格式或图表,保存后可能会丢失。

稳妥的做法是:读取原数据 → 在内存中处理 → 写入全新的工作簿,而不是在原文件上直接修改。这样即使写崩了,原始数据也不会受损。


五、第二阶段:RPA 去重校验与数据清洗

5.1 去重策略

去重不是简单的"删除重复行"。业务上,什么样的记录算重复,得先定义清楚。

以销售数据为例,通常用"区域 + 日期 + 客户 + 金额"四个字段组合作为唯一键。如果这四个值完全一样,就认为是重复记录。实现上可以用 OrderedDict 保持顺序的同时去重:

代码语言:javascript
复制
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

5.2 日期标准化

各区域提交的日期格式千奇百怪,必须统一才能做后续的排序和筛选。写一个兼容多种格式的标准化函数:

代码语言:javascript
复制
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

5.3 多维度校验规则

去重之后还要过一道"质检",常见的校验项包括:

校验项

规则

错误处理

金额字段

必须为数字,且大于 0

标记异常,跳过该行

状态字段

只能是"已付款/待付款/已取消"

标记异常,写入日志

客户名称

不能为空,不能包含特殊符号

标记异常,人工复核

日期字段

必须在合理范围内(如本年度)

标记异常,暂不处理

代码语言:javascript
复制
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 数据清洗是关键一步,包括日期标准化、金额格式化、状态统一等操作。


六、第三阶段:报表自动导出与样式美化

6.1 为什么报表要"好看"

RPA 自动化生成的报表如果只是一堆原始数据,领导根本不想看。带样式的报表有几个好处:

  • 视觉分层:标题、表头、数据行、汇总行用不同颜色区分,一眼找到重点
  • 专业感:发给外部客户或上级时,体现团队的专业度
  • 可读性:金额右对齐、日期居中、状态用颜色标注,减少误读

6.2 openpyxl 样式实战

代码语言:javascript
复制
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

6.3 汇总统计的自动计算

报表最后一行通常要有汇总数据。不要手动写死,而是用代码动态计算:

代码语言:javascript
复制
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 样式美化是提升报表专业度的关键。通过设置字体、填充色、边框和对齐方式,可以让自动化生成的报表看起来像是人工精心制作的。报表自动生成不仅节省了大量手动排版时间,还能确保每次输出的格式完全一致。


七、第四阶段:RPA 邮件推送

7.1 SMTP 发送带附件的邮件

报表自动导出后,下一步是自动推送给相关人员。Python 的 smtplib 配合 email 模块可以搞定:

代码语言:javascript
复制
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)

7.2 异常通知机制

邮件发送本身也可能失败(网络中断、SMTP 认证过期、附件过大被拒)。建议加一层容错:

  • 发送失败时记录到本地日志,不要直接抛异常导致整个流程中断
  • 对关键报表,可以配置"发送成功回调"或"钉钉/飞书机器人通知"
  • 附件超过 20MB 时,改为发送网盘链接而不是直接附件

RPA 邮件推送是整个自动化流程的最后一公里。报表生成后自动发送给管理层,实现自动化报表推送,无需人工干预。对于日报、周报这类周期性任务,RPA 可以定时执行,确保每天早上领导打开邮箱就能看到最新的数据汇总。


八、RPA 流程编排:把四个阶段串起来

单个功能模块写好了,还需要一个"主控程序"把它们串成流水线。这里推荐两种编排方式:

8.1 定时触发(适合日报/周报)

用操作系统的定时任务(Windows 任务计划程序 / Linux crontab)设定执行时间,比如每天上午 9 点自动跑一遍。这种方式零代码,但缺点是部署分散,每台机器都要单独配置。

8.2 API 触发(适合按需执行)

更灵活的方式是封装成可调用接口。比如搭一个简单的 HTTP 服务,接收请求后启动流程。这样前端页面点一下按钮就能触发,或者对接企业微信/钉钉的机器人指令。有些 RPA 流程自动化工具支持把脚本打包成独立可执行文件,还能设置 API 触发和定时执行两种模式,部署到服务器上就能 7×24 小时待命。

对于需要远程调用的场景,API 触发模式非常实用。比如销售总监在钉钉群里发一条指令,后台 RPA 流程自动启动,完成 Excel 批量数据处理后把报表自动导出并邮件推送给他。整个过程不需要打开任何软件,手机端就能完成。

8.3 可视化流程编排

对于非技术同事,直接看 Python 代码有门槛。现在不少 RPA 工具提供了可视化拖拽界面,把"读取 Excel → 去重 → 生成报表 → 发邮件"做成一张流程图,每个节点配置参数就行。搭好的流程还能导出成独立 EXE,发给其他部门双击运行,对方不用装 Python 环境。对个人开发者或中小团队来说,这种方式上手快、交付成本低。

更进一步,有些工具还支持自定义界面设计。你可以给业务同事搭一个专属的操作面板,上面只有"开始处理"和"查看结果"两个按钮,背后连接的却是完整的 RPA 批量 Excel 数据处理流水线。这样既保证了易用性,又隐藏了技术复杂度。


九、进阶:让 RPA 流程更智能

基础链路跑通后,可以考虑引入一些智能化能力,进一步减少人工干预。

9.1 AI 辅助元素定位

如果数据源不是本地 Excel,而是网页上的表格(比如 ERP 系统后台),就需要先获取网页数据。传统做法是用 XPath 或 CSS Selector 定位元素,但网页改版后路径经常失效,维护成本高。

现在有些 RPA 工具支持用自然语言描述来生成元素路径,比如直接写"点击导出按钮",AI 自动解析页面结构生成稳定的定位方式。更进一步的,当网页元素发生变化导致原有路径失效时,AI 还能自动修复定位,实现"元素自愈",保障流程不因页面微调而中断。

这种能力对维护长期运行的 RPA 流程特别重要。你不需要学习晦涩难懂的 XPath 语法,通过自然语言描述就能生成对应的元素路径,让获取元素更加简单稳定。

9.2 内网离线运行

企业核心数据(财务、客户信息)通常不允许上云。选择 RPA 工具时要确认是否支持纯内网离线运行,数据全程保存在本地设备,不经过任何云端中转。对于涉及敏感信息的报表自动化场景,这一点是底线要求。

流程应用数据全部保存在用户本地设备上,不同步到服务端,才能真正保障用户数据安全。尤其是处理财务报表、客户名单等敏感信息时,内网离线运行是刚需。

9.3 大模型接入

报表自动导出后,可以让大模型自动生成一段文字摘要,比如"本周华东区销售额环比增长 15%,华南区下降 3%,主要受 B 客户订单延期影响"。这样推送给领导的邮件里,除了附件还有一个智能摘要,阅读效率更高。

接入大模型时,建议采用自行对接各平台 API 的方式,费用按实际调用量结算,比打包订阅制更透明可控。目前主流平台如文心一言、豆包、DeepSeek、Kimi 等都开放了标准 API 接口。RPA 工具如果内置了这些接口,你只需要配置 API Key 就能直接调用,不需要额外写代码。

部分工具还支持图片识图与 OCR 功能,可以直接从截图或扫描件中提取文字信息,再进入 Excel 批量数据处理流程。这种能力在处理发票、合同等非结构化数据时非常实用。

9.4 浏览器自动化扩展

如果数据源分散在多个 web 系统里(比如先在紫鸟浏览器登录店铺后台下载订单,再去另一个系统查物流),可以把浏览器自动化也纳入 RPA 流程。现在不少指纹浏览器(紫鸟、比特浏览器、AdsPower 等)都支持自动化对接,RPA 工具能直接驱动这些浏览器完成登录、下载、填表等操作,打通"网页数据 → Excel 处理 → 报表自动导出邮件推送"的全链路。

对于跨境电商或需要多账号管理的场景,指纹浏览器的自动化对接能力尤为关键。RPA 流程可以在不同浏览器实例间切换,自动完成数据获取,再进入 Excel 批量数据处理环节。

9.5 Agent 智能指令

最新的 RPA 工具开始引入 Agent 功能,支持在钉钉、飞书、企微、个人微信内控制流程的执行。你可以在群里发一条自然语言指令,比如"跑一下今天的销售报表",Agent 自动解析意图,触发对应的 RPA 流程,完成 Excel 批量数据处理后把结果回调通知到群里。

这种交互方式把 RPA 从"后台脚本"变成了"智能助手",业务人员不需要记住任何命令,用日常语言就能驱动复杂的自动化流程。


十、完整代码与部署建议

10.1 项目结构

代码语言:javascript
复制
rpa_excel_pipeline/
├── config/
│   └── smtp.yaml
├── data/
│   ├── input/
│   ├── output/
│   └── logs/
├── core/
│   ├── reader.py
│   ├── validator.py
│   ├── reporter.py
│   └── sender.py
├── main.py
└── requirements.txt

10.2 关键配置分离

SMTP 密码、文件路径等敏感信息不要硬编码,放到配置文件里:

代码语言:javascript
复制
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: ['区域', '日期', '客户', '金额']

10.3 部署方式对比

方式

优点

缺点

适用场景

Python 脚本 + 定时任务

完全可控,零成本

需要 Python 环境,部署分散

技术团队内部使用

打包为 EXE 独立应用

双击运行,无需环境

文件体积较大

分发给非技术同事

服务器常驻服务 + API 触发

集中管理,可远程调用

需要服务器资源

企业级部署

可视化 RPA 流程工具

上手快,维护简单

灵活性略低于纯代码

业务人员自助搭建

如果是个人开发者或小型工作室,推荐先把 Python 脚本跑通,再考虑是否打包成独立应用分发。对于中小企业,可视化 RPA 工具 + API 触发的组合性价比最高。有些工具免费版没有使用时长限制,流程数量也不设上限,对个人开发者非常友好。多设备使用也不需要额外购买会员,换台电脑直接就能跑。

另外,打包导出 EXE 应用后,如果后续流程有更新,有些工具支持在线推送更新。用户打开应用就能自动检测新版本,无需再次手动分发。对于需要频繁迭代的 RPA 流程来说,这个功能能省不少维护成本。

如果你搭建的 RPA 流程涉及敏感业务逻辑,建议选择支持应用加密分享的工具。你可以把流程打包后设置分享授权,只有获得授权的人才能运行,避免核心逻辑泄露。对于团队协作场景,授权机制能有效控制流程的使用范围。


十一、常见问题排查

Q1:openpyxl 读取大文件时内存溢出?

改用 read_only=True 模式,逐行读取不加载整个文件到内存:

代码语言:javascript
复制
wb = openpyxl.load_workbook(file_path, read_only=True, data_only=True)

Q2:报表里的数字变成了文本格式?

写入时确保值是数字类型,不是字符串:

代码语言:javascript
复制
ws.cell(row=r, column=5, value=float(amount))

Q3:邮件附件中文名乱码?

对文件名做 UTF-8 编码处理:

代码语言:javascript
复制
from email.header import Header
filename = Header(os.path.basename(report_path), 'utf-8').encode()
part.add_header('Content-Disposition', f'attachment; filename={filename}')

Q4:流程运行到一半报错,怎么恢复?

在每个阶段结束时保存中间状态(比如把已读取的数据先存到临时 JSON),下次运行时检查临时文件,从中断处继续,而不是从头重来。


RPA 批量 Excel 数据处理这条链路,核心就四件事:

  1. 循环读写:批量读取多源 Excel 数据,兼容格式差异,标记数据来源
  2. 去重校验:多维度数据清洗,异常数据单独记录不丢弃
  3. 报表自动导出:生成带样式的专业报表,汇总统计自动计算
  4. 邮件推送:自动发送邮件,带异常通知和容错机制

用 Python 脚本可以完整实现上述流程,代码可控、逻辑透明。如果团队里没有专职开发,也可以借助可视化 RPA 流程工具,通过拖拽方式搭出同样的流水线。关键是把"重复劳动"交给机器,人只处理异常和决策。

对于需要长期稳定运行的场景,建议把 RPA 流程部署到服务器上,按固定周期自动执行,实现真正的无人值守。数据安全性要求高的企业,选择数据完全留在本地的方案,确保敏感信息不外传。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、业务场景拆解:一个典型的 RPA Excel 批量处理需求
  • 三、RPA 批量 Excel 数据处理的核心流程设计
  • 四、第一阶段:RPA 循环读写多源 Excel 数据
    • 4.1 为什么不用 VBA?
    • 4.2 循环读取的实现
    • 4.3 数据写入的坑
  • 五、第二阶段:RPA 去重校验与数据清洗
    • 5.1 去重策略
    • 5.2 日期标准化
    • 5.3 多维度校验规则
  • 六、第三阶段:报表自动导出与样式美化
    • 6.1 为什么报表要"好看"
    • 6.2 openpyxl 样式实战
    • 6.3 汇总统计的自动计算
  • 七、第四阶段:RPA 邮件推送
    • 7.1 SMTP 发送带附件的邮件
    • 7.2 异常通知机制
  • 八、RPA 流程编排:把四个阶段串起来
    • 8.1 定时触发(适合日报/周报)
    • 8.2 API 触发(适合按需执行)
    • 8.3 可视化流程编排
  • 九、进阶:让 RPA 流程更智能
    • 9.1 AI 辅助元素定位
    • 9.2 内网离线运行
    • 9.3 大模型接入
    • 9.4 浏览器自动化扩展
    • 9.5 Agent 智能指令
  • 十、完整代码与部署建议
    • 10.1 项目结构
    • 10.2 关键配置分离
    • 10.3 部署方式对比
  • 十一、常见问题排查
    • Q1:openpyxl 读取大文件时内存溢出?
    • Q2:报表里的数字变成了文本格式?
    • Q3:邮件附件中文名乱码?
    • Q4:流程运行到一半报错,怎么恢复?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档