openpyxl写入指定单元格前必须先加载或新建工作表:需通过load_workbook()加载文件并获取ws=wb['sheet1']或wb.active,或用workbook()新建后操作wb.active;否则ws为none会导致attributeerror。

写入指定单元格前必须先加载或新建工作表
Openpyxl 不像 pandas 那样能直接“追加”到某个单元格而不关心上下文;它要求你明确操作的是哪个 Worksheet 对象,且该对象必须已存在(从文件加载)或已创建(新建工作簿)。如果跳过这步直接调用 ws['A1'] = value,会报 AttributeError: 'NoneType' object has no attribute '__setitem__'——本质是 ws 为 None。
实操建议:
- 用
load_workbook()加载已有 Excel 文件,并通过wb['Sheet1']或wb.active获取目标工作表 - 若从零开始,用
Workbook()新建,再用wb.create_sheet()或直接操作wb.active - 注意:新建的
Workbook()默认带一个名为Sheet的工作表(不是Sheet1),名称可通过ws.title检查
支持三种单元格定位方式:坐标字符串、行列索引、cell() 方法
Openpyxl 提供了灵活但语义不同的写入入口,选错容易覆盖错位置或抛出 ValueError。比如 ws['Z1000'] = 42 看似简单,但如果列号超出 Excel 限制(XFD 列,即 16384 列),运行时不会报错,但保存后 Excel 打开会提示“已修复”,数据可能丢失。
推荐按场景选择:
- 固定小范围写入(如报告头):直接用坐标字符串,如
ws['B2'] = '模型准确率',可读性高 - 循环写入行列规律数据:用
ws.cell(row=3, column=5, value=0.92),row和column从 1 开始计数,比手动拼'E3'更安全 - 需要动态计算列号(如第 27 列是
AA):别自己转,直接传column=27给cell(),Openpyxl 内部自动处理
写入数值、字符串、日期、公式要注意类型和格式
Openpyxl 会尝试推断值类型,但不总是可靠。例如把字符串 '123' 写入单元格,Excel 可能自动识别为数字并左对齐变右对齐;把 datetime.datetime 对象写入,若未设置单元格格式,打开后可能显示为一串浮点数(Excel 底层日期序列)。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
关键控制点:
- 强制当文本:赋值前加空字符串,如
ws['C4'] = "'" + str(123),或设ws['C4'].number_format = '@' - 日期时间:直接写
datetime对象即可,但建议同步设格式,如ws['D5'].number_format = 'yyyy-mm-dd hh:mm' - 公式:以
=开头的字符串,如ws['E1'] = '=SUM(A1:A10)';注意公式中引用的单元格必须存在,否则打开 Excel 会显示#REF! - 布尔值:写
True/False即可,Openpyxl 自动映射为 Excel 的 TRUE/FALSE,无需引号
保存前务必调用 wb.save(),且路径不能被 Excel 进程占用
这是最常被忽略的一步:变量赋值只是修改内存中的 Workbook 对象,不触发磁盘写入。没调 wb.save('output.xlsx'),所有操作都白做。更隐蔽的问题是——如果目标文件正被 Excel 程序打开,save() 会抛出 PermissionError: [Errno 13] Permission denied,而不是友好提示。
稳妥做法:
- 始终在写入逻辑结束后显式调用
wb.save() - 避免覆盖正在打开的文件;开发时可用不同文件名测试,如
output_v2.xlsx - 若需覆盖原文件,确保 Excel 已关闭,或改用临时路径 + 文件替换(
shutil.move()) - 大文件写入耗时明显,不要在循环里反复
save(),一次写完再存
真正麻烦的不是“怎么写进单元格”,而是“写进去之后 Excel 能不能正常打开、数值有没有被意外转换、别人双击编辑时会不会崩”。Openpyxl 的自由度高,也意味着更多隐式行为要主动干预——尤其是日期格式、数字精度、公式引用范围这些看似细枝末节的地方,往往决定下游是否要手动修半天表格。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










