影刀RPA多工作簿协同:跨Excel文件数据流转
作者:林焱
实际工作中数据往往分散在多个Excel文件中。本文详解跨工作簿的数据读取、合并、同步和联动,帮你构建多文件协同自动化体系。
前言:多工作簿协同的痛点
| 场景 | 人工操作 | 痛点 |
|---|---|---|
| 月度报表合并 | 打开12个文件逐个复制 | 耗时长、易出错 |
| 多部门数据汇总 | 邮件收集→手动合并 | 版本混乱 |
| 主数据+明细表关联 | VLOOKUP跨文件 | 文件路径变化就出错 |
| 多文件数据同步 | 逐个打开更新 | 效率极低 |
第一章:多文件批量读取
1.1 遍历文件夹读取所有Excel
importosimportglobimportpandasaspddefread_all_excels(folder_path,pattern="*.xlsx"):"""批量读取文件夹中所有Excel"""files=glob.glob(os.path.join(folder_path,pattern))all_data=[]file_summary=[]forfile_pathinfiles:try:# 读取所有工作表xl_file=pd.ExcelFile(file_path)forsheet_nameinxl_file.sheet_names:df=pd.read_excel(file_path,sheet_name=sheet_name)df["_source_file"]=os.path.basename(file_path)df["_source_sheet"]=sheet_name all_data.append(df)file_summary.append({"file":os.path.basename(file_path),[video(video-PgSADRtE-1782425713809)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限!)][video(video-lxKxJrch-1782425720493)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]"sheets":len(xl_file.sheet_names),"status":"success"})exceptExceptionase:file_summary.append({"file":os.path.basename(file_path),"status":"failed","error":str(e)})# 合并所有数据ifall_data:merged=pd.concat(all_data,ignore_index=True)returnmerged,file_summaryreturnNone,file_summary# 使用data,summary=read_all_excels(r"C:\数据\2024年3月")print(f"合并完成:{len(data)}行数据")1.2 按文件名模式智能读取
defsmart_read_by_pattern(folder_path):"""按文件名模式智能读取"""importre files={}forfinos.listdir(folder_path):ifnotf.endswith(('.xlsx','.xls')):continue# 提取日期(如:销售数据2024-03-15.xlsx)date_match=re.search(r'(\d{4}[-_]?\d{2}[-_]?\d{2})',f)ifdate_match:date_str=date_match.group(1)files[date_str]=os.path.join(folder_path,f)# 按日期排序sorted_files=sorted(files.items(),key=lambdax:x[0])results=[]fordate,pathinsorted_files:df=pd.read_excel(path)df["_date"]=date results.append(df)returnpd.concat(results,ignore_index=True)第二章:多工作簿数据合并
2.1 横向合并(按共同列)
defmerge_by_key(file_list,key_column):"""按关键列横向合并多个文件"""# 读取第一个文件作为基础base_df=pd.read_excel(file_list[0])forfile_pathinfile_list[1:]:df=pd.read_excel(file_path)# 按关键列合并base_df=pd.merge(base_df,df,on=key_column,how='outer',# 保留所有记录suffixes=('',f"_{os.path.basename(file_path)}"))returnbase_df2.2 纵向追加(相同结构)
defappend_all(folder_path,output_path):"""纵向追加所有文件"""all_dfs=[]forfileinos.listdir(folder_path):ifnotfile.endswith(('.xlsx','.xls')):continuefile_path=os.path.join(folder_path,file)df=pd.read_excel(file_path)# 添加来源信息df["数据来源"]=filedf["导入时间"]=datetime.now().strftime("%Y-%m-%d %H:%M")all_dfs.append(df)# 合并result=pd.concat(all_dfs,ignore_index=True)# 去重before=len(result)result=result.drop_duplicates()after=len(result)# 保存result.to_excel(output_path,index=False)print(f"合并完成:{before}→{after}行(去重后)")returnresult第三章:跨文件数据关联
3.1 主表+明细表关联
deflink_master_detail(master_path,detail_folder):"""主表与多个明细表关联"""# 读取主表master=pd.read_excel(master_path)# 遍历所有明细文件forfileinos.listdir(detail_folder):ifnotfile.endswith('.xlsx'):continuedetail=pd.read_excel(os.path.join(detail_folder,file))# 按客户ID关联merged=pd.merge(master,detail[["客户ID","订单金额","订单日期"]],on="客户ID",how="left")# 计算汇总summary=merged.groupby("客户ID").agg({"订单金额":"sum","订单日期":"count"}).rename(columns={"订单日期":"订单数量"})# 写回主表master=master.set_index("客户ID")master.update(summary)master=master.reset_index()returnmaster3.2 VLOOKUP跨文件实现
defcross_file_vlookup(lookup_file,lookup_col,source_folder,source_col,result_col):"""模拟VLOOKUP跨文件查询"""# 读取待查询数据df=pd.read_excel(lookup_file)# 遍历所有源文件建立查询字典lookup_dict={}forfileinos.listdir(source_folder):ifnotfile.endswith('.xlsx'):continuesource_df=pd.read_excel(os.path.join(source_folder,file))for_,rowinsource_df.iterrows():key=row[source_col]value=row[result_col]lookup_dict[key]=value# 执行查询df["查询结果"]=df[lookup_col].map(lookup_dict)returndf第四章:多文件数据同步
4.1 变更检测与增量同步
importhashlibclassExcelSync:"""Excel文件同步器"""def__init__(self,source_dir,target_dir):self.source_dir=source_dir self.target_dir=target_dir self.snapshot_file=os.path.join(target_dir,".snapshot.json")self.snapshot=self._load_snapshot()def_load_snapshot(self):"""加载文件快照"""ifos.path.exists(self.snapshot_file):withopen(self.snapshot_file,"r")asf:returnjson.load(f)return{}def_file_hash(self,file_path):"""计算文件哈希"""hasher=hashlib.md5()withopen(file_path,"rb")asf:buf=f.read(65536)whilelen(buf)>0:hasher.update(buf)buf=f.read(65536)returnhasher.hexdigest()defcheck_changes(self):"""检测变更文件"""changed=[]new_files=[]forfileinos.listdir(self.source_dir):ifnotfile.endswith(('.xlsx','.xls')):continuesource_path=os.path.join(self.source_dir,file)file_hash=self._file_hash(source_path)iffilenotinself.snapshot:new_files.append(file)elifself.snapshot[file]!=file_hash:changed.append(file)# 更新快照self.snapshot[file]=file_hashreturn{"changed":changed,"new":new_files}defsync(self):"""执行同步"""changes=self.check_changes()forfileinchanges["changed"]+changes["new"]:source=os.path.join(self.source_dir,file)target=os.path.join(self.target_dir,file)shutil.copy2(source,target)print(f"已同步:{file}")# 保存快照withopen(self.snapshot_file,"w")asf:json.dump(self.snapshot,f)returnchanges第五章:实战案例——销售报表自动合并
defauto_merge_sales_reports():"""自动合并各区域销售报表"""# 1. 扫描各区域报表regions=["华北","华东","华南","西南"]all_data=[]forregioninregions:folder=f"报表\\{region}"forfileinos.listdir(folder):iffile.endswith('.xlsx'):df=pd.read_excel(os.path.join(folder,file))df["区域"]=region df["文件名"]=fileall_data.append(df)# 2. 合并merged=pd.concat(all_data,ignore_index=True)# 3. 数据清洗# 金额列统一merged["销售金额"]=pd.to_numeric(merged["销售金额"],errors="coerce")# 日期列统一merged["销售日期"]=pd.to_datetime(merged["销售日期"],errors="coerce")# 4. 汇总分析summary=merged.groupby(["区域","销售员"]).agg({"销售金额":["sum","mean","count"],"销售日期":["min","max"]}).round(2)# 5. 输出withpd.ExcelWriter("销售合并报表.xlsx")aswriter:merged.to_excel(writer,sheet_name="明细数据",index=False)summary.to_excel(writer,sheet_name="汇总分析")print(f"合并完成:{len(merged)}行,{len(regions)}个区域")第六章:影刀RPA中的多文件操作
6.1 使用影刀指令批量处理
流程:多Excel合并 ├── 1. 文件操作-列出文件夹文件 │ 参数:文件夹路径 = "C:\数据" │ 输出:file_list │ ├── 2. 循环-ForEach │ 列表:file_list │ 循环变量:current_file │ │ │ ├── 2.1 Excel-打开工作簿 │ │ 文件路径:current_file │ │ │ ├── 2.2 Excel-读取所有数据 │ │ 输出:sheet_data │ │ │ └── 2.3 列表-添加元素 │ 列表:all_data │ 元素:sheet_data │ ├── 3. Excel-新建工作簿 │ ├── 4. Excel-写入数据 │ 数据:all_data │ └── 5. Excel-保存 文件路径:"C:\输出\合并结果.xlsx"结语
多工作簿协同的核心原则:
- 路径动态化:不用硬编码路径,用文件夹扫描
- 结构标准化:各文件列名和结构尽量统一
- 增量同步:只处理变更文件,提升效率
- 快照比对:用哈希检测文件是否真的变化
一句话:让数据在文件间自由流转,人就不用再做"人肉ETL"了。