Python Excel 隐藏与显示行列 openpyxl 方法
用openpyxl控制Excel行列的隐藏与显示:按条件把辅助列、中间过程列藏起来,保护中间计算数据,同时保留主展示列,还能批量取消隐藏。
场景痛点
做报表时经常有一堆"中间计算列":单价、数量、税率、辅助公式,这些是给最终结果用的,但发给领导看时不想露出来。手动右键隐藏、调整列宽,每次出新版本都要重复一遍。还有些敏感行(员工工资明细、客户隐私字段)需要藏起来只留汇总行。用Python按列名/行号规则自动隐藏,对外发的版本和对内的计算版本一键切换。
用到的库
pip install openpyxl
完整代码
# -*- coding: utf-8 -*-
"""
openpyxl 隐藏 / 显示 行和列
"""
from openpyxl import Workbook, load_workbook
def build_sheet(path: str):
wb = Workbook()
ws = wb.active
ws.title = "销售明细"
# 表头:A 地区 / B 单价 / C 数量 / D 金额 / E 税率 / F 含税金额
headers = ["地区", "单价", "数量", "金额", "税率", "含税金额"]
ws.append(headers)
data = [
["华东", 100, 10, 1000, 0.13, 1130],
["华北", 200, 5, 1000, 0.13, 1130],
["华南", 150, 8, 1200, 0.13, 1356],
]
for row in data:
ws.append(row)
# ===== 1) 隐藏列:B 单价、C 数量、E 税率 是中间过程列 =====
ws.column_dimensions["B"].hidden = True
ws.column_dimensions["C"].hidden = True
ws.column_dimensions["E"].hidden = True
# 也支持按列序号隐藏:D 列(4) -> 用 get_column_letter 转换
from openpyxl.utils import get_column_letter
# 演示:如果想隐藏第 4 列
# ws.column_dimensions[get_column_letter(4)].hidden = True
# ===== 2) 隐藏行:把第 4 行(华南)暂时藏起来不参与对外展示 =====
ws.row_dimensions[4].hidden = True
# 列宽顺手调一下,主列 A/D/F 宽一点
for col, width in [("A", 12), ("D", 14), ("F", 14)]:
ws.column_dimensions[col].width = width
wb.save(path)
print("已生成(部分行列已隐藏):", path)
def unhide_all(path: str):
"""读取后批量取消所有隐藏,恢复原始视图"""
wb = load_workbook(path)
ws = wb["销售明细"]
# 取消所有列隐藏
for col_letter, dim in ws.column_dimensions.items():
if dim.hidden:
dim.hidden = False
print(f"已取消隐藏列:{col_letter}")
# 取消所有行隐藏
for row_idx, dim in ws.row_dimensions.items():
if dim.hidden:
dim.hidden = False
print(f"已取消隐藏行:{row_idx}")
wb.save(path.replace(".xlsx", "_显示版.xlsx"))
print("已生成显示版文件")
def main():
file_path = "hidden_demo.xlsx"
build_sheet(file_path)
unhide_all(file_path)
if __name__ == "__main__":
main()
代码讲解
- 隐藏列:
ws.column_dimensions["B"].hidden = True。用列字母(A、B、C...)索引;想按数字序号就用openpyxl.utils.get_column_letter(4)转成 "D"。 - 隐藏行:
ws.row_dimensions[4].hidden = True。行号从 1 开始,和 Excel 行号一致。 - 反过来
hidden = False就是取消隐藏。 - 批量取消时,遍历
ws.column_dimensions.items()和ws.row_dimensions.items(),凡是dim.hidden为 True 的都改回 False。这种"先全部显示"的逻辑在做"对内完整版"时很有用。 - 注意:隐藏只是 Excel 视图上的折叠,数据仍然在文件里。别人用 Python 读、或者在 Excel 里"取消隐藏"就能看到,不是真正的安全保护。要保密得用密码保护或干脆不写进文件。
- 配合列宽设置:隐藏的列不用调宽度,主展示列调宽,外发版本看起来干净。
运行结果
先生成 hidden_demo.xlsx:打开后只能看到 A 列"地区"、D 列"金额"、F 列"含税金额",B/C/E 列被折叠;第 4 行"华南"也不见了。脚本接着生成 hidden_demo_显示版.xlsx,所有行列恢复显示,控制台打印"已取消隐藏列:B/C/E"和"已取消隐藏行:4"。
注意事项
- 隐藏 ≠ 安全:隐藏的列只是看不见,数据还在 xlsx 里,懂的人一秒取消隐藏。真要防人看,请用工作表保护密码,或者干脆不把敏感数据写进文件。
- 合并单元格、筛选、冻结窗格这些功能和隐藏行列不冲突,但取消隐藏后视觉顺序要重新确认。
ws.column_dimensions只包含"被设置过属性"的列。想遍历全部列,先用ws.max_column拿到最大列号,再用get_column_letter转。- 隐藏整行后,SUM 之类的公式默认仍会把隐藏行算进去;如果要"只算可见行",得用
SUBTOTAL(109, 区域)这种函数,openpyxl 不会自动改。 - 对 WPS 老版本、部分在线预览器(如飞书/钉钉在线预览),隐藏行列的渲染可能不一致,正式外发前用 Excel 本体打开核对一次。

更新时间:2026-09-15 09:06:40
上一篇:Python Excel插入行和列:insert_rows与insert_cols用法