Python Excel设置冻结窗格:冻结表头行和首列
用openpyxl的freeze_panes冻结首行表头、冻结首列,滚动长表时表头始终可见,附完整代码。
场景痛点
一张表几百行,往下滚找数据,滚着滚着就不知道每列叫什么了——因为表头被滚上去了。手动点「视图→冻结窗格→冻结首行」每张表都点一次。用 openpyxl 一行代码设 freeze_panes,导出的表自动带冻结,用户打开就能直接看。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
def demo_freeze(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 冻结首行:从 A2 开始冻结,第 1 行始终可见
ws.freeze_panes = "A2"
# 2) 同时冻结首行和首列:B2 表示冻结 1 行 + 1 列
# ws.freeze_panes = "B2"
# 3) 冻结前 2 行 + 前 3 列:D3
# ws.freeze_panes = "D3"
# 4) 取消冻结:赋值 None
# ws.freeze_panes = None
# 5) 多张表一起设
# for sheet in wb.worksheets:
# sheet.freeze_panes = "A2"
print("当前冻结位置:", ws.freeze_panes)
wb.save(file_path)
print("冻结窗格已设置")
if __name__ == "__main__":
demo_freeze(r"D:\reports\销售明细.xlsx")
代码讲解
ws.freeze_panes = "A2"的含义:冻结线画在 A2 上方和左侧,所以第 1 行(表头)和 A 列左边的内容都不动。- 想只冻结首行,写
"A2";想冻结首行+首列,写"B2";想冻结前 2 行+前 3 列,写"D3"——字母之前的列、数字之前的行都会被冻住。 - 传
None取消冻结。 - 多张表统一设置就循环
wb.worksheets,给每张都赋同样的freeze_panes。 - 这是个非常轻量的设置,写表时顺手加一行,用户体验立刻提升。
运行结果
打开文件,往下滚动时第 1 行表头始终钉在窗口顶部;如果设成 "B2",往右滚动时 A 列也固定。控制台打印当前冻结位置用于确认。
注意事项
freeze_panes是一个单元格地址字符串,表示「这个格子左上角为冻结线」,不是「冻结到第几行」。- 合并单元格的情况下冻结行为可能和预期不同,建议冻结前不要在表头做跨列合并以外的复杂合并。
- 冻结不影响打印,只影响 Excel 里的浏览体验。
- WPS、Excel 都能正确识别 openpyxl 写的冻结窗格,不需要额外兼容。
- 已经设过冻结的文件,再次赋值会覆盖旧设置,不会叠加。

更新时间:2026-09-15 09:07:07