影刀RPA Excel的Sheet管理:新增、复制、重命名、删除
影刀RPA Excel的Sheet管理:新增、复制、重命名、删除
作者:林焱
一个Excel文件往往不止一个Sheet。采集数据按日期分Sheet存储、报表按部门分Sheet展示、原始数据和清洗结果放在不同Sheet里。很多新手只会操作固定的"Sheet1",一旦Sheet结构变了流程就崩了。
这篇文章把Excel Sheet管理的各种操作讲全——新增、复制、重命名、删除、遍历,让你能灵活管理多Sheet工作簿。
一、获取Sheet列表
1.1 获取所有Sheet名
在做任何Sheet操作前,先知道文件里有哪些Sheet:
importopenpyxl wb=openpyxl.load_workbook("D:\\data\\product.xlsx")sheet_names=wb.sheetnames# 返回Sheet名列表# 例如:['Sheet1', 'Sheet2', '销售数据']set_variable("sheet_names",sheet_names)或者用影刀指令:
【获取Excel Sheet列表】 文件路径:D:\data\product.xlsx → 输出到变量 sheet_list1.2 判断Sheet是否存在
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")if"销售数据"inwb.sheetnames:print("Sheet存在")else:print("Sheet不存在")坑:Sheet名大小写敏感
"销售数据"和"销售数据 "(末尾有空格)是两个不同的Sheet名。从Excel复制Sheet名时注意不要带多余空格。
二、新增Sheet
2.1 基本新增
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")# 在末尾新增Sheetws=wb.create_sheet("新Sheet")# 在指定位置新增(index=0表示最前面)ws=wb.create_sheet("新Sheet",0)# 新增Sheet并填充表头ws["A1"]="商品名"ws["B1"]="价格"ws["C1"]="库存"wb.save("D:\\data\\product.xlsx")2.2 新增Sheet并写入数据
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb.create_sheet("今日数据")# 写入表头headers=["商品名","价格","库存","状态"]forcol,headerinenumerate(headers,1):ws.cell(row=1,column=col,value=header)# 写入数据data=get_variable("today_data")forrow_idx,row_datainenumerate(data,2):forcol_idx,valueinenumerate(row_data,1):ws.cell(row=row_idx,column=col_idx,value=value)wb.save("D:\\data\\product.xlsx")2.3 按日期自动创建Sheet
店群矩阵自动化突破运营极限!
每天采集的数据存到以日期命名的Sheet里:
fromdatetimeimportdatetimeimportopenpyxl today=datetime.now().strftime("%Y%m%d")filepath="D:\\data\\daily_collection.xlsx"# 文件不存在则创建importosifnotos.path.exists(filepath):wb=openpyxl.Workbook()wb.remove(wb.active)# 删除默认Sheetelse:wb=openpyxl.load_workbook(filepath)# 如果今天的Sheet不存在,创建它iftodaynotinwb.sheetnames:ws=wb.create_sheet(today)# 写入表头ws.append(["序号","商品名","价格","采集时间"])else:ws=wb[today]# 写入数据data=get_variable("collected_data")forrowindata:ws.append(row)wb.save(filepath)坑:Sheet名不能包含特殊字符
Excel Sheet名不能包含\ / ? * [ ] :这些字符。如果用日期做Sheet名,用20260701格式而不是2026/07/01(斜杠非法)。
坑:Sheet名最多31个字符
Excel限制Sheet名最多31个字符。超长名称会被截断或报错。
三、复制Sheet
3.1 在同一文件内复制
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")# 复制"Sheet1"为新Sheet"Sheet1副本"ws_source=wb["Sheet1"]ws_copy=wb.copy_worksheet(ws_source)ws_copy.title="Sheet1副本"wb.save("D:\\data\\product.xlsx")坑:copy_worksheet只复制值和格式,不复制图表和图片
openpyxl的copy_worksheet只复制单元格的值、格式、公式。图表、图片、数据验证等不会被复制。如果需要完整复制,用其他方案。
3.2 跨文件复制Sheet
把一个文件的Sheet复制到另一个文件:
importopenpyxlfromcopyimportcopy# 源文件和目标文件wb_source=openpyxl.load_workbook("D:\\data\\source.xlsx")wb_target=openpyxl.load_workbook("D:\\data\\target.xlsx")ws_source=wb_source["销售数据"]ws_target=wb_target.create_sheet("销售数据")# 逐单元格复制值和格式forrowinws_source.iter_rows():forcellinrow:new_cell=ws_target.cell(row=cell.row,column=cell.column,value=cell.value)ifcell.has_style:new_cell.font=copy(cell.font)new_cell.border=copy(cell.border)new_cell.fill=copy(cell.fill)new_cell.number_format=cell.number_format new_cell.alignment=copy(cell.alignment)# 复制列宽forcol_letter,diminws_source.column_dimensions.items():ws_target.column_dimensions[col_letter].width=dim.width# 复制行高forrow_num,diminws_source.row_dimensions.items():ws_target.row_dimensions[row_num].height=dim.height wb_target.save("D:\\data\\target.xlsx")3.3 用pandas跨文件复制
importpandasaspd# 读取源文件的Sheetdf=pd.read_excel("D:\\data\\source.xlsx",sheet_name="销售数据")# 写入目标文件的新Sheetwithpd.ExcelWriter("D:\\data\\target.xlsx",engine="openpyxl",mode="a")aswriter:df.to_excel(writer,sheet_name="销售数据",index=False)用pandas更简洁,但只复制数据不复制格式。
四、重命名Sheet
4.1 基本重命名
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")ws=wb["Sheet1"]ws.title="原始数据"wb.save("D:\\data\\product.xlsx")4.2 批量重命名
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")# 给所有Sheet加前缀"2026_"forwsinwb.worksheets:ws.title=f"2026_{ws.title}"wb.save("D:\\data\\product.xlsx")坑:重命名后引用失效
重命名Sheet后,之前代码中用旧Sheet名引用的地方需要全部更新。建议用变量管理Sheet名:
sheet_name="原始数据"ws=wb[sheet_name]# 一处定义,到处引用五、删除Sheet
5.1 基本删除
wb=openpyxl.load_workbook("D:\\data\\product.xlsx")# 删除指定Sheetws=wb["临时数据"]wb.remove(ws)wb.save("D:\\data\\product.xlsx")5.2 删除多个Sheet
# 删除所有以"临时"开头的Sheetsheets_to_delete=[wsforwsinwb.worksheetsifws.title.startswith("临时")]forwsinsheets_to_delete:wb.remove(ws)wb.save("D:\\data\\product.xlsx")5.3 只保留指定Sheet
# 只保留"最终结果"Sheet,删除其他所有keep_sheet="最终结果"forwsinwb.worksheets:ifws.title!=keep_sheet:wb.remove(ws)wb.save("D:\\data\\product.xlsx")坑:删除最后一个Sheet报错
Excel文件至少要有一个Sheet。如果你删除了所有Sheet,保存会报错。删除前检查是否是最后一个Sheet。
坑:删除Sheet是不可逆的
删除Sheet后保存文件,数据就真的没了。删除前先备份文件,或者把要删除的Sheet数据先复制到其他Sheet。
六、遍历所有Sheet
6.1 遍历读取数据
wb=openpyxl.load_workbook("D:\\data\\multi_sheet.xlsx")all_data={}forwsinwb.worksheets:sheet_data=[]forrowinws.iter_rows(values_only=True):sheet_data.append(list(row))all_data[ws.title]=sheet_data set_variable("all_data",all_data)6.2 用pandas读取所有Sheet
importpandasaspd# 读取所有Sheet,返回字典{Sheet名: DataFrame}all_sheets=pd.read_excel("D:\\data\\multi_sheet.xlsx",sheet_name=None)[video(video-pgyUGAyv-1783502244785)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]forsheet_name,dfinall_sheets.items():print(f"Sheet:{sheet_name}, 行数:{len(df)}")# 处理每个Sheet的数据6.3 合并所有Sheet的数据
importpandasaspd# 读取所有Sheetall_sheets=pd.read_excel("D:\\data\\multi_sheet.xlsx",sheet_name=None)# 合并所有Sheet(假设结构相同)df_all=pd.concat(all_sheets.values(),ignore_index=True)# 写入新文件df_all.to_excel("D:\\data\\merged.xlsx",index=False)坑:不同Sheet的列结构不一致
合并时如果列结构不同(列名不同、列数不同),合并后会有大量NaN。合并前统一列名或用映射表对齐。
七、Sheet的实用管理策略
7.1 按月分Sheet存储
fromdatetimeimportdatetimeimportopenpyxl month=datetime.now().strftime("%Y-%m")filepath="D:\\data\\monthly_report.xlsx"wb=openpyxl.load_workbook(filepath)ifos.path.exists(filepath)elseopenpyxl.Workbook()ifmonthnotinwb.sheetnames:ws=wb.create_sheet(month)ws.append(["日期","收入","支出","利润"])else:ws=wb[month]# 追加今日数据ws.append([datetime.now().strftime("%Y-%m-%d"),10000,6000,4000])wb.save(filepath)7.2 数据分类分Sheet
importpandasaspd df=pd.read_excel("D:\\data\\all_sales.xlsx")# 按地区分Sheetwithpd.ExcelWriter("D:\\data\\sales_by_region.xlsx")aswriter:forregionindf["地区"].unique():df_region=df[df["地区"]==region]df_region.to_excel(writer,sheet_name=region,index=False)7.3 Sheet数量管理
数据积累太多Sheet会影响文件大小和打开速度。定期归档旧Sheet:
importopenpyxlfromdatetimeimportdatetime,timedelta wb=openpyxl.load_workbook("D:\\data\\daily_collection.xlsx")# 删除3个月前的Sheetcutoff=(datetime.now()-timedelta(days=90)).strftime("%Y%m%d")forwsinwb.worksheets:# 假设Sheet名是日期格式如"20260401"ifws.title.isdigit()andws.title<cutoff:wb.remove(ws)print(f"已删除旧Sheet:{ws.title}")wb.save("D:\\data\\daily_collection.xlsx")八、避坑清单
坑1:操作后忘记save
所有Sheet操作(新增、删除、重命名等)都需要调用wb.save()才生效。很多人操作完了忘了保存,关闭后发现什么都没变。
坑2:文件被占用无法保存
Excel文件正被打开,wb.save()报错"文件被占用"。保存前确保文件没被其他程序打开。
坑3:Sheet名冲突
创建Sheet时用了已存在的Sheet名,会报错或者覆盖。创建前先检查:
ifsheet_nameinwb.sheetnames:# 已存在,选择覆盖或改名wb.remove(wb[sheet_name])ws=wb.create_sheet(sheet_name)坑4:pandas写入时Sheet名包含特殊字符
pandas的to_excel中Sheet名不能超过31个字符,也不能包含特殊字符。写入前清洗Sheet名。
坑5:大量Sheet导致文件打开极慢
一个文件有几十上百个Sheet时,打开和保存都很慢。定期归档,把旧Sheet移到归档文件中。
