openpyxl.load_workbook() 不能直接保存到原路径,因只读模式不支持写入,而可写模式下若文件被占用会抛 PermissionError;建议关闭 Excel 进程、用绝对路径,并通过临时路径保存后原子替换。

用 openpyxl.load_workbook() 打开文件时为什么不能直接保存到原路径?
因为 load_workbook() 默认以只读模式(read_only=True)打开时,不支持写入;而设为 read_only=False(默认)时,若文件正被 Excel 程序或其他进程占用,会抛出 PermissionError: [Errno 13] Permission denied。常见于 Windows 上双击打开过该文件但没关掉。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确保 Excel 应用程序完全关闭目标文件(任务管理器里也检查是否有隐藏的
EXCEL.EXE进程) - 优先用绝对路径,避免相对路径导致工作目录错位:
workbook = load_workbook(r"C:\data\report.xlsx") - 如需覆盖原文件,先用
workbook.save()写入临时路径,再用os.replace()原子替换,防止中断损坏原文件
批量修改单元格值:遍历 worksheet.iter_rows() 还是直接索引 ws["A1"]?
取决于数据结构和性能要求。用 iter_rows() 更适合按行逻辑处理(比如每行校验、转换),而直接索引(如 ws["B5"].value = "new")更直观但硬编码列名/行号易出错。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 若修改固定列(如所有第2列非空单元格),用
for row in ws.iter_rows(min_col=2, max_col=2, min_row=2):配合cell.value安全赋值 - 避免在循环中反复调用
ws.cell(row=i, column=j)——它比直接ws[f"A{i}"]略慢,且容易因索引越界报ValueError - 批量写入大量数据时,先收集变更(如字典
{(row,col): new_val}),再统一写入,比逐个赋值快 3–5 倍
样式批量应用失败?注意 Font、PatternFill 和 Alignment 的“不可复用性”
OpenPyXL 中样式对象(如 Font)不是单例,每次新建都生成新实例。若对 1000 个单元格分别创建相同 Font(bold=True),内存占用陡增,且部分旧版本会因样式重复导致 Excel 打开报错。
诊断并修复涉及公式、命名范围、Power Query 刷新、数据透视表、VBA/宏保存等问题的 Microsoft Excel XLSX 工作簿
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 预先定义复用样式变量:
bold_font = Font(bold=True); center_align = Alignment(horizontal="center") - 样式赋值必须作用于
cell对象本身,而非整列/整行:ws["A1"].font = bold_font✅,ws.column_dimensions["A"].font = bold_font❌(无效) - 合并单元格后应用样式,需对左上角单元格赋值,其余位置忽略——否则可能触发
AttributeError: 'MergedCell' object has no attribute 'font'
保存后公式变成数值?如何保留公式并强制重算?
OpenPyXL 默认将公式结果(而非公式本身)写入单元格,除非你显式读取 cell.data_type == "f" 并用 cell.value 获取公式字符串。更关键的是:它不执行 Excel 引擎计算,所以依赖公式的下游值不会自动更新。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 读取公式内容:用
cell.value(当cell.data_type == "f"时返回公式字符串,如"=SUM(A1:A10)") - 写入公式:直接赋值字符串即可,
ws["C1"].value = "=A1+B1",无需额外标记 - 如需强制重算,OpenPyXL 不支持;必须导出后用 Excel 打开另存,或改用
win32com调用 Excel COM 接口(Windows 专属)
真正麻烦的不是写法,而是跨平台一致性——Linux/macOS 下无法调用 Excel 引擎,公式字段只能靠人工验证逻辑是否自洽。

















