影刀RPA Excel进阶操作:数据透视、多Sheet联动、复杂公式处理
作者:林焱 | 更新时间:2026-06 | 难度:中级进阶 | 阅读时间:约15分钟
前言
之前写过影刀RPA的Excel基础操作。很多同学反馈:基础的读写都会了,但遇到以下场景就卡住了:
- 多个Sheet之间需要联动汇总
- Excel里有复杂公式,读出来是公式字符串而不是结果
- 要生成数据透视表,但不知道怎么用影刀做
- 批量操作大量行数时速度很慢
本文专门解决这些进阶问题。
第一章:公式处理的正确姿势
1.1 读取公式结果vs公式字符串
影刀读取Excel的两种模式:
# 模式A:读取显示值(推荐)
读取单元格:
文件路径: "report.xlsx"
Sheet: "数据"
单元格: "C2"
读取模式: 值(而非公式)
结果变量: cellValue
# cellValue = 1234.56(公式的计算结果)
# 模式B:读取公式字符串
读取单元格:
读取模式: 公式
# cellValue = "=SUM(A2:B2)"
关键配置项: 在影刀的Excel操作指令里,找"是否读取公式"的选项,确保取消勾选,才能读到计算结果。
[video(video-8ndeMBZO-1782424634930)(type-csdn)(url-live.csdn.net/v/embed/525…)]
1.2 Excel文件需要先被Excel程序打开
如果Excel文件里有=TODAY()、=NOW()之类的动态公式,影刀直接读会得到上次保存时的值,不是最新值。
解决方案:先打开Excel文件让其刷新,再读取
# 方法一:用COM对象打开Excel(Windows)
执行Python代码:
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False
wb = excel.Workbooks.Open(r'D:\report.xlsx')
wb.RefreshAll()
wb.Save()
wb.Close()
excel.Quit()
# 方法二:打开Excel程序后再读取
启动程序: "Excel.exe D:\\report.xlsx"
等待: 3000毫秒 # 等待公式计算完成
# 然后再用影刀读取
# 方法三:影刀的"刷新工作簿"指令(新版本)
打开工作簿: "D:/report.xlsx"
刷新工作簿
等待: 2000毫秒
读取数据
第二章:多Sheet联动操作
2.1 场景:把多个Sheet汇总到一个Sheet
常见需求: 销售部门有12个月的数据,每个月一个Sheet,要汇总到"年度汇总"Sheet。
打开工作簿: "sales_2026.xlsx"
# 获取所有Sheet名称
获取所有Sheet名: 结果变量 = allSheets
# allSheets = ["1月", "2月", ..., "12月", "年度汇总"]
# 清空汇总Sheet
切换Sheet: "年度汇总"
清空区域: A2:Z1000
# 写入汇总标题
写入行: ["月份", "销售额", "订单数", "客单价", "同比增长"]
位置: A1
# 逐月读取数据
汇总行 = 2
遍历 allSheets as sheetName:
如果 sheetName == "年度汇总":
跳过
# 切换到月度Sheet
切换Sheet: sheetName
# 读取汇总行(假设每个月Sheet最后一行是汇总)
获取已用区域最后行: 结果变量 = lastRow
月销售额 = 读取单元格(lastRow, "B") # B列是销售额
月订单数 = 读取单元格(lastRow, "C") # C列是订单数
如果 月销售额 != "" and 月销售额 != "合计":
客单价 = 月销售额 / 月订单数
# 写入年度汇总Sheet
切换Sheet: "年度汇总"
写入行: [sheetName, 月销售额, 月订单数, 客单价, ""]
位置: "A" + 汇总行
汇总行 += 1
# 计算全年汇总(写入SUM公式)
切换Sheet: "年度汇总"
写入单元格: "A" + 汇总行 = "全年合计"
写入单元格: "B" + 汇总行 = "=SUM(B2:B" + (汇总行-1) + ")"
写入单元格: "C" + 汇总行 = "=SUM(C2:C" + (汇总行-1) + ")"
保存工作簿
关闭工作簿
2.2 场景:跨Sheet的VLOOKUP联动
需求: Sheet1是订单表,Sheet2是客户信息表,根据客户ID把客户名称写入Sheet1。
打开工作簿: "orders.xlsx"
# 读取客户信息表,建立ID→名称的映射字典
切换Sheet: "客户信息"
读取所有数据: 结果变量 = customerData
customerMap = {}
遍历 customerData as row:
customerId = row[0] # 第一列是客户ID
customerName = row[1] # 第二列是客户名称
customerMap[customerId] = customerName
# 处理订单表
切换Sheet: "订单数据"
读取所有数据: 结果变量 = orderData
# 找到"客户ID"和"客户名称"所在列
headerRow = orderData[0]
customerIdCol = headerRow.index("客户ID") + 1
customerNameCol = headerRow.index("客户名称") + 1
# 从第二行开始处理
遍历 2到 len(orderData) as rowIndex:
row = orderData[rowIndex - 1]
customerId = row[customerIdCol - 1]
如果 customerId 在 customerMap:
写入单元格: 行=rowIndex, 列=customerNameCol, 值=customerMap[customerId]
否则:
写入单元格: 行=rowIndex, 列=customerNameCol, 值="未知客户"
保存工作簿
2.3 批量Sheet操作技巧
# 批量复制Sheet格式(月度报告模板)
# 把1月Sheet复制并重命名为2月~12月
打开工作簿: "monthly_template.xlsx"
月份列表 = ["2月", "3月", "4月", "5月", "6月",
"7月", "8月", "9月", "10月", "11月", "12月"]
遍历 月份列表 as month:
复制Sheet:
源Sheet: "1月"
新Sheet名: month
插入位置: 末尾
保存工作簿
第三章:生成数据透视表
3.1 方法一:用影刀的COM方式创建
执行Python代码:
import win32com.client
excel = win32com.client.Dispatch('Excel.Application')
excel.Visible = False
wb = excel.Workbooks.Open(r'D:\sales_data.xlsx')
ws = wb.Sheets("原始数据")
# 获取数据范围
lastRow = ws.Cells(ws.Rows.Count, 1).End(-4162).Row # xlUp
lastCol = ws.Cells(1, ws.Columns.Count).End(-4159).Column # xlToLeft
dataRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))
# 创建透视表缓存
cache = wb.PivotCaches().Create(
SourceType=1, # xlDatabase
SourceData=dataRange
)
# 在新Sheet创建透视表
ptSheet = wb.Sheets.Add()
ptSheet.Name = "透视分析"
pt = cache.CreatePivotTable(
TableDestination=ptSheet.Cells(3, 1),
TableName="SalesPivot"
)
# 配置透视表字段
pt.PivotFields("销售区域").Orientation = 1 # xlRowField
pt.PivotFields("产品类别").Orientation = 2 # xlColumnField
pt.PivotFields("销售额").Orientation = 4 # xlDataField
pt.PivotFields("销售额").Function = -4157 # xlSum
wb.Save()
wb.Close()
excel.Quit()
return "透视表创建成功"
变量: result = 执行结果
记录日志: result
3.2 方法二:用pandas生成透视分析(更灵活)
执行Python代码:
import pandas as pd
# 读取原始数据
df = pd.read_excel(r'D:\sales_data.xlsx', sheet_name='原始数据')
# 创建透视表
pivot = pd.pivot_table(
df,
values='销售额', # 数值字段
index='销售区域', # 行字段
columns='产品类别', # 列字段
aggfunc='sum', # 聚合方式
fill_value=0, # 空值填0
margins=True, # 添加汇总行/列
margins_name='合计'
)
# 格式化(保留两位小数)
pivot = pivot.round(2)
# 写入Excel
with pd.ExcelWriter(r'D:\sales_report.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='原始数据', index=False)
pivot.to_excel(writer, sheet_name='透视分析')
# 美化透视分析Sheet
worksheet = writer.sheets['透视分析']
for col in worksheet.columns:
max_length = max(len(str(cell.value)) for cell in col) + 2
worksheet.column_dimensions[col[0].column_letter].width = max_length
return "透视表生成完成"
第四章:大数据量处理优化
4.1 分批读取(超过10万行)
# ❌ 一次性读全部(内存容易爆)
读取所有数据: "big_file.xlsx"
# ✅ 分批读取
每批行数 = 5000
当前行 = 2 # 从第2行开始(第1行是标题)
循环:
批次数据 = 读取区域:
开始行: 当前行
结束行: 当前行 + 每批行数 - 1
如果 批次数据 为空 or len(批次数据) == 0:
跳出循环
# 处理这批数据
处理批次数据(批次数据)
当前行 += 每批行数
4.2 批量写入(比逐行写入快10倍)
[video(video-TOWRiXTg-1782424641604)(type-csdn)(url-live.csdn.net/v/embed/524…)]
# ❌ 逐行写入(很慢)
遍历 dataList as row:
写入行到Excel: row # 每次都触发IO操作
# ✅ 先收集数据,一次性写入
allData = []
遍历 dataList as row:
processedRow = 处理数据(row)
allData.追加(processedRow)
# 一次性写入所有数据
批量写入: allData
起始行: 2
起始列: A
4.3 关闭屏幕刷新(操作大量Sheet/单元格时)
# COM方式
执行Python代码:
excel = win32com.client.GetObject(r'D:\report.xlsx')
excel.ScreenUpdating = False # 关闭屏幕刷新
excel.Calculation = -4135 # xlCalculationManual,关闭自动计算
# ... 大量写入操作 ...
excel.ScreenUpdating = True # 恢复屏幕刷新
excel.Calculation = -4105 # xlCalculationAutomatic,恢复自动计算
excel.Calculate() # 手动触发一次计算
第五章:实战——月度销售报告自动生成
5.1 流程完整描述
输入:各销售员的日报Excel文件(N个文件)
输出:月度汇总报告.xlsx(含多Sheet)
Sheet结构:
Sheet1: 原始数据汇总(所有文件合并)
Sheet2: 销售员排名(按销售额降序)
Sheet3: 品类分析(透视图)
Sheet4: 趋势图(折线图)
5.2 核心代码
# Step1: 收集所有销售员Excel文件
获取文件列表:
目录: "D:/sales_reports/2026-06/"
扩展名: "*.xlsx"
排除: "汇总*.xlsx"
结果变量: salesFiles
# Step2: 合并数据
allData = []
遍历 salesFiles as filePath:
打开工作簿: filePath
读取工作表: "日报"
结果变量: sheetData
# 去掉标题行(如果有),加入汇总
如果 sheetData[0][0] == "日期":
sheetData = sheetData[1:] # 去掉标题
# 给每行加上文件名(销售员姓名)
salesperson = 文件名去掉扩展名(filePath)
遍历 sheetData as row:
row.插入(0, salesperson) # 在第一列插入销售员名称
allData.追加(row)
关闭工作簿
# Step3: 写入汇总文件
新建工作簿: "月度汇总报告_2026-06.xlsx"
# 写标题行
写入行: ["销售员", "日期", "客户名称", "产品", "数量", "单价", "金额"]
Sheet: "原始数据"
行号: 1
# 写数据
批量写入: allData
Sheet: "原始数据"
起始行: 2
# Step4: 用Python生成透视分析
执行Python代码:
import pandas as pd
df = pd.read_excel(r'月度汇总报告_2026-06.xlsx', sheet_name='原始数据')
# 销售员排名
ranking = df.groupby('销售员')['金额'].sum().sort_values(ascending=False)
ranking = ranking.reset_index()
ranking.columns = ['销售员', '总销售额']
ranking['排名'] = range(1, len(ranking)+1)
# 品类分析
category = df.groupby('产品')['金额'].sum().sort_values(ascending=False)
# 写入
with pd.ExcelWriter(r'月度汇总报告_2026-06.xlsx',
engine='openpyxl', mode='a') as writer:
ranking.to_excel(writer, sheet_name='销售员排名', index=False)
category.to_excel(writer, sheet_name='品类分析')
# Step5: 美化格式(冻结标题行、加筛选等)
打开工作簿: "月度汇总报告_2026-06.xlsx"
切换Sheet: "原始数据"
冻结首行
添加自动筛选
切换Sheet: "销售员排名"
设置列宽: A列=15, B列=20, C列=8
保存工作簿
# Step6: 发邮件通知
发送邮件:
收件人: "manager@company.com"
主题: "2026年6月销售报告已生成"
正文: "请查看附件中的月度销售汇总报告"
附件: "月度汇总报告_2026-06.xlsx"
总结
| 进阶技巧 | 适用场景 |
|---|---|
| 读取公式计算结果 | Excel含有计算公式时 |
| 先打开Excel再读取 | 含动态公式(TODAY/NOW)时 |
| 多Sheet合并汇总 | 分散在多Sheet的数据整合 |
| 跨Sheet字典映射 | VLOOKUP替代方案 |
| COM创建透视表 | 需要原生Excel透视表 |
| pandas生成透视分析 | 灵活自定义的数据分析 |
| 分批读写 | 超过10万行的大文件 |
| 关闭屏幕刷新 | 大量操作时提速 |
掌握这些进阶技巧,影刀+Excel能帮你处理几乎所有的报表自动化需求。
下一篇推荐:《影刀RPA定时任务进阶:多触发器组合与依赖链管理》
关注作者 获取更多影刀RPA实战教程!