影刀RPA 用Python在影刀中做Excel高级处理:pandas vs openpyxl的选择
影刀内置的Excel动作能覆盖70%的场景。剩下的30%(大数据量、复杂筛选、多表关联、透视汇总),得靠Python节点。
这篇不教Python语法,只讲一个核心问题:什么场景用pandas,什么场景用openpyxl。选错了库,十万行数据能让你等到天荒地老。
pandas vs openpyxl 一句话区分
- pandas:处理数据内容和结构的,像SQL操作数据表。读取、筛选、分组、聚合、合并——它擅长。
- openpyxl:操作Excel文件和格式的,像Excel应用程序。样式、图表、合并单元格、行高列宽——它擅长。
你要算月销售额总和 → pandas 你要给销售额那列标红 → openpyxl 你要把两个表按客户名关联 → pandas 你要设置表头加粗白字蓝底 → openpyxl  你要从100万行里筛选出金额>10000的 → pandas 你要给符合条件的行加条件格式 → openpyxl场景一:数据筛选与计算 → pandas
拼多多店群自动化上架方案
importpandasaspd# 读取Exceldf=pd.read_excel(r'C:\data\orders.xlsx',dtype={'订单号':str})# === pandas的筛选操作 ===# 单条件筛选high_value=df[df['金额']>10000]# 多条件筛选(AND)result=df[(df['金额']>1000)&(df['状态']=='已完成')]# 多条件筛选(OR)result=df[(df['地区']=='北京')|(df['地区']=='上海')]# 按列值筛选(IN)provinces=['广东','浙江','江苏']result=df[df['省份'].isin(provinces)]# 模糊筛选(包含关键字)result=df[df['客户名'].str.contains('科技',na=False)]# === pandas的聚合计算 ===# 按客户分组,汇总金额summary=df.groupby('客户名')['金额'].agg(['sum','count','mean'])summary.columns=['总金额','订单数','平均金额']# 按日期和地区分组pivot=df.pivot_table(values='金额',index='日期',columns='地区',aggfunc='sum',fill_value=0)# 排序df_sorted=df.sort_values('金额',ascending=False)df_top10=df_sorted.head(10)# 保存结果summary.to_excel(r'C:\data\summary.xlsx')场景二:格式与样式操作 → openpyxl
fromopenpyxlimportload_workbookfromopenpyxl.stylesimportFont,PatternFill,Alignment wb=load_workbook(r'C:\data\report.xlsx')ws=wb.active# === openpyxl的格式操作 ===# 遍历单元格设置样式forrowinws.iter_rows(min_row=2):amount=row[4].value# E列,金额ifamountandamount>10000:row[4].font=Font(color='FF0000',bold=True)# 合并单元格ws.merge_cells('A10:C10')ws['A10']='汇总'ws['A10'].alignment=Alignment(horizontal='center')# 冻结窗格ws.freeze_panes='A2'# 设置打印区域ws.print_area='A1:F50'wb.save(r'C:\data\report_styled.xlsx')场景三:数据量大 → pandas(唯一选择)
当数据超过几万行时,openpyxl会变得很慢——因为它要逐行逐列操作Excel的XML结构。
importpandasaspd# 读取大文件(10万行以上)df=pd.read_excel(r'C:\data\huge_file.xlsx')# 筛选filtered=df[df['金额']>1000]# 指定列类型加速读取df=pd.read_excel('huge_file.xlsx',dtype={'订单号':str,'金额':float},usecols=['订单号','客户名','金额']# 只读需要的列,加快速度)filtered.to_excel(r'C:\data\filtered.xlsx',index=False)pandas在大数据下的性能碾压openpyxl:10万行数据,pandas筛选+保存大概2-3秒,openpyxl逐行遍历可能需要几十秒到一分钟。
组合使用:获取最佳效果
实际场景中,两个库组合使用是最佳实践:
importpandasaspdfromopenpyxlimportload_workbookfromopenpyxl.stylesimportFont,PatternFill# === 步骤1:pandas处理数据内容和结构 ===df=pd.read_excel(r'C:\data\raw_data.xlsx')# 数据清洗、筛选、计算df=df[df['金额'].notna()]# 去掉金额为空的行df['利润率']=df['利润']/df['金额']# 按客户分组汇总summary=df.groupby('客户名').agg({'金额':'sum','利润':'sum','订单号':'count'}).reset_index()summary.columns=['客户名','总金额','总利润','订单数']summary['利润率']=summary['总利润']/summary['总金额']# 写入Exceloutput=r'C:\data\final_report.xlsx'summary.to_excel(output,index=False,sheet_name='汇总')# === 步骤2:openpyxl美化格式 ===wb=load_workbook(output)ws=wb.active# 表头样式forcellinws[1]:cell.font=Font(bold=True,color='FFFFFF')cell.fill=PatternFill(start_color='2F5496',end_color='2F5496',fill_type='solid')# 数据列格式forrowinws.iter_rows(min_row=2):row[1].number_format='¥#,##0.00'# 总金额row[2].number_format='¥#,##0.00'# 总利润row[4].number_format='0.00%'# 利润率wb.save(output)流程总结:pandas做"内容",openpyxl做"好看"。
常见操作对应的库选择
| 操作 | 推荐库 | 原因 |
|---|---|---|
| 读取大文件(>5万行) | pandas | 速度快 |
| 筛选、排序、分组 | pandas | 语法简洁,性能好 |
| 两个表关联(类似VLOOKUP) | pandas merge | pd.merge跟SQL join一样直观 |
| 设置字体颜色、背景色 | openpyxl | pandas做不到 |
| 合并单元格 | openpyxl | pandas做不到 |
TEMU店群如何管理运营?
| 添加图表 | openpyxl | 支持但不完美,复杂图表用xlsxwriter |
| 设置数据验证(下拉选项) | openpyxl | DataValidation |
| 修改已有文件的样式 | openpyxl | pandas只能覆盖写入 |
| 读取特定Sheet/区域 | 两者都可 | 看后续操作需求 |
坑:pandas写入会覆盖已有的格式
这是一个经常踩的坑。你有一个人工做好的带格式的Excel模板,想用pandas写入数据保留格式——不行。
pandas的to_excel()是完全覆盖Sheet。之前的所有格式、图表、条件格式全部丢失。
解决方案:用openpyxl加载模板,然后逐行写入数据。
fromopenpyxlimportload_workbook# 加载带格式的模板wb=load_workbook(r'C:\data\template.xlsx')ws=wb.active# 从第2行开始写入数据(第1行是表头模板)fori,row_datainenumerate(data,start=2):forj,valueinenumerate(row_data,start=1):ws.cell(row=i,column=j,value=value)wb.save(r'C:\data\filled.xlsx')# 模板的格式、图表、条件格式都保留一句话:数据计算用pandas,格式美化用openpyxl。超过5万行数据强制用pandas,需要保留模板格式用openpyxl增量写入。
作者:林焱