影刀RPA多工作簿协同:跨Excel文件数据流转 影刀RPA多工作簿协同跨Excel文件数据流转作者林焱实际工作中数据往往分散在多个Excel文件中。本文详解跨工作簿的数据读取、合并、同步和联动帮你构建多文件协同自动化体系。前言多工作簿协同的痛点场景人工操作痛点月度报表合并打开12个文件逐个复制耗时长、易出错多部门数据汇总邮件收集→手动合并版本混乱主数据明细表关联VLOOKUP跨文件文件路径变化就出错多文件数据同步逐个打开更新效率极低第一章多文件批量读取1.1 遍历文件夹读取所有Excelimportosimportglobimportpandasaspddefread_all_excels(folder_path,pattern*.xlsx):批量读取文件夹中所有Excelfilesglob.glob(os.path.join(folder_path,pattern))all_data[]file_summary[]forfile_pathinfiles:try:# 读取所有工作表xl_filepd.ExcelFile(file_path)forsheet_nameinxl_file.sheet_names:dfpd.read_excel(file_path,sheet_namesheet_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:mergedpd.concat(all_data,ignore_indexTrue)returnmerged,file_summaryreturnNone,file_summary# 使用data,summaryread_all_excels(rC:\数据\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.xlsxdate_matchre.search(r(\d{4}[-_]?\d{2}[-_]?\d{2}),f)ifdate_match:date_strdate_match.group(1)files[date_str]os.path.join(folder_path,f)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b65857c5676e43cead31e104ad2d69ad.png#pic_center)# 按日期排序sorted_filessorted(files.items(),keylambdax:x[0])results[]fordate,pathinsorted_files:dfpd.read_excel(path)df[_date]date results.append(df)returnpd.concat(results,ignore_indexTrue)第二章多工作簿数据合并2.1 横向合并按共同列defmerge_by_key(file_list,key_column):按关键列横向合并多个文件# 读取第一个文件作为基础base_dfpd.read_excel(file_list[0])forfile_pathinfile_list[1:]:dfpd.read_excel(file_path)# 按关键列合并base_dfpd.merge(base_df,df,onkey_column,howouter,# 保留所有记录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_pathos.path.join(folder_path,file)dfpd.read_excel(file_path)# 添加来源信息df[数据来源]filedf[导入时间]datetime.now().strftime(%Y-%m-%d %H:%M)all_dfs.append(df)# 合并resultpd.concat(all_dfs,ignore_indexTrue)# 去重beforelen(result)resultresult.drop_duplicates()afterlen(result)# 保存result.to_excel(output_path,indexFalse)print(f合并完成{before}→{after}行去重后)returnresult第三章跨文件数据关联3.1 主表明细表关联deflink_master_detail(master_path,detail_folder):主表与多个明细表关联# 读取主表masterpd.read_excel(master_path)# 遍历所有明细文件forfileinos.listdir(detail_folder):ifnotfile.endswith(.xlsx):continuedetailpd.read_excel(os.path.join(detail_folder,file))# 按客户ID关联mergedpd.merge(master,detail[[客户ID,订单金额,订单日期]],on客户ID,howleft)# 计算汇总summarymerged.groupby(客户ID).agg({订单金额:sum,订单日期:count}).rename(columns{订单日期:订单数量})# 写回主表mastermaster.set_index(客户ID)master.update(summary)mastermaster.reset_index()returnmaster3.2 VLOOKUP跨文件实现defcross_file_vlookup(lookup_file,lookup_col,source_folder,source_col,result_col):模拟VLOOKUP跨文件查询# 读取待查询数据dfpd.read_excel(lookup_file)# 遍历所有源文件建立查询字典lookup_dict{}forfileinos.listdir(source_folder):ifnotfile.endswith(.xlsx):continuesource_dfpd.read_excel(os.path.join(source_folder,file))for_,rowinsource_df.iterrows():keyrow[source_col]valuerow[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_dirsource_dir self.target_dirtarget_dir self.snapshot_fileos.path.join(target_dir,.snapshot.json)self.snapshotself._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):计算文件哈希hasherhashlib.md5()withopen(file_path,rb)asf:buff.read(65536)whilelen(buf)0:hasher.update(buf)buff.read(65536)returnhasher.hexdigest()defcheck_changes(self):检测变更文件changed[]new_files[]forfileinos.listdir(self.source_dir):ifnotfile.endswith((.xlsx,.xls)):continuesource_pathos.path.join(self.source_dir,file)file_hashself._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):执行同步changesself.check_changes()forfileinchanges[changed]changes[new]:sourceos.path.join(self.source_dir,file)targetos.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:folderf报表\\{region}forfileinos.listdir(folder):iffile.endswith(.xlsx):dfpd.read_excel(os.path.join(folder,file))df[区域]region df[文件名]fileall_data.append(df)# 2. 合并mergedpd.concat(all_data,ignore_indexTrue)# 3. 数据清洗# 金额列统一merged[销售金额]pd.to_numeric(merged[销售金额],errorscoerce)# 日期列统一merged[销售日期]pd.to_datetime(merged[销售日期],errorscoerce)# 4. 汇总分析summarymerged.groupby([区域,销售员]).agg({销售金额:[sum,mean,count],销售日期:[min,max]}).round(2)# 5. 输出withpd.ExcelWriter(销售合并报表.xlsx)aswriter:merged.to_excel(writer,sheet_name明细数据,indexFalse)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了。