如何使用OpenPyXL处理16MB及以上大体积xlsx文件并实现写入操作
OpenPyXL处理16MB及以上大体积Excel文件解决方案
核心思路:优先使用读写分离模式
OpenPyXL的read_only和write_only模式是专门为大文件设计的,两者搭配使用内存占用可以稳定维持在10MB以内,完全可以处理百MB级别的Excel文件。
- 第一步:
read_only模式读取源文件数据,仅加载你需要用到的工作表和行,完成修改逻辑
示例代码:from openpyxl import load_workbook # 只读模式打开大文件,data_only=True直接读取单元格计算后的值,不加载公式 src_wb = load_workbook("your_large_file.xlsx", read_only=True, data_only=True) src_ws = src_wb["你要处理的工作表名称"] processed_rows = [] # 按需遍历行,不要全量加载整个工作表 for row in src_ws.iter_rows(min_row=2, values_only=True): # 跳过表头直接取行值 # 你的修改逻辑示例:将第3列数值乘以2 row_list = list(row) if row_list[2]: row_list[2] *= 2 processed_rows.append(row_list) src_wb.close() - 第二步:
write_only模式写入处理后的数据到新文件
示例代码:from openpyxl import Workbook # 初始化只写模式工作簿 new_wb = Workbook(write_only=True) new_ws = new_wb.create_sheet("处理结果") # 先写入表头(如果需要保留原表头,可从源文件读取第一行写入) new_ws.append(["表头1", "表头2", "表头3", "表头4"]) # 批量写入处理好的行 for row in processed_rows: new_ws.append(row) # 保存文件 new_wb.save("processed_file.xlsx")
若需要在原文件上直接修改
如果要保留原文件的样式、公式、批注等内容,不想生成新文件,可以调整普通加载模式的参数降低内存占用,16MB的文件基本可以正常加载修改:
- 加载文件时添加
keep_links=False参数禁用加载外部链接,data_only=True仅加载单元格值(不需要修改公式的前提下),内存占用可以降低40%以上
示例代码:from openpyxl import load_workbook wb = load_workbook("your_large_file.xlsx", keep_links=False, data_only=True) ws = wb["目标工作表"] # 在这里完成你的修改逻辑,比如修改A2单元格的值 ws["A2"] = "修改后的值" wb.save("your_large_file.xlsx")
注意事项
read_only模式仅支持读取操作,所有写入调用都会失效,不要尝试在该模式下修改文件write_only模式仅支持按行追加写入,不支持随机修改指定单元格位置的内容,有随机修改需求请用普通加载调优方案- 若不需要保留Excel的高级样式和宏,可以先将文件转成CSV格式处理,处理完成后再存回Excel,运行速度会提升3倍以上
内容的提问来源于stack exchange,提问作者Kris Kiel
相关产品推荐
相关产品推荐

