你是否也遇到过这样的场景:有一份Excel工作簿,里面有若干张工作表,每张工作表某一列保存着许多数据,需要按固定数量对这列数据按指定分隔符进行合并。手动来完成的话,效率不仅低下,还很容易出现错误,甚至造成不必要的麻烦。今天就分享一段极简的Python代码,教你如何自动识别工作表名称,工作表名称中的数字,一键实现指定数量单元格的合并。import pandas as pdimport repath = r"E:\序列号.xlsx"dfs = pd.read_excel(path,sheet_name=None,header=None)for sht,df in dfs.items(): if m:= re.match(r"\d+",sht): num = int(m.group()) data_list = df.iloc[:,0].dropna().astype(str).tolist() if not data_list: print(f"工作表{sht}无数据,已跳过") continue result = [] for i in range(0,len(data_list),num): group = data_list[i:i+num] merged = " ".join(group) result.append(merged) output_path = rf"E:\序列号_{num}.xlsx" output_xlsx = pd.DataFrame({'结果':result}) output_xlsx.to_excel(output_path,index=False)
- 动态加载所有工作表:一次性读取Excel文件中所有的工作表。
- 智能分析工作表名称:利用正则表达式提取工作表名称中的数字,将提取到的数字作为需要合并单元格的数量,若单元格数量为空,则自动跳过。
- 批量提取指定数量单元格并写入列表:依次提取指定数量的单元格,合并后写入新的列表。
- 批量输出:处理完成后,指明合并的固定数量,最后自动保存为新的Excel文件。
1、读取所有Excel工作表
dfs = pd.read_excel(path,sheet_name=None,header=None)
- sheet_name=None:当值为None时,表示读取所有工作表。pandas会返回一个字典,键是工作表名,值是DataFrame数据。
2、提取所有工作表名称中的数字
for sht,df in dfs.items(): if m:= re.match(r"\d+",sht): num = int(m.group())
- r"\d+":表示匹配所有数字。\d可以匹配0-9中任意一个数字,+表示一个或多个。
- re.match:表示从工作表名称开头开始匹配。如果数字在中间,可以修改为re.search。
- int(m.group()):m.group()为匹配的结果,再使用int()将其转换为数值类型。
3、提取第一列数据并清洗
data_list = df.iloc[:,0].dropna().astype(str).tolist()
- df.iloc[:,0]:表示第一列数据,索引从0开始。
- .astype(str):转换为字符串,防止数字被误处理。
4、按指定大小分组合并
result = [] for i in range(0,len(data_list),num): group = data_list[i:i+num] merged = " ".join(group) result.append(merged)
- range(0,len(data_list),num):表示从0开始,到len(data_list)结束(不包含),步长为num。在这里,使用range函数可以实现每次跳跃num个数据,配合列表切片data_list[i:i+num]可以轻松实现分组数据的打包。
- merged =" ".join(group):把分组数据按指定要求的分隔符进行合并,这里使用的分隔符为空格。
- result.append(merged):添加到result列表。
5、保存为新的Excel文件
output_path = rf"E:\序列号_{num}.xlsx" output_xlsx = pd.DataFrame({'结果':result}) output_xlsx.to_excel(output_path,index=False)
- 将按固定长度生成的数据保存为单独的工作表,工作表名称包含固定分组的数字,方便查找核对和使用。
这段代码可以将一列数据按固定长度进行分行展示,适合任何需要将固定多行转为一行的批量处理任务,可以实现用最少的代码,解决最繁琐的重复劳动。以后遇到类似的合并需求,只需要修改文件路径和分组规则,几秒钟就能搞定。如果你觉得今天的分享对你有所帮助,欢迎收藏+点赞+转发!