网友作品 #000088 · 提交于 2026/08/10
Excel父子维度函数插件:公式实现BI层级汇总分析






1 / 6
作品简介
wps-udf-tree-collections 是一个基于 Excel-DNA 的 Excel/WPS 自定义函数插件,把 TreeCollections 开源树集合库内嵌为单元格函数,让用户用公式完成父子维度(Parent-Child Hierarchy)的构建、查询、层级汇总全流程。项目灵感来自 SAP BPC/BW 父子维度层级建模的企业级需求,经两个大型制造集团的 SAP 报表项目实战验证后抽离为通用蓝图。一句话定位:用 Excel 公式实现 BI 工具的维度分析和层级汇总,零数据库、零服务器、零 SQL。
核心亮点
- 维度函数族:16 个 DIM_* 函数覆盖建树、状态查看、关键字搜索、编码/名称路径、层级深度、父/子/兄弟/子孙节点、祖先判断、最近公共祖先、作用域等完整生命周期
- 层级汇总:FACT_BUILD / FACT_AGG / FACT_TABLE 等事实函数按节点作用域汇总指标,支持 sum、count、average、min、max、std 六种汇总方式
- 类 SQL 筛选:支持 month=‘2026-07’ and amount>1000 式条件过滤,可做构建时预过滤与运行时过滤
- 高性能:维度树一次 O(n) 构建常驻内存、路径缓存预计算,后续查询毫秒级响应;异步计算不阻塞 Excel 界面
- 一维多树:同一张维度表可容纳多棵树(如管理口径与法人口径),通过 rootNodeId 参数切换
- 双宿主支持:同一套代码同时支持 Microsoft Excel 与 WPS 表格,x86/x64 自适应
- 原生体验:IntelliSense 函数名与参数提示,与 VLOOKUP、SUMIF、数据透视表无缝配合,完全离线可用
技术与工具
- 插件框架:Excel-DNA 1.9(本地 Patched 版),.NET 6 运行时,显式注册避免命名冲突
- 树引擎:内嵌 TreeCollections 开源库源码,无需额外 NuGet 依赖
- 智能提示:ExcelDna.IntelliSense 提供函数名与参数提示
- 工程化:一键构建脚本、双击 bat 安装卸载、宿主忙碌检测、WPS 空白工作簿清理、内置日志系统
- 开发方式:AI 编程类工具 + 国际顶级大模型,基于 ExcelDNA Skill 蓝图体系
开发过程
作者把多年 SAP 实战项目中父子维度层级建模的核心逻辑抽离成通用蓝图:先在两个大型制造集团的 SAP 报表项目中实战验证,再基于 ExcelDNA Skill 蓝图体系实现为 Excel/WPS 自定义函数插件。
适用场景
- 组织架构分析:按大区/子公司逐级汇总收入、成本、利润,查询节点层级与完整组织路径
- 财务科目树:从最细颗粒度的科目编码自动汇总到科目大类,支持管理口径与法人口径两套科目树切换
- 成本中心与 BOM:成本中心层级费用汇总、物料 BOM 树层级展开与成本卷算
- 通用父子维度:任何用 id/parentid 定义层级关系的表格数据都可直接使用
原始提交内容(点开查看,可复制全文去问 AI)
wps-udf-tree-collections 项目说明
Excel-DNA 自定义函数插件 | 父子维度树引擎 | BI 层级汇总分析
一、项目概述
wps-udf-tree-collections 是一个基于 Excel-DNA 的 Excel/WPS 自定义函数插件,核心能力是将 TreeCollections 开源树集合库 内嵌为 Excel 自定义函数(UDF),让用户在单元格中直接完成父子维度(Parent-Child Hierarchy)的构建、查询、层级汇总全流程。
该项目的灵感来源于 SAP BPC / SAP BW 中父子维度层级建模的真实企业级需求,经过两个大型制造集团的 SAP 报表项目实战验证后,将核心逻辑抽离为通用蓝图。
一句话定位: 用 Excel 公式实现 BI 工具的维度分析和层级汇总,零数据库、零服务器、零 SQL。
二、技术栈
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 运行时 | .NET 6(RollForward=LatestPatch) | 兼容 .NET 6+ Desktop Runtime |
| 插件框架 | Excel-DNA 1.9(本地 Patched 版) | 支持 Excel 和 WPS 双宿主 |
| 架构 | x86 / x64 双 xll | 自动适配宿主进程位数 |
| 树引擎 | TreeCollections(内嵌源码) | 开源 .NET 实体树集合库 |
| 函数注册 | Excel-DNA Explicit Registration | 显式注册,避免命名冲突 |
| 智能感知 | ExcelDna.IntelliSense | 函数名、参数提示 |
| 异步计算 | async/await + CancellationToken | 大数据量构建不阻塞 Excel UI |
| 辅助库 | HandyControl(WPF 预留) | 为后续 Ribbon/CTP 扩展预留 |
三、核心功能
3.1 维度树函数(DIM_*)
共 16 个维度函数,覆盖父子维度分析的完整生命周期:
| 函数 | 功能 | 典型场景 |
|---|---|---|
DIM_BUILD |
从工作表区域构建维度树快照 | 一次性加载组织架构、科目结构 |
DIM_STATUS |
查看树状态(节点数、根数、叶子数、属性列) | 验证构建结果 |
DIM_FIND |
关键字搜索维度成员(id/name/属性) | 快速定位节点 |
DIM_PATH_CODES |
返回节点编码路径 | 查看完整层级编码链 |
DIM_PATH_NAMES |
返回节点名称路径 | 如“深圳总部 > 华南大区 > 广东子公司” |
DIM_LEVEL |
返回节点层级深度 | 根节点=1,每层递增 |
DIM_PARENT |
返回父节点信息(id/name/path) | 上级组织查询 |
DIM_ATTR |
读取节点自定义属性 | 如负责人、所属区域、成本中心 |
DIM_CHILDREN |
返回直属子节点表 | 展开一层子节点 |
DIM_DESCENDANTS |
返回全部子孙节点表(支持深度限制) | 完整子树展开 |
DIM_LEAVES |
返回叶子节点列表 | 查找最底层节点 |
DIM_SIBLINGS |
返回兄弟节点列表 | 平级组织对比 |
DIM_IS_ANCESTOR |
判断祖先关系 | 权限校验、归属判断 |
DIM_LCA |
最近公共祖先查询 | 两个节点的共同上级 |
DIM_NODE_TABLE |
返回单节点完整信息表 | 节点详情查看 |
DIM_SCOPE_IDS |
返回节点作用域编码列表 | 生成汇总范围的编码集合 |
DIM_SCOPE_TABLE |
返回节点作用域节点表 | 作用域明细查看 |
3.2 事实聚合函数(FACT_*)
共 3 个事实表函数,实现 BI 工具的核心能力——层级汇总:
| 函数 | 功能 | 典型场景 |
|---|---|---|
FACT_BUILD |
构建事实表缓存(支持预过滤) | 加载收入、成本等事实数据 |
FACT_STATUS |
查看事实表状态 | 验证加载结果 |
FACT_AGG |
按节点作用域汇总指标 | 如“华南大区+所有子公司的收入合计” |
FACT_TABLE |
返回作用域内的事实表明细 | 人工核对汇总逻辑 |
支持的汇总方式: sum / count / average / min / max / std(标准差)
筛选条件语法: 类 SQL 风格,支持 =、!=、<>、>、>=、<、<= 运算符和 and 组合。
# 单条件
month='2026-07'
# 多条件组合
month='2026-07' and category='actual'
# 数值比较
amount>1000 and amount<=5000
四、架构设计
4.1 工作簿驱动模型(Workbook-Driven)
用户工作表数据 DIM_BUILD 内存句柄 DIM_* 查询
FACT_BUILD 事实句柄 FACT_AGG 汇总
- 维度表和事实表都在工作表中以普通区域的形态存在
- 通过
DIM_BUILD/FACT_BUILD一次性构建为内存快照 - 后续所有查询/汇总操作都基于句柄复用,无需重新解析
4.2 内存句柄复用机制(核心性能优化)
一次性 O(n) 构建 常驻内存对象 后续查询 O(log n) 甚至 O(1)
DIM_BUILD只执行一次,将整个维度表解析为BiDimensionSnapshot树结构- 构建时同步计算所有节点的路径缓存(
_pathCodesCache/_pathNamesCache),避免后续重复遍历 - 所有
DIM_*函数直接操作内存中的同一棵树,不做重复解析 FACT_BUILD构建时支持预过滤,减少后续查询的数据量
4.3 一维多树支持
通过 rootNodeId 参数,在同一张维度表中模拟多棵树:
- 维度表中包含多个顶层根节点(如“管理口径”和“法人口径”)
- 查询时通过
rootNodeId指定当前分析使用哪棵树 - 节点作用域自动限定在指定根节点的子树范围内
4.4 异步计算
DIM_BUILD、FACT_BUILD、FACT_AGG、FACT_TABLE均支持异步执行- 计算期间单元格显示“计算中…”,不阻塞 Excel UI 响应
- 支持
CancellationToken,公式依赖变化时自动取消旧任务
4.5 源码结构
src/TestWpsUdfTreeCollections/
AddIn.cs # 插件生命周期、日志、运行时装配
Functions.cs # 全部 DIM_* / FACT_* 业务函数(主入口)
ExcelWorkbookDataOps.cs # Excel COM 互操作封装(工作表读写、ListObject 操作)
HostInteractionGuard.cs # 宿主忙碌检测与保护
WpsBlankWorkbookCleaner.cs # WPS 空白工作簿清理
Properties/AssemblyInfo.cs # 程序集信息
TreeCollections/ # 内嵌 TreeCollections 源码
Tree/ # 核心树结构(EntityTree、MutableEntityTree、ReadOnlyEntityTree)
InternalUtilities/ # 内部工具类
SerialTreeNode.cs # 序列化树节点
TestWpsUdfTreeCollections-AddIn.dna # x86 配置
TestWpsUdfTreeCollections-AddIn64.dna # x64 配置
五、使用场景
5.1 组织架构树分析
深圳总部(HQ)
华南大区(HN)
广东子公司(GD)
深圳分公司(SZ001)
广州分公司(GZ001)
广西子公司(GX)
华东大区(HD)
上海子公司(SH)
浙江子公司(ZJ)
- 快速判断某分公司的层级和完整组织路径
- 按大区汇总所有下属公司的收入/成本/利润
- 组织架构调整后,自动重算跨期对比报表
5.2 财务科目树分析
所有者权益
净利润
收入
主营收入
产品线A收入
产品线B收入
其他业务收入
成本
主营成本
期间费用
资本公积
- 从最细颗粒度的科目编码,自动汇总到科目大类
- 支持管理口径和法人口径两套科目树的动态切换
5.3 成本中心树
- 集团成本中心 工厂成本中心 车间成本中心 班组
- 按层级汇总各成本中心的费用发生额
5.4 物料 BOM 树
- 成品 半成品 零部件 原材料
- 计算物料需求计划的层级展开
- 成本卷算(从原材料到成品的成本累加)
5.5 通用父子维度场景
任何满足“同一列数据中,不同行代表不同层级,且层级关系通过 id/parentid 定义”的场景,都可以直接使用。
六、BI 分析工作流
典型操作步骤
- 准备维度表:在工作表里创建维度表,首行表头,至少包含
id和parentid两列,其他列自动视为节点属性 - 构建维度树:
=DIM_BUILD(维度表区域, "id", "parentid", "name", "组织维度") - 验证构建结果:
=DIM_STATUS(句柄) - 维度查询:用
DIM_FIND、DIM_PATH_NAMES、DIM_LEVEL等函数做节点定位 - 准备事实表:在工作表里创建事实表,首行表头,至少包含
id列(与维度节点编码关联) - 构建事实缓存:
=FACT_BUILD(维度句柄, 事实表区域, "id") - 层级汇总:
=FACT_AGG(事实句柄, "华南大区", "amount", "sum", TRUE, TRUE, FALSE) - 切换筛选条件:在
FACT_AGG中追加month='2026-07'等运行时筛选
推荐公式示例
# 维度构建
=TESTWPSUDFTREECOLLECTIONS_DIM_BUILD(DimData!A1:F24, "id", "parentid", "name", "组织维度")
# 维度状态查询
=TESTWPSUDFTREECOLLECTIONS_DIM_STATUS(A10)
=TESTWPSUDFTREECOLLECTIONS_DIM_STATUS(A10, "ROOT_HQ")
# 关键字搜索
=TESTWPSUDFTREECOLLECTIONS_DIM_FIND(A10, "财务", 20, "ROOT_HQ")
# 路径查询
=TESTWPSUDFTREECOLLECTIONS_DIM_PATH_NAMES(A10, "FIN_AR_01", " > ", "ROOT_HQ")
# 作用域编码
=TESTWPSUDFTREECOLLECTIONS_DIM_SCOPE_IDS(A10, "FIN", TRUE, TRUE, FALSE, ",", "ROOT_HQ")
# 事实表构建(全量)
=TESTWPSUDFTREECOLLECTIONS_FACT_BUILD(A10, FactData!A1:F193, "id", "", "", "ROOT_HQ")
# 事实表构建(预过滤)
=TESTWPSUDFTREECOLLECTIONS_FACT_BUILD(A10, FactData!A1:F193, "id", "month='2026-07'", "region='总部'", "ROOT_HQ")
# 层级汇总(全量)
=TESTWPSUDFTREECOLLECTIONS_FACT_AGG(A13, "FIN", "amount", "sum", TRUE, TRUE, FALSE, "", "", "ROOT_HQ")
# 层级汇总(运行时筛选)
=TESTWPSUDFTREECOLLECTIONS_FACT_AGG(A14, "FIN", "amount", "sum", TRUE, TRUE, FALSE, "month='2026-07'", "region='总部'", "ROOT_HQ")
# 事实表明细查看
=TESTWPSUDFTREECOLLECTIONS_FACT_TABLE(A13, "FIN", TRUE, TRUE, FALSE, "month='2026-07'", "region='总部'", 20, "ROOT_HQ")
七、功能特色
7.1 零外部依赖的 BI 分析
- 不需要数据库、不需要服务器、不需要网络
- 所有计算在本地内存完成,毫秒级响应
- 完全离线可用
7.2 与 SAP EPM/AO 的对比优势
| 操作 | SAP 原生方案(EPM/AO) | 本方案 |
|---|---|---|
| 加载维度树 | 从 SAP 服务器加载,几十秒到几分钟 | 一次 DIM_BUILD,几毫秒到几秒 |
| 展开维度节点 | 发请求到服务器,等返回 | 直接读内存,毫秒级 |
| 层级汇总 | 服务器计算 + 网络传输 | 本地内存遍历,毫秒级 |
| 筛选条件切换 | 重新发请求 | 运行时过滤,毫秒级 |
| 离线使用 | 不可能 | 完全支持 |
7.3 零学习成本的 Excel 原生体验
- 全部功能通过 Excel 公式调用,财务用户无需学习新工具
- 函数名和参数命名直观,IntelliSense 智能提示
- 与 VLOOKUP、SUMIF、数据透视表等原生功能无缝配合
7.4 工业级健壮性
- 完善的错误处理:每个函数都有明确的错误提示
- 宿主忙碌检测:
HostInteractionGuard防止在 Excel 编辑状态下执行交互操作 - WPS 兼容处理:
WpsBlankWorkbookCleaner自动清理 WPS 启动时产生的空白工作簿 - 日志系统:
AddInLog记录插件全生命周期和异常信息
7.5 双宿主支持
- 同一套代码同时支持 Microsoft Excel 和 WPS 表格
ExcelDnaUtil.IsET自动检测宿主环境- 分离的安装/卸载脚本(
install_excel_addin.bat/install_wps_addin.bat)
7.6 构建与分发
- 一键构建:
build_addin.ps1 - 构建产物自动复制到
dist/files/目录 - 双击
.bat即可安装,无需手动配置注册表 - 支持
dist目录整体分发,用户拿到即可使用
八、维度表与事实表规范
维度表要求
- 首行必须是表头
- 至少 2 列,且必须包含
id和parentid - 其他列自动视为节点属性(如
name、leader、region、costcenter) - 空
parentid会被视为顶层根节点 - 如需多棵树,在同一张表里放多个顶层根节点,通过
rootNodeId选择
事实表要求
- 首行必须是表头
- 至少包含一个
id列,用于和维度节点编码关联 - 其他指标列按需传给
FACT_AGG - 推荐保留
month、category、scenario等筛选列,便于预过滤 - 筛选条件支持
month='2026-07' and category='actual'格式
九、与其他蓝图的组合使用
wps-udf-tree-collections 是 Excel-DNA Skill 蓝图矩阵中的“专项蓝图”,可与以下蓝图组合:
| 蓝图 | 组合后的能力 |
|---|---|
wps-ribbon-ctp-webview |
Ribbon 界面 + 任务窗格 + 树浏览器 |
wps-udf-live-cache |
实时数据缓存 + 信号驱动重算 |
wps-udf-only |
纯自定义函数,最小化交付 |
wps-workbook-automation |
工作簿自动化操作 |
组合示例: wps-ribbon-ctp-webview + wps-udf-tree-collections + wps-udf-live-cache = 全功能 BI 插件
十、技术要点总结
- 内存对象跨公式共享:Excel-DNA 的
[ExcelHandle]特性使树结构常驻内存,所有公式共享同一份快照 - 路径缓存:构建时预计算所有节点的路径编码和路径名称,避免后续重复遍历
- 异步构建:大数据量维度表/事实表构建不阻塞 Excel UI
- SQL 风格筛选:自定义
SqlWhereFilter解析器,支持字符串和数值比较 - 一维多树:通过
rootNodeId参数在同一个维度中表达多套层级体系 - TreeCollections 内嵌:源码直接集成到项目中,无需额外 NuGet 依赖,编译即用
- COM 互操作封装:
ExcelWorkbookDataOps完整封装了工作表的读写、ListObject 操作、格式设置等 - 智能感知:
ExcelDna.IntelliSense为所有自定义函数提供函数名和参数提示
十一、系统要求
- 操作系统:Windows 7 SP1 及以上
- .NET 运行时:.NET 6 Desktop Runtime(x86 或 x64)
- Office 版本:Microsoft Excel 2010+ 或 WPS 2019+
- 位数:x86 或 x64,与 Office/WPS 位数一致
十二、许可说明
- 本项目为 Excel-DNA Skill 蓝图体系的组成部分
- 内嵌 TreeCollections 源码,其许可证见
docs/TreeCollections-LICENSE.txt - Excel-DNA 运行时使用本地 Patched 版本,详见
runtime/exceldna/README.md