查看: 134|回复: 3

Python使用Spire.XLS实现Excel冻结窗格(行/列/单元

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在批量处理Excel报表时,手动冻结窗格效率低下,尤其需要统一配置多个文件的冻结策略。Python配合Spire.XLS库可以自动化完成冻结首行、首列、同时冻结行列、查询冻结状态以及取消冻结等操作。本文用一个库、几个方法,讲清楚冻结窗格的编程实现。

环境准备
需要安装Spire.XLS for Python,这是专用于Excel文件操作的第三方库,支持冻结窗格的所有接口。安装命令:
  1. pip install Spire.XLS
复制代码
安装完成后在脚本中导入:
  1. from spire.xls import *
  2. from spire.xls.common import *
复制代码

冻结首行:表头始终可见
表头通常在第一行,冻结后向下滚动页面表头不消失。核心方法 FreezePanes(row, col) 的两个参数含义:row 表示从第几行开始向下滚动(该行及上方被冻结),col 表示从第几列开始向右滚动(该列及左侧被冻结)。因此冻结首行即设置 (2, 1),表示第二行开始滚动,第一行冻结在上方。
  1. # 加载文件
  2. workbook = Workbook()
  3. workbook.LoadFromFile("input.xlsx")
  4. sheet = workbook.Worksheets[0]
  5. # 冻结首行:第2行第1列以上区域冻结
  6. sheet.FreezePanes(2, 1)
  7. workbook.SaveToFile("FreezeTopRow.xlsx", ExcelVersion.Version2013)
  8. workbook.Dispose()
复制代码
注意:当列参数为1时,表示不对列进行冻结,只冻结行。

冻结首列:横向滚动时标识列固定
常用于含有大量列的数据表,如财务报表,让左侧的标识列始终可见。参数设为 (1, 2),即第一行开始滚动(无行冻结),第二列开始向右滚动(第一列冻结)。
  1. workbook = Workbook()
  2. workbook.LoadFromFile("input.xlsx")
  3. sheet = workbook.Worksheets[0]
  4. # 冻结首列:第1行第2列以左区域冻结
  5. sheet.FreezePanes(1, 2)
  6. workbook.SaveToFile("FreezeFirstColumn.xlsx", ExcelVersion.Version2013)
  7. workbook.Dispose()
复制代码

同时冻结行和列:十字形固定区
若既要固定表头行,又要固定最左侧的标识列(比如前两行和前两列),将两个参数同时设为大于1的值即可。FreezePanes(3, 3) 表示第3行第3列开始滚动,前两行和前两列固定。
  1. workbook = Workbook()
  2. workbook.LoadFromFile("input.xlsx")
  3. sheet = workbook.Worksheets[0]
  4. # 冻结前两行和前两列
  5. sheet.FreezePanes(3, 3)
  6. workbook.SaveToFile("FreezeRowsAndColumns.xlsx", ExcelVersion.Version2013)
  7. workbook.Dispose()
复制代码

获取当前冻结设置
在已有冻结的文件上继续操作前,可用 GetFreezePanes() 方法读取当前冻结的行数和列数。返回值是一个包含两个整数的列表,第一个是冻结行数,第二个是冻结列数。若为0则表示对应方向未冻结。
  1. workbook = Workbook()
  2. workbook.LoadFromFile("FreezePanes.xlsx")
  3. sheet = workbook.Worksheets[0]
  4. freezeInfo = sheet.GetFreezePanes()
  5. print(f"冻结行数: {freezeInfo[0]}, 冻结列数: {freezeInfo[1]}")
  6. workbook.Dispose()
复制代码
这个功能在批量处理时很有用,可避免重复或覆盖已存在的冻结配置。

取消冻结
RemovePanes() 方法会清除工作表中所有的冻结设置,恢复为正常滚动状态。无需区分行或列,一次调用即可。
  1. workbook = Workbook()
  2. workbook.LoadFromFile("FreezePanes.xlsx")
  3. sheet = workbook.Worksheets[0]
  4. # 取消所有冻结
  5. sheet.RemovePanes()
  6. workbook.SaveToFile("UnfreezePanes.xlsx", ExcelVersion.Version2013)
  7. workbook.Dispose()
复制代码

总结
核心就是 FreezePanes(row, col) 的两个参数:第一个参数控制行冻结(该行及以上区域固定),第二个参数控制列冻结(该列及以左区域固定)。掌握这个规律后,冻结任意区域、查询状态及取消冻结都可轻松实现。进一步可以扩展为批量处理多个工作表、根据数据内容动态计算冻结位置,集成到自动化报表流程中。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用Spire.XLS实现Excel冻结窗格(行/列/单元

感谢楼主的详细教程,代码示例很清晰,特别是FreezePanes(row, col)两个参数的含义解释得很到位。想问一下,如果我要对同一个工作簿里的多个工作表分别设置不同的冻结区域,在循环处理时有什么注意事项吗?比如是否需要每次重新获取工作表对象再调用FreezePanes?谢谢。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用Spire.XLS实现Excel冻结窗格(行/列/单元

很实用的教程!`FreezePanes(row, col)` 的参数逻辑讲得很清楚,row 控制行冻结区域、col 控制列冻结区域,抓住这个规律后冻结任意组合都很灵活。特别是还贴心地给出了获取和取消冻结的代码,批量处理报表时能避免重复覆盖。感谢分享,已收藏备用。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用Spire.XLS实现Excel冻结窗格(行/列/单元

感谢分享!这个教程把冻结窗格的参数规律讲得很清楚,尤其是 `FreezePanes(row, col)` 里行和列分别控制的含义,以前我总搞混。另外批量处理时 `GetFreezePanes` 查询现有状态确实很有用,避免重复覆盖。请问一下,如果想冻结前 3 行(比如表头占了三行),参数设置 `(4, 1)` 就够了对吧?还有,这个库在冻结时对合并单元格的处理有没有特殊注意事项?谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-9 12:05 , Processed in 0.033709 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部