openpyxl需手动逐单元格设置样式,无法像pandas一键导出带格式DataFrame;写入后须立即设字体、边框、对齐,合并单元格须先合并再写值,数值显示格式用number_format控制,保存前务必调用wb.save()。

openpyxl 能直接设置单元格样式,但不能像 pandas 那样一键导出带格式的 DataFrame;必须手动写入 + 逐单元格/区域设置样式,否则格式全丢。
写入数据后立即设置字体、边框和对齐方式
openpyxl 的 workbook.active 或 worksheet 对象不自动继承样式,所有格式都得显式赋值。常见错误是先用 ws.append() 写完全部数据,再统一设样式——这容易漏掉首行或合并单元格区域。
- 推荐在写入每行/每单元格后立刻设基础样式,比如:
cell = ws.cell(row=1, column=1, value="姓名") cell.font = Font(name="微软雅黑", bold=True, size=11) cell.alignment = Alignment(horizontal="center", vertical="center") cell.border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin"))
- 批量设整列宽度:用
ws.column_dimensions["A"].width = 15,别依赖自动调整(ws.column_dimensions["A"].auto_size = True不生效) - 中文显示异常?确保字体名用系统已安装的中文字体,如
"微软雅黑"或"SimSun",避免用"Arial"等无中文支持的字体
合并单元格并居中标题时,必须先合并再写入值
顺序反了会报错 MergedCell objects are immutable,且内容只显示在左上角单元格,其余合并区域为空。
- 正确写法:
ws.merge_cells("A1:D1") ws["A1"] = "2024年销售汇总表" ws["A1"].alignment = Alignment(horizontal="center", vertical="center") - 合并后设样式只需作用于左上单元格(如
A1),其他合并单元格无法单独赋值 - 避免跨行合并后又对某一行单独设高:用
ws.row_dimensions[1].height = 30即可,openpyxl 不支持“合并单元格高度自适应”
给数值列加千分位和小数位(如金额、数量)
openpyxl 不识别 pandas 的 style.format,数值写入后默认是原始浮点或整型,显示为科学计数或长小数。
立即学习“Python免费学习笔记(深入)”;
- 用
number_format属性控制显示格式:for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=3, max_col=3): for cell in row: cell.number_format = "#,##0.00" # 金额:千分位+两位小数 for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=4, max_col=4): for cell in row: cell.number_format = "#,##0" # 数量:千分位,无小数 -
number_format只影响显示,不改变底层值(仍可参与 Excel 公式计算) - 注意:
"0.00%"是百分比,"yyyy-mm-dd"是日期,格式字符串必须严格匹配 Excel 内置规则,错一个字符就回退成常规格式
最易被忽略的是:保存前没调用 wb.save("output.xlsx"),或者路径含中文/空格未做转义导致静默失败;还有合并单元格区域与数据范围重叠引发样式错位——建议每次写完一块区域后,用 print(ws["A1"].value, ws["A1"].font.name) 快速验证关键单元格状态。


















