用openpyxl新建excel并写入数据最直接:先pip install openpyxl,再workbook()创建、ws["a1"]=值或ws.cell(row=1,column=1,value=值)写入,最后wb.save("output.xlsx")保存;注意路径需存在、勿提前close、避免字符串数字导致格式错误。

用 openpyxl 新建 Excel 文件并写入数据最直接
Python 写 Excel,openpyxl 是目前最稳妥的选择——它原生支持 .xlsx,能新建工作簿、操作单元格、设置样式,且不依赖 Excel 程序本身。别用 xlsxwriter(不支持读/改已有文件)或 pandas.to_excel(底层还是调 openpyxl 或 xlsxwriter,但封装太深,想精确控制单元格时反而绕弯)。
常见错误是装了包却没导入,或者误以为 Workbook() 会自动保存——它不会,必须显式调用 save()。
- 安装:
pip install openpyxl - 新建空工作簿:
wb = Workbook(),此时默认带一个叫Sheet的工作表 - 获取当前活跃表:
ws = wb.active;也可用ws = wb["Sheet"]或ws = wb.create_sheet("MyData") - 写入单个单元格:
ws["A1"] = "Hello"或ws.cell(row=1, column=2, value="World") - 必须保存:
wb.save("output.xlsx"),路径不存在会报错,目录需提前存在
ws.cell() 和 ws["A1"] 写法区别在哪
两者都能赋值,但行为有关键差异:索引写法 ws["A1"] 只能按 A1 格式定位,而 ws.cell(row=, column=) 支持变量计算,更适合循环写入。
容易踩的坑是混用导致逻辑混乱。比如想批量填第 2 列,用 ws[f"B{i}"] = data[i] 看似方便,但字符串拼接易出错(i 是 int,漏转 str 就报 TypeError),还可能引入注入风险(如果 i 来自不可信输入)。而 ws.cell(row=i+1, column=2, value=data[i]) 更安全、更易调试。
-
ws["A1"]:适合静态位置、手写少量值,可读性高 -
ws.cell():适合动态行列、循环填充、与 pandas 索引对齐 - 注意:行号和列号都从 1 开始,不是 0;列号传数字(1=A, 2=B),别传字母
- 性能上无明显差别,但
cell()在大数据量下更利于 IDE 补全和类型提示
中文乱码、日期变数字、数字被当文本这些怎么防
Excel 本身对数据类型有隐式识别逻辑,openpyxl 默认按 Python 类型直译:str → 文本,int/float → 数值,datetime → 日期。但一旦你传的是字符串格式的数字(如 "123"),Excel 就真当文本处理——左对齐、求和为 0、筛选里带绿色小三角。
常见现象:ws["A1"] = "2024-05-20" → 单元格显示为文本,无法参与日期运算;ws["B1"] = "42.5" → 显示为文本而非浮点数;ws["C1"] = "你好" → 正常,但若字体没设好,打印时可能挤在一起。
- 日期要传
datetime.date或datetime.datetime实例,别传字符串 - 数值统一用
int或float类型,避免引号包裹 - 中文无需额外编码设置,但建议显式设字体避免渲染异常:
ws["A1"].font = Font(name="Microsoft YaHei", size=10) - 如果必须写字符串数字(比如带前导零的编号),再加
number_format = "@"强制文本格式:ws["A1"].number_format = "@"
写完发现文件打不开?检查这三处硬伤
生成的 .xlsx 打不开,90% 是因为文件损坏,根源往往在 save 前做了非法操作,或路径/权限不对。
- 不要在
save()前关闭工作簿(wb.close()会释放资源,再 save 就报ValueError: Save must be called on the workbook) - 确保目标路径父目录存在,
openpyxl不会自动创建多层目录,os.makedirs(os.path.dirname(path), exist_ok=True)得自己加 - 别用 Excel 程序开着同名文件时运行脚本——Windows 下会因文件被占用而写入失败,报
PermissionError: [Errno 13] Permission denied - 小概率:杀毒软件实时扫描拦截写入,临时禁用试试;或换路径(比如写到
/tmp或用户桌面)快速验证是否环境问题
真正麻烦的是写入过程中异常中断(比如 Ctrl+C),可能导致文件残留半成品。建议先写到临时路径,确认无误再 os.replace() 覆盖原文件。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











