openpyxl无法实现流式写入或局部加载,必须将整个工作簿解析进内存。read_only=true和data_only=true均不能避免全量加载,仅有限优化读取行为;减小开销需换用csv、pyxlsb等替代方案或调用excel进程。

Openpyxl 无法真正“不加载整个 Excel”
直接说结论:openpyxl 没有流式写入或局部加载模式。它必须将整个工作簿解析进内存,哪怕你只改一个单元格,load_workbook() 仍会读取所有 sheet 结构、样式、公式、合并单元格等信息。所谓“不加载整个 Excel”在 openpyxl 中是个常见误解——它不支持类似 csv 那样的逐行流式处理。
为什么 data_only=True 或 read_only=True 不能帮你跳过加载?
这两个参数常被误认为能“轻量加载”,实际作用有限:
-
read_only=True:只适用于**纯读取**场景,且仍需解析整个 XML 结构(只是不构建完整对象图),一旦调用ws['A1'].value或修改单元格,openpyxl就会触发隐式加载,失去只读优势 -
data_only=True:仅影响公式计算结果的读取(跳过公式本身),但依然要加载全部单元格数据和格式定义 - 两者都不能避免内存占用随文件大小线性增长,10MB 的 Excel 通常占用 50–100MB 内存
真想减小开销?换工具或换策略
如果你的目标是“只改几个单元格,不为 10 万行数据付出内存代价”,openpyxl 不是合适选择。可行路径只有两条:
-
用
xlrd2+xlwt(仅限 .xls):老式二进制格式支持更轻量读写,但已不维护,且不支持 .xlsx -
用
pyxlsb(仅限 .xlsb):二进制格式,读写快、内存低,但只支持 Excel 二进制格式(.xlsb),不是常规 .xlsx -
用
python-csv处理纯数据场景:如果 Excel 实际是“导出报表”,无公式/样式/合并单元格,直接保存为 CSV,用csv模块 +fileinput或临时文件替换指定行列,内存开销恒定 -
用
win32com(Windows)或applescript(macOS)调用 Excel 进程:真正只操作可见区域,但依赖 Office 安装、慢、不可靠、不适合服务器环境
如果非要用 openpyxl,这些操作能稍微缓解压力
虽无法绕过全量加载,但可减少后续开销:
- 关闭不需要的功能:
load_workbook(filename, read_only=False, data_only=False, keep_vba=False, keep_links=False)—— 显式关掉 VBA 和外部链接解析 - 改完立刻释放引用:
wb.close(),避免对象滞留;不要用del wb,Python 垃圾回收不一定及时 - 避免遍历全表:
ws.iter_rows(min_row=5, max_row=5, min_col=2, max_col=2)比ws.iter_rows()省 CPU,但不省内存(行对象仍被构造) - 批量写入比单单元格赋值稍快:
ws.append([val1, val2])或ws['A1'] = 'x'; ws['B1'] = 'y'比循环ws.cell(row=i, column=j).value = ...快,因减少了属性查找开销
真正卡住你的从来不是“怎么改单元格”,而是“为什么改一个格子要吃 200MB 内存”。这个问题的答案不在文档里,在格式选型里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











