用 SpreadJS 数据验证实现省市区三级联动

简介: 本Demo利用SpreadJS的数据验证、自定义名称与INDIRECT函数,在普通单元格中实现省-市-区三级联动下拉,无需弹窗控件。数据源结构清晰、易维护,兼容复制粘贴与现有模板,适用于商品分类、组织架构等多级场景。

地址、商品分类、组织架构、费用科目都有一个共同特点:下一级选项取决于上一级选择。用户选了省份,城市列表就不应该再出现其他省的城市;选了城市,区域也应该随之收窄。三级联动 这个 demo 用 SpreadJS 的数据验证、自定义名称和 INDIRECT 函数组合,在普通单元格里实现省份、城市、区域三级下拉。

为什么这个细节重要

级联下拉解决的是数据质量问题。让用户自由输入省市区,后续清洗会很痛苦;让用户从完整城市列表里找,也不够友好。产品经理需要的是更低的填错概率,开发者需要的是一套能维护的数据源结构,业务用户需要的是“我选完上一级,下一级自然变对”。

这个 demo 的优势是它没有写复杂的弹窗控件,而是沿用电子表格里的数据验证能力。用户仍然在单元格里选择,表格仍然可以复制、粘贴、保存,联动规则则由公式引用完成。

这也让它更适合嵌入已有模板。很多企业表单已经围绕行列设计好了权限、导入和导出流程,级联下拉如果仍然发生在单元格内部,就不会破坏原来的工作方式。

SpreadJS 的实现思路

代码创建了一个名为“级联数据源”的工作表,把树形地址数据展开到不同列。第一列存所有省份;每个省份对应一列城市;每个“省份+城市”再对应一列区域。关键是用 sheet.addCustomName 给这些区域命名,并用 GC.Spread.Sheets.CalcEngine.rangesToFormula 生成绝对引用。

sourceSheet.name("级联数据源");

let prRange = new GC.Spread.Sheets.Range(1, 0, source.length, 1);
sourceSheet.addCustomName(
  "省份",
  "级联数据源!" + GC.Spread.Sheets.CalcEngine.rangesToFormula(
    [prRange], 0, 0,
    GC.Spread.Sheets.CalcEngine.RangeReferenceRelative.allAbsolute,
    false
  )
);

主表三列分别是省份、城市、区域。省份列直接引用名称“省份”;城市列使用 INDIRECT 拼出“级联数据源! + 当前行 A 列值”;区域列再拼接 A 列和 B 列,找到对应区域列表。

let provinceList =
  GC.Spread.Sheets.DataValidation.createFormulaListValidator("级联数据源!省份");
sheet.setDataValidator(1, 0, 10, 1, provinceList);

let cityList =
  GC.Spread.Sheets.DataValidation.createFormulaListValidator(
    'INDIRECT("级联数据源!"&$A2)'
  );
sheet.setDataValidator(1, 1, 10, 1, cityList);

可以扩展到哪些场景

省市区只是最容易理解的例子。同样方法可以用于商品大类、中类、小类,部门、岗位、人员,费用一级科目、二级科目、明细科目,设备类型、型号、点位。只要层级清晰、选项数量适中,这种基于数据源表和名称的方案就比较好维护。

需要注意,自定义名称要避免冲突。demo 用“省份+城市”作为区域名称,如果业务里存在重名城市,就要引入编码或更稳定的 key。数据量特别大时,也可以考虑自定义 CellType 或服务端查询式下拉。

实际交付时,还建议监听上级单元格变化并清空下级旧值。否则用户先选了“广东省-广州市”,再把省份改成“浙江省”,城市列可能还保留旧城市,形成看似合法但业务不一致的组合。
如果要支持批量粘贴,也要在粘贴后重新校验三列组合,避免绕过下拉选择产生脏数据。

给开发者的关键词

SpreadJS、DataValidation、createFormulaListValidator、addCustomName、INDIRECT、GC.Spread.Sheets.Range、rangesToFormula、三级联动、省市区下拉、JavaScript 电子表格控件。

小结

三级联动 展示了 SpreadJS 里很“电子表格原生”的交互方式:用数据验证限制输入,用自定义名称管理候选集,用公式把上下级选项连起来。它让表格录入更稳,也让层级数据维护留在工作簿结构里。

相关文章
|
23天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9321 29
|
9天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
21天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2447 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
7天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
615 1
|
2天前
|
存储 缓存 测试技术
QWT 3D 模块重构记:旧渲染管线改进介绍及实时瀑布图示例
QWT 3D模块完成重大重构:解耦窗口与图形(Plot+Item),摒弃OpenGL 1.x固定管线,迁至Core Profile着色器渲染;支持多图元同场景叠加,并以实时3D瀑布图验证——滑动窗口、固定色域、64帧×256点达61fps。兼容Qt 5.12+/6,LGPL协议。
154 120
|
10天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
1174 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
|
14天前
|
Windows
【保姆级】.NET Framework 3.5离线安装教程(2026最新实测)
.NET Framework 3.5是微软经典运行库,专为兼容老软件、老游戏设计。Win7自带,Win10/11需手动启用(在线或离线安装)。它与4.x系列并存不冲突,缺它会导致“找不到组件”报错。本文详解两种安装方式及常见问题解决,小白也能轻松上手。(239字)
1780 0
|
4天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
391 0

热门文章

最新文章