尧图精选

FormCreate 设计器 v6.2:数据表格、Excel 导入与事件联动解析

🕒 发布时间:2026/10/1 18:10:34 📁 来源:尧图网络
做低代码表单做到一定阶段你会发现“表单设计器”的天花板往往不在表单项有多少而在于能不能承接真实的业务数据。前两个月我在维护一个采购流程表单里面需要一张可以动态增删行的明细表。老版本设计器没有自带的表格组件我只能用自定义插槽塞一套第三方 el-table再手动把表格数据同步回表单的 value。这套方案能用但每次改字段都要两头改开发效率很低业务同事还反复提“能不能直接让我们把 Excel 粘贴进来”这周把开发环境升到 FormCreate 设计器 v6.2两个变化让我觉得值得专门写一篇数据表格组件正式上线并且把 Excel 导入导出做进了表格能力事件系统也从“控件内部的小动作”升级成了真正的联动机制。如果你也在用 form-create 做动态表单、子表单明细或者需要把线下 Excel 数据一次性搬进线上表单这篇内容应该能帮你省下不少试错时间。我会把组件能力、Excel 处理细节、事件机制的变化以及实测中踩过的坑一起捋一遍尽量给你可以复现的实操路径。1. 数据表格组件设计器补齐的“最后一块大拼图”1.1 业务表单里的“明细表格”为什么躲不掉表单设计器最初解决的是“把字段摆出来”也就是单层结构姓名、电话、身份证号。但在真实业务里大量表单是“主表子表”的复合结构。典型的就是报销单主表填申请人、部门、事由子表是每一条费用明细再比如订单表单主表是客户信息子表是商品清单。子表天然需要支持增行、删行、填列、校验、合计这不是普通 input 组件能拼出来的。之前没有内置表格时常见的做法是三种一是用 form-create 的自定义组件能力塞一个 el-table 或 a-table 进去二是用 repeat 类型数组字段强行拼凑三是在表单生成前用模板渲染的方式硬写。这三种方案都能跑但共同问题是设计器里看不到真实结构JSON Schema 和 UI 是两张皮业务改一个字段要开发动一次代码。v6.2 把 dataTable 作为一级组件放进了设计器这句话说起来简单意义却不一样。它意味着表格开始拥有标准化的字段类型、统一的 value 结构、可视化的列配置入口以及后续可以围绕它做格式化、校验、导入导出等扩展。对一个低代码表单平台来说这是把“做表单”升级成“做数据录入应用”的关键节点。1.2 数据表格的字段配置与 JSON 结构我在设计器里拖入一个“数据表格”组件配置了四列物品名称、数量、发生日期、费用分类。生成的核心配置大概长这样{ type: dataTable, field: detailList, title: 明细列表, props: { columns: [ { type: input, key: name, title: 物品名称, width: 160 }, { type: number, key: quantity, title: 数量, precision: 2 }, { type: datePicker, key: occurDate, title: 发生日期, valueFormat: YYYY-MM-DD }, { type: select, key: category, title: 费用分类, options: [ { value: transport, label: 交通费 }, { value: office, label: 办公费 } ] } ], operationColumn: true, showIndex: true, minRows: 1, maxRows: 50 } }这个结构和我之前用自定义组件时手写的 value 其实是同构的组件最终产出的值是一个对象数组每个对象对应一行对象的键就是 columns 里 key。表单提交时你拿到的 formData.detailList 就是一个可直接入库的数组。这里想提醒三个点columns 里的每个元素实际是“列级字段”它可以继续复用 form-create 已有的字段类型比如日期、下拉、数字输入这比在一个格子里只放文本输入要实用得多。minRows / maxRows 是行数边界不只是 UI 限制它会被纳入表单校验写的是“数量不能少于 1、最多 50”提交时会强制生效。operationColumn 控制的是内置的增删行按钮列如果你还需要“复制行”“上移下移”在新版本的事件联动里也能自己接动作。1.3 表格数据在表单里的存放与取值方式数据表格的数据最终还是会落到表单整体的 values 对象里所以它和表单单据的联动是天然畅通的。比如我在设计器里再加一个“总金额”字段可以给它配置一个事件在表格行数量或“数量/金额”变化时重新计算并写入主表字段。之前用自定义组件时这种跨层同步靠的是组件内部 $emit 再手动监听链路长、易漏现在数据表格是标准字段设计器里可以直接引用它的行数据。你在配置联动事件时表达式里能直接访问当前行、当前字段、整表数据写起来会顺手很多。需要留意的是嵌套层级。如果一个表单里有两个数据表格建议给每个表格的 field 起清晰且不冲突的名字别用通用的 arr、list 这种。后面做 Excel 映射和事件引用时字段名就是唯一索引重名导致的串数据排查起来非常痛苦。2. Excel 能力升级把线下表格搬进在线表单的思路与细节2.1 Excel 导入导出链路里到底发生了什么v6.2 的 Excel 能力不是简单加两个按钮而是围绕数据表格做了一个完整的“导入-解析-映射-校验-导出”闭环。导入时用户选择文件或从剪贴板粘贴组件读取工作簿中的单元格把二维数据转换成可以与表格 columns 对应的行对象导出时再把 rows 数组拆回单元格生成带表头、带列宽的文件。我在尝试时发现它的处理流程大概是四步读取拿到用户选择的 Excel 文件或者是粘贴的 TSV 文本交给解析层。列映射把目标表格的 columns 与源数据的表头进行匹配匹配不上会给出提示。数据转换根据列类型做转换数字列转数字日期列转指定格式下拉列做值映射。校验与回填转换后的数据进入表格已有校验逻辑校验失败的行会标记出来不会“无声丢弃”。第四步是很多人容易忽略的重点。老做法里Excel 导入往往是“能读就全塞”结果数据是进来了格式全乱日期变成了序列数手机号变成了科学计数法。v6.2 把校验前移至少在我的一组 200 行测试数据里类型不对的行会被标红改动后重新导入即可不用整表推倒重来。2.2 粘贴与导入时最容易踩的格式坑Excel 看着是“表格”本质是单元格数据的集合平时用 WPS 或 Office 打开很自然一旦走程序解析各种隐藏规则都会暴露。我实测遇到比较典型的几个坑场景现象处理建议日期列显示 2024-06-18导入后变成 45421在源文件中把列格式设为文本或在导入映射中指定日期格式进行解析手机号/单号18712345678 被转成 1.87123E10源文件单元格格式设为文本再重新粘贴不要让 Excel 自动做常规扩展金额列1000.50 变成 1000.5末尾 0 丢失配置列精度为 2导入转换时按数字精度补位合并单元格表头合并后解析出的表头只有首列有值在 Excel 中取消合并单元格或将表头每列都填上完整名称公式单元格源单元格是公式粘贴出来只有缓存值导出前用“复制/粘贴为值”处理源表避免依赖公式结果这些坑在手工操作时都不叫事但放到自动化导入场景里任何一个都会变成用户那里的“数据错了”。我的经验是凡是进入导入流程的 Excel最好在模板上就锁定列类型和格式给业务同事一个“标准模板”比在组件里做一万次容错都强。2.3 大数据量表格不能一条条渲染v6.2 的数据表格支持行数不少但如果有人把几千行 Excel 一次性导入进来前端渲染就成了瓶颈。实测下来浏览器里一屏最多舒服地渲染几百行超过一千行就会出现明显的输入延迟。这个版本对表格本身做了列表虚拟化也就是说它只渲染可视区域内的行滚动时按需替换节点。配合虚拟滚动之后我测试几千行数据滚动是流畅的但要注意导入时勾选“分批导入”把解析后的数据分块写入表格而不是一次性 set 一个大数组同时给表格列设置固定列宽避免渲染时反复触发重排。对绝大多数业务表单来说单表控制在 500 行以内体验最好超过建议让业务按批次拆开别指望一个表单塞下整年的流水。另一个跟 Excel 相关的细节是导出。导出文件导出后还要打开核对一遍尤其是“列头是否对得上”。我在测试 v6.2 导出时表格里没给列设置 width 的列导出后的列宽会被 Excel 自动缩成一格宽阅读体验很差。建议配置列时顺手把 width 写明确。3. 事件系统升级从“控件小动作”到“跨组件联动”3.1 新事件模型和老方案的本质差异老版本的事件理解成“控件自己的钩子”更准确下拉框有 on-change输入框有 on-input表单有 on-submit。它们能解决单点问题但做不了跨组件编排。比如“当费用分类选择‘差旅费’时自动把补贴金额填成 200”靠单个组件的事件很难优雅实现最后都变成了在代码里写 watch。v6.2 把事件升级为“表单级的事件总线 可视化的动作配置”。我理解这个改动背后是两种思维楔入位置不同老事件挂在“控件内部”;新事件挂在“表单流程”上。事件可以来源于某个控件但处理逻辑放在表单层所以能访问到其他字段的数据。动作不再局限于当前控件一个事件触发之后动作可以是 setValue(改某个字段)、updateColumn(改表格列)、show/hide(控制显隐)、callApi(调用接口)、trigger(触发另一个事件)等。3.2 事件触发时机与执行顺序要理清事件能力越强执行顺序越要谨慎。v6.2 的配置面板里每个事件会区分触发时机以“数据变化”这类事件来说我建议你按这个顺序理解beforeChange数据即将写入目标字段之前触发适合做拦截校验比如日期范围不合理就阻止写入。change数据已经写入、界面重新渲染之后触发适合做联动这时读到的字段值已经是最新值。afterChange依赖外部数据落地的时机比如把变化后的数据同步给外部表格或图表适合放与接口、缓存相关的操作。我在项目里遇到过把联动动作放在 beforeChange 里导致的值不更新问题表面上看起来是“事件没生效”实际是动作执行时新值还没落进去。优先用 change 做依赖新值的联动只有明确要“阻止写入”才用 beforeChange。另外多个事件监听同一字段时顺序基本按配置面板里的先后顺序执行。设计时不要依赖事件之间的“隐式先后”如果两个联动有依赖关系建议用一个事件串起来或拆成多个显式配置并加注释。表单里有数据表格时表格单元格的 change 事件会比较频繁如果每个单元格都触发一次全表单联动计算性能会很难看。可以把联动条件收敛成“整行/整表数据变化时”或直接在表达式里判断是哪个单元格变化的再决定要不要触发。3.3 自定义事件与外部系统怎么对接v6.2 还提供了一个自定义事件入口允许表单把内部动作广播给宿主页面。对做低代码平台的人来说这一步把“表单”和“页面”真正打通了。之前我们要实现“表单提交后刷新外部列表”只能在 submit 回调里写业务代码现在可以在设计器里配置一个提交后事件向外部发送 submitted 这类自定义事件名称宿主页面监听这些名字做刷新、跳转、埋点。反过来外部页面也可以往表单里派发事件比如点击地图标记后让表单的定位字段自动回填。用的时候注意事件命名规范建议统一用 namespace:action 的格式例如 form:submit:after、map:locate:selected避免事件名冲突。自定义事件还有一个衍生用途联调。我测试时常常把某个复杂联动先配置成一个临时事件在宿主页 console 里监听触发次数用来定位“到底执行了几次”。这个习惯帮我抓到了很多看起来随机出现的 bug。4. 实测 v6.2 中我踩过的四个具体问题4.1 导出 Excel 后列宽和表头对不齐第一次导出某张明细表打开 Excel 发现名字列特别宽日期列窄得只剩一格。查了一下导出列宽取自表格列的 width 字段我配置表格时没有给所有列明确 width而是用了默认值。导出模块拿不到明确宽度时就按导出模板的默认宽度处理。解决方式很简单在数据表格列配置里把每一列的 width 都填成实际需要的数值单位是像素。设计器里看起来宽的列导出时同样会占用对应宽度。给表头的 title 也别留空格Excel 里表头有空格会出现难看的换行。如果你需要自定义打印宽度建议在导出事件里对特定列做二次宽度覆盖。4.2 事件冒泡导致表单连续提交两次我给“提交”按钮配了一个自定义事件动作是调用接口保存数据同时又在表单的 afterSubmit 里写了同样的保存逻辑。结果一次点击接口被调用两次生成了两条重复单据。这不是 v6.2 独有的问题而是事件系统升级后很容易踩的“新旧写法叠加”旧代码在 on-submit 里保存了一次新配置又在提交事件里保存了一次。处理方法是明确“唯一动作来源”。表单的 on-submit 和设计器里配置的提交后自定义事件只能二选一做提交持久化。我的建议是把真正的接口调用放在宿主代码里设计器内只负责发通知如果你把持久化挪到了设计器事件里务必把原来的 on-submit 里的逻辑去掉。排查时也不用猜在宿主页监听对应事件名打个计时日志就能看到触发了几次。4.3 Excel 日期列被当成纯数字处理有一天测试导入发现“发生日期”列导入后变成了 45123 之类的数字串我当时以为是解析库版本不对后来发现是源文件本身的问题业务同事在 Excel 里输入日期时单元格格式是“常规”Excel 显示的是日期但底层存的已经是日期序列值。导入解析时如果列类型映射里没有声明“这是日期列”它自然按数字读出来。正确做法是在导入映射阶段指定这个列的目标类型为 datePicker并声明日期格式。v6.2 的导入界面里有列类型设置默认推测可能不准需要人工确认。源文件最好也先统一格式日期列全部选中右键设置单元格格式为“日期”再复制粘贴。两边一起规范这个坑基本就不会再出现。4.4 设计器里改完事件配置后没生效有几次我改完联动条件保存配置后重新生成表单变化却“没生效”。后来发现是浏览器把 JSON 配置缓存住了。设计器生成的配置是会被宿主项目以 JSON 形式消费的如果宿主把配置放在了某个模块的顶层缓存里编辑保存后需要重新拉取。处理办法是在开发环境给配置接口加一个版本号参数或禁用缓存如果是本地静态 JSON保存后确认文件真的覆盖了如果表单是动态渲染的改完配置要强制刷新页面并清掉内存里的表单实例。每次改完事件配置建议先刷新再验证避免在“配置没加载最新”的状态下白忙半小时。5. 从旧版本升级到 v6.2 的迁移清单5.1 数据表格字段结构兼容如果你在旧版本里已经用 repeat 字段或自定义组件模拟过明细表升级前要把数据结构对齐。v6.2 的 dataTable 默认 value 是对象数组字段数组里每项是键值对的形式如果你以前自定义组件的 value 结构是带 total 和 rows 的包裹结构需要做一层转换。我的迁移建议是先不要急着把历史存量表单全部换成 dataTable选一个正在迭代的明细类表单做试点跑通 Excel 导入导出和事件联动后再推广。低代码工具最怕的是“批量迁移后样式和数据双向不一致”到时候排查工作量远超省下来的开发量。5.2 事件配置的默认行为变化升级后旧代码里挂在组件上的 on-change 等事件钩子在新版本里仍然兼容但设计器配置的事件动作会优先于旧钩子执行。也就是说你不要以为只在组件上挂 on-change 就不会被设计器里的 change 事件影响如果两边都配了打印逻辑你会看到两句日志先后触发。建议在新项目里把联动逻辑统一收敛到设计器的事件配置里旧代码只保留“宿主导航、接口鉴权”这类外部职责不要把逻辑拆成一半在配置一半在代码排查起来会非常痛苦。5.3 构建产物与样式覆盖要重新检查v6.2 新增了数据表格组件对应的样式文件里多了 table 相关类名。如果你之前用全局样式覆盖过某些表格类名升级后要检查有没有误伤新组件。比如有些项目会给 th、td 统一加 padding新表格的列头可能出现间距异常。我升级时还把 package 里引用的依赖版本写死了凡是用到内部表格能力的部分都回归了一遍输入、校验、导出三条链路的用例。低代码设计器这种“改一个底层组件、影响所有上层表单”的特性决定了升级必须回归不能只看 UI。最后再分享一个小心得这次从 v6.2 上我感受最深的一句话是“表单不是界面是数据入口”。数据表格、Excel 导入导出、事件联动这三件事凑齐意味着很多过去要写代码的表单需求现在可以在设计器里直接配置出来。建议你在下一个涉及明细和批量录入的需求里先拿 v6.2 的表格画一版原型给业务看大概率比你自己从 el-table 开始堆更顺。版本功能我是按目前测试的构建版写的如果你实际使用的版本在某个细节上有差异以你手里的 release 为准但整体思路是可以照搬的。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →