Excel 的“分级显示”可以把明细行折叠起来,只保留汇总行。手工设置分级很麻烦,尤其是工程量清单、报价表、目录式表格。素材里的“Excel 自动分级显示”脚本很有价值,它的核心思路是:根据选中列里的文本规则,批量设置每一行的 OutlineLevel。
这篇提炼核心做法:按星号、序号、非空单元格生成分级。完整工具可以做 GUI,这里先讲最关键的 COM 操作。
一、核心对象:Rows.OutlineLevel
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
xl := ComObjActive("Excel.Application")
sheet := xl.ActiveSheet
sheet.Rows.ClearOutline
sheet.Rows(2).OutlineLevel := 1
sheet.Rows(3).OutlineLevel := 2
sheet.Rows(4).OutlineLevel := 2
OutlineLevel 就是行的分级层级。设置前通常先 ClearOutline 清掉旧分级,避免新旧规则叠在一起。
二、按星号数量分级
如果某一列用星号表示层级,例如 *、**、***,就可以按星号数量设置行级别。
F1::
xl := ComObjActive("Excel.Application")
sel := xl.Selection
col := sel.Column
firstRow := sel.Rows(1).Row
lastRow := firstRow + sel.Rows.Count - 1
xl.ScreenUpdating := False
xl.ActiveSheet.Rows.ClearOutline
Loop, % lastRow - firstRow + 1
{
r := firstRow + A_Index - 1
text := xl.Cells(r, col).Text
if RegExMatch(text, "^\*+")
level := StrLen(RegExReplace(text, "[^*]"))
else
level := 2
if (level 8)
level := 8
xl.Rows(r).OutlineLevel := level
}
xl.ScreenUpdating := True
MsgBox, 分级显示完成
return
Excel Outline 最多支持有限层级,实际脚本里建议把层级限制在 1 到 8 之间,避免异常数据导致报错。
三、按序号分级
很多表格用 1、1.1、1.1.1 表示层级,可以按点号数量判断。
GetLevelByNumber(text) {
if !RegExMatch(text, "^\d+(\.\d+)*")
return 2
parts := StrSplit(text, ".")
return parts.MaxIndex()
}
这个函数可以作为规则入口:匹配到序号就返回层级,匹配不到就当作明细行。
四、按非空单元格分 1 级
有些表格没有严格序号,只是“标题行有文字,下面空白或明细跟随”。这种可以把非空行作为一级,其后行作为二级。
text := xl.Cells(r, col).Text
if (text != "")
xl.Rows(r + 1).OutlineLevel := 1
else
xl.Rows(r).OutlineLevel := 2
这种规则比较粗,但在快速整理工程表、清单表时很实用。
五、实战注意事项
- 只处理用户选中的列,不要默认扫整张表。
- 设置前先清除旧分级。
- 大量行处理时关闭
ScreenUpdating,结束后恢复。 - 选区不要直接选整行,最好选包含规则的那一列。
- 规则复杂时先做预览或小范围测试。
结语
Excel 自动分级显示的价值不在 GUI,而在规则提炼。只要能从某一列文本判断层级,就可以用 AHK COM 批量设置 OutlineLevel。星号、序号、非空行、正则表达式,本质上都是同一个套路。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)