Python Excel优化:按供应商拆分数据写入指定工作表效率问题
问题描述
需要根据「Vendor Name」列的唯一值拆分Excel文件(File2,对应DataFrame为df),并将每个子集存入Excel工作簿(File1,路径为blank_order_book_path)的现有工作表「Data Dump」中,最终保存为单独文件到指定文件夹。具体步骤:
- 按供应商拆分
df - 为每个唯一供应商创建
File1的副本 - 将拆分后的数据粘贴到副本的「Data Dump」工作表
- 将新文件保存到
Downloads/VendorSplittingApp文件夹
当前实现效率极低,耗时久,偶尔还会运行异常。
核心代码
suppliers = df['Vendor Name'].unique() for supplier in suppliers: if isinstance(supplier, str): safe_supplier = supplier.replace('/', '_') supplier_df = df[df['Vendor Name'] == supplier].copy() wb = load_workbook(blank_order_book_path) ws = wb["Data Dump"] data = supplier_df.columns.tolist() + supplier_df.values.tolist() for row_idx, row in enumerate(data, 1): for col_idx, value in enumerate(row, 1): ws.cell(row=row_idx, column=col_idx, value=value) wb.save(f"{safe_supplier}.xlsx") print("All files saved to Downloads Folder")
现存问题
- 处理耗时极久
- 偶尔无法正常运行
优化方案
1. 核心优化思路
原代码效率低的根源是逐单元格写入+循环内重复保存,改成批量写入数据,调整保存时机,同时用更高效的分组逻辑处理供应商数据。
2. 优化后代码
import os import pandas as pd from openpyxl import load_workbook # 创建目标文件夹,不存在则自动生成 target_folder = os.path.expanduser("~/Downloads/VendorSplittingApp") os.makedirs(target_folder, exist_ok=True) # 按供应商分组处理,替代循环筛选 for supplier, supplier_df in df.groupby('Vendor Name'): if not isinstance(supplier, str): continue # 处理供应商名称中的特殊字符,避免路径报错 safe_supplier = supplier.replace('/', '_') save_path = os.path.join(target_folder, f"{safe_supplier}.xlsx") # 加载空白工作簿 wb = load_workbook(blank_order_book_path) ws = wb["Data Dump"] # 清空Data Dump工作表原有数据(若空白工作簿有模板内容,可保留此步骤;无则删除) ws.delete_rows(1, ws.max_row) # 用pandas批量写入数据,直接覆盖到指定工作表 supplier_df.to_excel(wb, sheet_name="Data Dump", index=False, startrow=0, startcol=0) # 所有数据写入完成后再保存,避免重复IO操作 wb.save(save_path) print(f"所有文件已保存到 {target_folder}")
3. 优化点说明
- groupby分组:比循环逐个筛选供应商更高效,减少DataFrame切片的性能开销
- 批量写入:利用pandas的
to_excel批量写入逻辑,速度远快于逐单元格赋值 - 调整保存时机:仅在所有数据写入完成后保存一次,避免循环内重复触发文件IO
- 文件夹预创建:用
os.makedirs确保目标路径存在,避免因文件夹缺失导致运行异常
内容的提问来源于stack exchange,提问作者HP's PPTs
相关产品推荐
相关产品推荐

