我的知识记录

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 写的冻结窗格,不需要额外兼容。
  • 已经设过冻结的文件,再次赋值会覆盖旧设置,不会叠加。

Python Excel设置冻结窗格:冻结表头行和首列

标签:

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

上一篇:Python Excel分组统计求和count mean

下一篇:Python Excel按条件筛选数据