影刀RPA Excel拆分:按条件拆分工作表

📅 2026/7/9 3:51:56
影刀RPA Excel拆分:按条件拆分工作表
影刀RPA Excel拆分按条件拆分工作表署名林焱什么情况用什么汇总表里有多个部门的数据需要按部门拆分成独立Excel文件发给各部门负责人。或者一张总表里有12个月的数据需要按月拆分。场景推荐方式按某列值拆分成多个文件Python pandas groupby按某列值拆分到同文件不同SheetPython openpyxl/pandas按固定行数拆分Python 分块处理怎么做方式一按列值拆分成多个文件importpandasaspdimportos# 读取总表dfpd.read_excel(rD:\数据\员工总表.xlsx,sheet_name员工信息)# 按部门列拆分output_dirrD:\数据\拆分结果os.makedirs(output_dir,exist_okTrue)[video(video-sNX3LOPR-1783501230813)(type-csdn)(url-https://live.csdn.net/v/embed/525000)(image-https://v-blog.csdnimg.cn/asset/23da3fe1f67a47106d725406cfde9a97/cover/Cover0.jpg)(title-拼多多店群自动化上架方案)]fordept,groupindf.groupby(部门):# 生成文件名清理非法字符safe_namestr(dept).replace(/,_).replace(\\,_).replace(:,_)output_pathos.path.join(output_dir,f{safe_name}.xlsx)group.to_excel(output_path,indexFalse)print(f已生成:{safe_name}.xlsx,{len(group)}行)方式二拆分到同文件不同Sheetimportpandasaspd dfpd.read_excel(rD:\数据\员工总表.xlsx)withpd.ExcelWriter(rD:\数据\按部门拆分.xlsx)aswriter:fordept,groupindf.groupby(部门):# Sheet名最多31字符且不能包含特殊字符safe_namestr(dept)[:31]safe_namesafe_name.replace(/,_).replace(\\,_).replace(?,_)safe_namesafe_name.replace(*,_).replace([,_).replace(],_)group.to_excel(writer,sheet_namesafe_name,indexFalse)print(fSheet:{safe_name},{len(group)}行)方式三按固定行数拆分importpandasaspdimportos dfpd.read_excel(rD:\数据\大表.xlsx)rows_per_file1000# 每个文件1000行output_dirrD:\数据\拆分os.makedirs(output_dir,exist_okTrue)total_rowslen(df)file_count(total_rowsrows_per_file-1)//rows_per_fileforiinrange(file_count):starti*rows_per_file endmin((i1)*rows_per_file,total_rows)chunkdf.iloc[start:end]output_pathos.path.join(output_dir,f数据_{i1:03d}.xlsx)chunk.to_excel(output_path,indexFalse)print(f已生成: 数据_{i1:03d}.xlsx,{len(chunk)}行)完整流程多维度拆分importpandasaspdimportos# yd_input: input_path, output_dir, split_col, split_modeinput_pathyd_input.get(input_path,rD:\数据\总表.xlsx)output_diryd_input.get(output_dir,rD:\数据\拆分结果)split_colyd_input.get(split_col,部门)# 按哪列拆分split_modeyd_input.get(split_mode,file)# file多文件, sheet多Sheetos.makedirs(output_dir,exist_okTrue)# 读取数据dfpd.read_excel(input_path)print(f总数据:{len(df)}行)# 清理拆分列的空值dfdf.dropna(subset[split_col])df[split_col]df[split_col].astype(str).str.strip()# 统计各分组group_countsdf[split_col].value_counts()print(f分组数:{len(group_counts)})print(group_counts.head(10))defsafe_filename(name):清理文件名/Sheet名中的非法字符illegal[/,\\,:,*,?,,,,|]forchinillegal:namename.replace(ch,_)returnname[:31]# Sheet名最多31字符ifsplit_modefile:# 拆分成多个文件forkey,groupindf.groupby(split_col):safe_namesafe_filename(str(key))output_pathos.path.join(output_dir,f{safe_name}.xlsx)group.to_excel(output_path,indexFalse)yd_output{status:ok,mode:file,file_count:len(group_counts),groups:group_counts.to_dict()}elifsplit_modesheet:# 拆分到同文件不同Sheetoutput_pathos.path.join(output_dir,拆分结果.xlsx)# Excel Sheet数量限制最多255个iflen(group_counts)250:yd_output{status:error,message:f分组数{len(group_counts)}超过Sheet上限}else:withpd.ExcelWriter(output_path,engineopenpyxl)aswriter:forkey,groupindf.groupby(split_col):safe_namesafe_filename(str(key))group.to_excel(writer,sheet_namesafe_name,indexFalse)yd_output{status:ok,mode:sheet,sheet_count:len(group_counts),output:output_path}有什么坑坑一文件名包含非法字符导致保存失败现象按部门列拆分某个部门名是研发/测试部生成文件时报错。原因Windows文件名不能包含/ \ : * ? |这些字符。解决统一替换非法字符defsafe_filename(name):illegal[/,\\,:,*,?,,,,|]forchinillegal:namestr(name).replace(ch,_)returnname# 使用safe_namesafe_filename(dept)output_pathos.path.join(output_dir,f{safe_name}.xlsx)坑二分组值为空或NaN导致报错现象拆分列有空值groupby时空值被丢弃或者生成的文件名为nan.xlsx。原因pandas的groupby默认忽略NaN值空值不会产生分组。解决提前处理空值TEMU店群如何管理运营# 方案1删除空值行dfdf.dropna(subset[split_col])# 方案2填充空值df[split_col]df[split_col].fillna(未分类)# 方案3把空字符串也当作未分类df[split_col]df[split_col].replace(,未分类).fillna(未分类)坑三拆分后每个文件的表头格式丢失现象原表有格式化的表头背景色、加粗等拆分后全是默认格式。原因pandas的to_excel不保留原Excel格式只写数据。解决用openpyxl写入并设置格式或先复制模板再写数据importopenpyxlfromopenpyxl.stylesimportFont,PatternFill,Alignmentimportshutil# 模板文件只有格式化表头template_pathrD:\模板\表头模板.xlsxfordept,groupindf.groupby(部门):output_pathos.path.join(output_dir,f{dept}.xlsx)# 复制模板shutil.copy2(template_path,output_path)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/535f9648e13a46d9b76305f46856d4b1.png#pic_center)# 打开复制的文件写入数据wbopenpyxl.load_workbook(output_path)wswb.active# 从第2行开始写数据第1行是模板表头forrow_idx,(_,row_data)inenumerate(group.iterrows(),2):forcol_idx,valueinenumerate(row_data,1):ws.cell(rowrow_idx,columncol_idx).valuevalue wb.save(output_path)坑四按多列组合拆分时分组太多现象按部门岗位两列组合拆分生成了几百个文件每个文件只有几行数据。原因多列组合的分组数 部门数 × 岗位数容易爆炸。解决限制最小分组大小小分组合并到其他# 按多列拆分时小分组合并min_group_size10# 少于10行的分组归入其他# 创建组合键df[分组键]df[部门].astype(str)_df[岗位].astype(str)# 统计各组大小group_sizesdf[分组键].value_counts()# 标记小分组为其他![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a2c9779038f3493686993dfeee12850c.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4106860dc43c45488e800879c1448977.png#pic_center)small_groupsgroup_sizes[group_sizesmin_group_size].index df.loc[df[分组键].isin(small_groups),分组键]其他# 按合并后的键拆分forkey,groupindf.groupby(分组键):output_pathos.path.join(output_dir,f{key}.xlsx)group.drop(columns[分组键]).to_excel(output_path,indexFalse)print(f{key}:{len(group)}行)