如何使用Python高效复制粘贴27MB(27k行)的大型Excel文件?
优化Excel数据复制性能的方案
原代码的核心问题是逐单元格循环读写,openpyxl对单个单元格的操作开销极高,面对27000行+数百列的量级,必然会极慢。以下是几种高效的优化方案:
方案1:用openpyxl批量读写(无需换库)
通过iter_rows批量读取源工作表的所有数据,再一次性写入目标工作表,大幅减少循环次数和单元格操作开销:
import openpyxl as xl # 用原始字符串避免路径转义问题 filename = r"C:\Users\livin.vincent\OneDrive - Automation Anywhere\Desktop\New folder\New Microsoft Excel.xlsx" filename1 = r"C:\Users\livin.vincent\OneDrive - Automation Anywhere\Desktop\New folder\New Microsoft Excel Worksheet.xlsx" # 只读模式加载源文件,跳过格式等非必要数据,提升读取速度 wb1 = xl.load_workbook(filename, read_only=True) ws1 = wb1.worksheets[0] # 常规模式加载目标文件 wb2 = xl.load_workbook(filename1) ws2 = wb2.worksheets[0] # 批量读取所有行的单元格值 all_rows = list(ws1.iter_rows(values_only=True)) # 逐行写入目标工作表,比逐单元格操作快数十倍 for row_idx, row_data in enumerate(all_rows, start=1): for col_idx, cell_value in enumerate(row_data, start=1): ws2.cell(row=row_idx, column=col_idx).value = cell_value wb2.save(filename1) wb1.close() # 只读模式打开的文件需手动关闭
关键优化点:
read_only=True跳过格式解析,大幅降低源文件加载耗时iter_rows(values_only=True)一次性获取所有数据,减少单次单元格访问的底层开销
方案2:用Pandas处理(大数据量最优解)
Pandas对表格数据的读写做了深度优化,面对大体积Excel,通常几秒就能完成复制:
import pandas as pd filename = r"C:\Users\livin.vincent\OneDrive - Automation Anywhere\Desktop\New folder\New Microsoft Excel.xlsx" filename1 = r"C:\Users\livin.vincent\OneDrive - Automation Anywhere\Desktop\New folder\New Microsoft Excel Worksheet.xlsx" # 读取源工作表数据 df = pd.read_excel(filename, sheet_name=0) # 写入目标文件的指定工作表,替换原有内容 with pd.ExcelWriter(filename1, mode='a', engine='openpyxl', if_sheet_exists='replace') as writer: df.to_excel(writer, sheet_name=list(writer.sheets.keys())[0], index=False)
注意事项:
- 需先安装依赖:
pip install pandas openpyxl - Pandas默认不保留单元格格式(如颜色、公式),仅适合纯数据复制场景
- 若需要追加数据,可将
if_sheet_exists='replace'改为'overlay',需注意行号冲突
方案3:直接复制工作表(需保留格式时使用)
如果允许替换目标工作表,用openpyxl的工作表复制功能,底层批量操作速度极快,还能保留格式:
import openpyxl as xl filename = r"C:\Users\livin.vincent\OneDrive - Automation Anywhere\Desktop\New folder\New Microsoft Excel.xlsx" filename1 = r"C:\Users\livin.vincent\OneDrive - Automation Anywhere\Desktop\New folder\New Microsoft Excel Worksheet.xlsx" wb1 = xl.load_workbook(filename) ws1 = wb1.worksheets[0] wb2 = xl.load_workbook(filename1) # 删除原有目标工作表 target_sheet_name = wb2.sheetnames[0] del wb2[target_sheet_name] # 复制源工作表到目标文件,并重命名为原工作表名 new_ws = wb2.create_sheet(title=target_sheet_name, index=0) # 批量复制单元格数据和格式 for row in ws1.iter_rows(): for cell in row: new_ws[cell.coordinate].value = cell.value new_ws[cell.coordinate].style = cell.style wb2.save(filename1)
内容的提问来源于stack exchange,提问作者Livin Vincent
相关产品推荐
相关产品推荐

