openpyxl写入后样式丢失是因为load_workbook()默认不加载样式,必须显式设置keep_styles=true;合并单元格值仅存于左上角;公式须以=开头且用英文符号;日期须为datetime对象。

openpyxl 写入后样式丢失?因为 load_workbook() 默认不加载样式
打开已有 Excel 文件时,load_workbook() 默认跳过样式信息——这是最常被忽略的根源。你读进来的 Cell 对象看似有值,但 cell.font、cell.fill 全是默认空对象,改了也白改。
- 必须显式传参
keep_vba=False(默认)+data_only=False(默认)+ 关键:keep_styles=True - 如果只读不写,
keep_styles=True可省略;但只要后续要改样式,就必须加 - 加了
keep_styles=True会略微拖慢加载速度,尤其大文件,但没它就别想调格式
正确写法:
wb = load_workbook("report.xlsx", keep_styles=True)
批量设置单元格高亮:别用循环逐个赋值 cell.fill
直接对每个 cell 设置 fill 看似直观,但 openpyxl 的 PatternFill 是对象引用,循环里反复 new 同一类型 fill,性能差且容易漏掉深色模式适配。
- 优先用
worksheet.conditional_formatting.add()做条件高亮,比如“数值 > 100 的单元格标红” - 若需固定区域统一高亮,用
worksheet["A1:C10"]切片获取Cell元组,再批量赋值fill - 填色推荐用
PatternFill(start_color="FFEE66", end_color="FFEE66", fill_type="solid"),避免用fgColor这类旧参数
示例(整列标黄):
from openpyxl.styles import PatternFill<br>yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")<br>for cell in ws["B"]: cell.fill = yellow_fill
立即学习“Python免费学习笔记(深入)”;
openpyxl 读取合并单元格:值只在左上角,其余 cell.value 是 None
合并单元格(merge_cells)在 openpyxl 中不是“一个单元格变大”,而是逻辑合并——实际只有左上角单元格存值,其它位置读出来永远是 None,不处理就会丢数据。
- 用
ws.merged_cells.ranges获取所有合并区域,返回的是MergeCellRange对象列表 - 遍历每个 range,用
range.coord(如 "A1:B2")切片取左上角单元格,读它的.value - 写入时若要合并,必须先写值到左上角,再调
ws.merge_cells("A1:B2"),顺序反了会清空值
检查是否合并:
if "A1" in ws.merged_cells: print("A1 被合并了")
为什么 save() 后 Excel 打不开?常见于写入公式或日期格式错误
openpyxl 对公式和日期类型校验松,但 Excel 客户端极其敏感。写错一个括号、少一个引号、日期没转成 datetime 对象,保存后双击打不开或报“发现不可读内容”。
- 公式必须以
=开头,且用英文符号,=SUM(A1:A10)✅,=SUM(A1:A10)❌(中文括号) - 日期/时间必须是
datetime.datetime或datetime.date实例,不能是字符串;否则 Excel 当文本处理,排序、求和全乱 - 写完立刻用
openpyxl.load_workbook()重载一次,看是否报InvalidFileException,比双击排查快得多
安全写日期:
from datetime import datetime<br>ws["A1"].value = datetime(2024, 5, 20, 14, 30)样式和数据绑定比想象中紧,openpyxl 不是“Excel 的 Python 封装”,它维护一套独立的内存模型。改格式前先确认
keep_styles=True,写公式前先手动在 Excel 里敲一遍验证语法,这两步省掉,后面全是坑。










