在处理数据量较大的 Excel 表格时,滚动页面后表头或关键列往往会消失在视野之外,给数据阅读和比对带来不便。Excel 提供的"冻结窗格"功能可以解决这一问题------冻结后的行或列会始终保持在可视区域内,无论怎样滚动都不会移开。当需要批量生成带有冻结设置的报表,或者对多个文件统一配置冻结策略时,使用 Python 自动化完成这项操作将大大节省时间。本文将介绍如何使用 Python 对 Excel 文件进行冻结行、冻结列、冻结单元格以及取消冻结等操作。
环境准备
本文使用 Spire.XLS for Python 来操作 Excel 文件,该库支持对冻结窗格功能的完整控制。通过以下命令安装:
bash
pip install Spire.XLS
安装完成后,在脚本中导入相关模块即可开始使用。
冻结首行
冻结首行是最常见的使用场景。表头通常位于第一行,冻结后无论向下滚动多远,表头始终可见。实现这一操作只需调用 FreezePanes() 方法,将冻结位置设置在第二行第一列即可------该方法的参数含义是"从第几行第几列开始冻结",因此 (2, 1) 表示第一行被冻结在其上方。
python
from spire.xls import *
from spire.xls.common import *
# 创建工作簿并加载文件
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
# 获取第一个工作表
sheet = workbook.Worksheets[0]
# 冻结首行:第 2 行第 1 列以上区域被冻结
sheet.FreezePanes(2, 1)
# 保存文件
workbook.SaveToFile("FreezeTopRow.xlsx", ExcelVersion.Version2013)
workbook.Dispose()

FreezePanes() 方法接收两个整数参数,分别代表冻结区域下方的起始行号和右侧的起始列号。当列参数为 1 时,表示不对列进行冻结,只冻结行。
冻结首列
与冻结首行的思路类似,冻结首列只需将参数调整为 (1, 2),即第一列被冻结在其左侧,行方向不做冻结。这在处理包含大量列的数据表时非常实用,比如财务报表或统计汇总表,冻结标识列后可以横向滚动而始终看到每行对应的名称。
python
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 冻结首列:第 1 行第 2 列以左区域被冻结
sheet.FreezePanes(1, 2)
workbook.SaveToFile("FreezeFirstColumn.xlsx", ExcelVersion.Version2013)
workbook.Dispose()

这里的关键在于理解 FreezePanes() 两个参数的含义:第一个参数控制从哪一行开始向下滚动(该行及其上方被冻结),第二个参数控制从哪一列开始向右滚动(该列及其左侧被冻结)。当行参数为 1 时,没有行被冻结,只有列被冻结。
同时冻结行和列
在实际工作中,同时冻结表头行和标识列的情况也很常见。例如一个数据矩阵,既需要看到每列的字段名,也需要看到每行的记录名。此时只需将 FreezePanes() 的两个参数同时设置为大于 1 的值,即可在指定单元格位置创建十字形的冻结区域。
python
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("input.xlsx")
sheet = workbook.Worksheets[0]
# 冻结前两行和前两列
# 即从第 3 行第 3 列开始,上方和左侧区域保持固定
sheet.FreezePanes(3, 3)
workbook.SaveToFile("FreezeRowsAndColumns.xlsx", ExcelVersion.Version2013)
workbook.Dispose()

上述代码将前两行和前两列同时冻结。滚动时,第一、二行始终显示在顶部,第一、二列始终显示在左侧,中间的数据区域可以自由滚动查看。这种设置对于大型数据表的浏览尤其有帮助。
获取当前冻结设置
在已有冻结设置的文件上继续操作之前,有时需要先了解当前的冻结状态。通过 GetFreezePanes() 方法可以读取工作表当前的冻结行列索引,返回值是一个包含两个元素的列表,分别是冻结行数和冻结列数。如果返回值为 0,则表示对应方向上没有冻结。
python
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("FreezePanes.xlsx")
sheet = workbook.Worksheets[0]
# 获取当前冻结设置
freezeInfo = sheet.GetFreezePanes()
row_index = freezeInfo[0]
col_index = freezeInfo[1]
print(f"冻结行数: {row_index}, 冻结列数: {col_index}")
workbook.Dispose()
这个功能在批量处理文件时尤其有用------可以在修改冻结设置前先检查当前状态,避免重复操作或覆盖已有的冻结配置。
取消冻结
取消冻结的操作十分简洁,只需调用 RemovePanes() 方法即可将工作表上的所有冻结设置全部清除,恢复为正常的可滚动状态。
python
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("FreezePanes.xlsx")
sheet = workbook.Worksheets[0]
# 取消所有冻结设置
sheet.RemovePanes()
workbook.SaveToFile("UnfreezePanes.xlsx", ExcelVersion.Version2013)
workbook.Dispose()
RemovePanes() 方法会一次性移除行冻结和列冻结,不需要分别操作。在生成临时报表或导出给其他系统使用的文件时,有时需要先清除冻结再重新设置,这个方法就可以派上用场。
总结
本文介绍了使用 Python 操作 Excel 冻结窗格的几个核心场景:冻结首行、冻结首列、同时冻结多行多列、查询当前冻结状态以及取消冻结。这些操作的核心都围绕 FreezePanes() 方法的两个参数展开,理解了它们的含义,就能灵活组合出各种冻结策略。
在此基础上,还可以进一步探索针对多个工作表批量设置冻结、根据数据内容动态判断冻结位置,或将冻结配置集成到自动化报表生成流程中。掌握这些技巧,有助于提升 Excel 文件处理的自动化水平和用户体验。