影刀RPA Excel进阶操作:数据透视、多Sheet联动、复杂公式处理

0 阅读9分钟

影刀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

# 从第二行开始处理
遍历 2len(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实战教程!