在批量处理Excel报表时,手动冻结窗格效率低下,尤其需要统一配置多个文件的冻结策略。Python配合Spire.XLS库可以自动化完成冻结首行、首列、同时冻结行列、查询冻结状态以及取消冻结等操作。本文用一个库、几个方法,讲清楚冻结窗格的编程实现。
环境准备
需要安装Spire.XLS for Python,这是专用于Excel文件操作的第三方库,支持冻结窗格的所有接口。安装命令:安装完成后在脚本中导入:- from spire.xls import *
- from spire.xls.common import *
复制代码
冻结首行:表头始终可见
表头通常在第一行,冻结后向下滚动页面表头不消失。核心方法 FreezePanes(row, col) 的两个参数含义:row 表示从第几行开始向下滚动(该行及上方被冻结),col 表示从第几列开始向右滚动(该列及左侧被冻结)。因此冻结首行即设置 (2, 1),表示第二行开始滚动,第一行冻结在上方。- # 加载文件
- workbook = Workbook()
- workbook.LoadFromFile("input.xlsx")
- sheet = workbook.Worksheets[0]
- # 冻结首行:第2行第1列以上区域冻结
- sheet.FreezePanes(2, 1)
- workbook.SaveToFile("FreezeTopRow.xlsx", ExcelVersion.Version2013)
- workbook.Dispose()
复制代码 注意:当列参数为1时,表示不对列进行冻结,只冻结行。
冻结首列:横向滚动时标识列固定
常用于含有大量列的数据表,如财务报表,让左侧的标识列始终可见。参数设为 (1, 2),即第一行开始滚动(无行冻结),第二列开始向右滚动(第一列冻结)。- workbook = Workbook()
- workbook.LoadFromFile("input.xlsx")
- sheet = workbook.Worksheets[0]
- # 冻结首列:第1行第2列以左区域冻结
- sheet.FreezePanes(1, 2)
- workbook.SaveToFile("FreezeFirstColumn.xlsx", ExcelVersion.Version2013)
- workbook.Dispose()
复制代码
同时冻结行和列:十字形固定区
若既要固定表头行,又要固定最左侧的标识列(比如前两行和前两列),将两个参数同时设为大于1的值即可。FreezePanes(3, 3) 表示第3行第3列开始滚动,前两行和前两列固定。- workbook = Workbook()
- workbook.LoadFromFile("input.xlsx")
- sheet = workbook.Worksheets[0]
- # 冻结前两行和前两列
- sheet.FreezePanes(3, 3)
- workbook.SaveToFile("FreezeRowsAndColumns.xlsx", ExcelVersion.Version2013)
- workbook.Dispose()
复制代码
获取当前冻结设置
在已有冻结的文件上继续操作前,可用 GetFreezePanes() 方法读取当前冻结的行数和列数。返回值是一个包含两个整数的列表,第一个是冻结行数,第二个是冻结列数。若为0则表示对应方向未冻结。- workbook = Workbook()
- workbook.LoadFromFile("FreezePanes.xlsx")
- sheet = workbook.Worksheets[0]
- freezeInfo = sheet.GetFreezePanes()
- print(f"冻结行数: {freezeInfo[0]}, 冻结列数: {freezeInfo[1]}")
- workbook.Dispose()
复制代码 这个功能在批量处理时很有用,可避免重复或覆盖已存在的冻结配置。
取消冻结
RemovePanes() 方法会清除工作表中所有的冻结设置,恢复为正常滚动状态。无需区分行或列,一次调用即可。- workbook = Workbook()
- workbook.LoadFromFile("FreezePanes.xlsx")
- sheet = workbook.Worksheets[0]
- # 取消所有冻结
- sheet.RemovePanes()
- workbook.SaveToFile("UnfreezePanes.xlsx", ExcelVersion.Version2013)
- workbook.Dispose()
复制代码
总结
核心就是 FreezePanes(row, col) 的两个参数:第一个参数控制行冻结(该行及以上区域固定),第二个参数控制列冻结(该列及以左区域固定)。掌握这个规律后,冻结任意区域、查询状态及取消冻结都可轻松实现。进一步可以扩展为批量处理多个工作表、根据数据内容动态计算冻结位置,集成到自动化报表流程中。 |