影刀RPA Excel数据筛选与排序自动化作者林焱数据采集到Excel后第一件事往往不是直接用而是筛选和排序——把需要的数据挑出来、按某个字段排好序。手动在Excel里点筛选、排序很简单但在RPA流程里怎么自动化完成很多人用影刀读出全部数据后用Python做筛选排序再写回去。这当然可以但其实影刀和openpyxl也提供了直接操作Excel筛选和排序的能力。这篇文章把几种方案都讲清楚。一、用影刀指令操作Excel筛选1.1 开启自动筛选影刀提供【设置Excel筛选】指令可以直接在Excel中开启筛选模式【设置Excel筛选】 文件路径D:\data\product.xlsx Sheet名Sheet1 区域A1:D100 筛选列B列 筛选条件等于 筛选值在售这相当于在Excel里手动点筛选按钮然后选择B列筛选值为在售的行。坑筛选后数据还在但被隐藏Excel的筛选不是删除数据而是隐藏不满足条件的行。如果你用影刀读取筛选后的区域默认读到的是所有行包括被隐藏的。需要配合其他方式只读取可见行。1.2 读取筛选后的数据importopenpyxl wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[Sheet1]# 读取可见行筛选后未被隐藏的行visible_data[]forrowinws.iter_rows():ifnotws.row_dimensions[row[0].row].hidden:visible_data.append([cell.valueforcellinrow])set_variable(filtered_data,visible_data)1.3 清除筛选【清除Excel筛选】 文件路径D:\data\product.xlsx Sheet名Sheet1或者用Pythonws.auto_filter.refNone# 清除自动筛选wb.save(D:\\data\\product.xlsx)二、用pandas做数据筛选推荐拼多多店群自动化上架方案pandas的筛选能力远超Excel的自动筛选而且操作更灵活。2.1 单条件筛选importpandasaspd dfpd.read_excel(D:\\data\\product.xlsx)# 筛选价格大于100的行resultdf[df[价格]100]# 筛选状态为在售的行resultdf[df[状态]在售]# 筛选商品名包含手机的行resultdf[df[商品名].str.contains(手机)]# 筛选库存不为空的行resultdf[df[库存].notna()]# 写入新文件result.to_excel(D:\\data\\filtered.xlsx,indexFalse)2.2 多条件筛选# AND条件价格100 且 状态在售resultdf[(df[价格]100)(df[状态]在售)]# OR条件状态在售 或 状态预售resultdf[df[状态].isin([在售,预售])]# NOT条件状态不等于已下架resultdf[df[状态]!已下架]# 组合条件resultdf[(df[价格]100)(df[状态]在售)(df[库存]0)(df[商品名].str.contains(手机))]坑多条件必须用括号pandas中多个条件组合时每个条件必须用括号括起来。写成df[价格] 100 df[状态] 在售会报错因为的优先级高于。2.3 模糊匹配筛选# 以华为开头resultdf[df[品牌].str.startswith(华为)]# 以Pro结尾resultdf[df[型号].str.endswith(Pro)]# 正则匹配resultdf[df[商品名].str.contains(r\d{4},regexTrue)]# 包含4位数字# 不区分大小写resultdf[df[商品名].str.contains(iphone,caseFalse)]2.4 按区间筛选# 价格在100-500之间resultdf[df[价格].between(100,500)]# 日期在指定范围内resultdf[df[日期].between(2026-01-01,2026-06-30)]2.5 取前N条/后N条# 取价格最高的10条resultdf.nlargest(10,价格)# 取价格最低的5条resultdf.nsmallest(5,价格)# 取前20条resultdf.head(20)# 取最后10条resultdf.tail(10)三、用pandas做数据排序3.1 单列排序# 按价格升序排列resultdf.sort_values(价格,ascendingTrue)# 按价格降序排列resultdf.sort_values(价格,ascendingFalse)3.2 多列排序# 先按状态升序再按价格降序resultdf.sort_values([状态,价格],ascending[True,False])坑排序后索引乱了排序后行索引会跟着打乱。如果后续需要按索引访问数据重置索引resultresult.reset_index(dropTrue)3.3 按中文拼音排序importpandasaspdimportpypinyindefget_pinyin(text):获取中文的拼音首字母ifpd.isna(text):returnreturn.join([p[0][0]forpinpypinyin.pinyin(str(text),stylepypinyin.FIRST_LETTER)])# 按商品名的拼音排序df[拼音首字母]df[商品名].apply(get_pinyin)resultdf.sort_values(拼音首字母).drop(columns[拼音首字母])3.4 按自定义顺序排序# 按指定状态顺序排列在售→预售→已下架status_order[在售,预售,已下架]df[状态排序]df[状态].map({s:ifori,sinenumerate(status_order)})resultdf.sort_values(状态排序).drop(columns[状态排序])四、用openpyxl设置Excel排序如果你需要在Excel文件中保留排序效果打开Excel就能看到排序后的数据用openpyxl4.1 openpyxl排序的限制openpyxl不能直接对Excel数据排序只能设置排序筛选条件。真正执行排序需要Excel应用打开文件。所以如果要对数据排序并保存结果推荐用pandas。4.2 设置排序条件importopenpyxlfromopenpyxl.worksheet.filtersimportSortColumn wbopenpyxl.load_workbook(D:\\data\\product.xlsx)wswb[Sheet1]# 设置自动筛选区域ws.auto_filter.refA1:D100# 添加排序条件B列升序sort_colSortColumn(colId1,ascendingTrue)ws.auto_filter.sortColumn.add(sort_col)wb.save(D:\\data\\product.xlsx)注意这只是设置了排序条件实际排序在Excel应用打开时执行。五、实战场景5.1 采集数据后自动排序筛选importpandasaspd# 1. 读取采集的原始数据dfpd.read_excel(D:\\data\\raw_collection.xlsx)# 2. 去重dfdf.drop_duplicates(subset[商品ID])# 3. 筛选有效数据dfdf[(df[价格]0)(df[库存].notna())]# 4. 按价格降序排列dfdf.sort_values(价格,ascendingFalse)# 5. 只取前100条dfdf.head(100)# 6. 重置索引dfdf.reset_index(dropTrue)# 7. 写入报表文件df.to_excel(D:\\data\\top100_products.xlsx,indexFalse)5.2 多维度交叉筛选dfpd.read_excel(D:\\data\\sales.xlsx)# 筛选条件# - 地区在华东或华南# - 月份是1-6月# - 销售额大于平均值的1.5倍# - 排除测试订单avg_salesdf[销售额].mean()resultdf[(df[地区].isin([华东,华南]))(df[月份].between(1,6))(df[销售额]avg_sales*1.5)(df[订单类型]!测试)].sort_values(销售额,ascendingFalse)result.to_excel(D:\\data\\high_value_orders.xlsx,indexFalse)5.3 分组排序每组取Top NTEMU店群如何管理运营dfpd.read_excel(D:\\data\\sales.xlsx)# 每个地区销售额前3名resultdf.groupby(地区).apply(lambdax:x.nlargest(3,销售额)).reset_index(dropTrue)result.to_excel(D:\\data\\top3_by_region.xlsx,indexFalse)5.4 排序后写入带格式的Excelimportpandasaspdimportopenpyxlfromopenpyxl.stylesimportFont,PatternFill# 1. pandas排序dfpd.read_excel(D:\\data\\product.xlsx)dfdf.sort_values(价格,ascendingFalse)df.to_excel(D:\\data\\sorted.xlsx,indexFalse)# 2. openpyxl加格式wbopenpyxl.load_workbook(D:\\data\\sorted.xlsx)wswb.active# 表头加粗forcolinrange(1,ws.max_column1):ws.cell(row1,columncol).fontFont(boldTrue,colorFFFFFF)ws.cell(row1,columncol).fillPatternFill(start_color4472C4,end_color4472C4,fill_typesolid)# 冻结首行ws.freeze_panesA2wb.save(D:\\data\\sorted.xlsx)六、性能对比操作影刀指令pandasopenpyxl筛选1000行较慢快中等排序10000行慢快不支持直接排序多条件筛选不灵活灵活不支持保留筛选效果支持不支持覆盖写入支持保留原格式支持不支持支持推荐策略数据处理筛选排序用pandas最快最灵活需要在Excel文件中保留筛选/排序效果用影刀指令或openpyxl先用pandas处理数据再用openpyxl加格式七、避坑清单坑1筛选后行号不连续pandas筛选后行索引不连续如果用df.iloc[0]取第一行可能不是你期望的。用reset_index(dropTrue)重置索引。坑2排序改变了原始数据sort_values默认返回新DataFrame不修改原数据。如果需要原地修改用inplaceTruedf.sort_values(价格,inplaceTrue)坑3数字和字符串混合排序某列里既有数字又有字符串如100和50排序结果不正确。先把数据类型统一df[价格]pd.to_numeric(df[价格],errorscoerce)坑4NaN值的排序位置排序时NaN默认排在最后升序或最前降序。可以用na_position参数控制df.sort_values(库存,ascendingFalse,na_positionlast)坑5Excel自动筛选的兼容性问题不同Excel版本对自动筛选的支持不同。openpyxl设置的筛选条件在WPS中可能不生效。如果需要跨平台兼容用pandas处理数据后重新写入。