Vue3 集成智表 ZCell:多实例在线 Excel 实践
背景
做企业后台、数据填报、报表类系统,经常遇到在线 Excel 类需求:合并单元格、公式计算、下拉复选、批量写入,甚至页面同时渲染多个独立表格,做模板复制、双表比对。
如果从零开发一套表格,工作量巨大;市面上部分表格组件存在几个痛点:
- 和 Vue 组合式 API 适配差,实例管理麻烦;
- DOM 渲染,大数据量滚动卡顿;
- 页面多表格实例容易互相干扰;
- 事件回调、单元格类型配置繁琐。
智表 ZCell 是基于 Canvas 实现的前端在线 Excel 组件,官方直接提供 Vue 封装组件ZCellVue,可以原生接入 Vue3 项目。下面结合官方示例源码,记录完整集成过程与实战要点。
测试环境:Vue3,ESM importmap 方式引入 ZCell,示例代码可直接复制运行。
ZCell Vue 集成核心要点
ZCell 通过DefineZCellVue(Vue)接收 Vue 对象,生成可直接使用的 Vue 组件。表格渲染完成后触发ready事件,返回工作簿实例。
重要:workbook 是大型复杂对象,不要用普通
ref,推荐使用shallowRef,避免不必要的响应式劫持,减少性能损耗。
import * as Vue from "vue";
const { createApp, ref, shallowRef } = Vue;
// 生成ZCell Vue组件
const ZCellVue = ZCell.DefineZCellVue(Vue);
模板中直接使用ZCellVue,同一个页面可以实例化多个组件,各个表格工作簿完全隔离。
<ZCellVue class="grid" @ready="onReady" />
<ZCellVue class="grid" @ready="onSecondReady" />
Demo 实现能力清单
参考官方vue 使用示例,Demo 覆盖如下能力:
- 创建多个工作表,自定义行列数量
- 合并单元格、字体、背景色、对齐、边框样式设置
- Excel 公式自动计算
- 数字格式化:千分位、百分比、小数精度控制
- 特殊单元格类型:复选框、下拉选项、单元格按钮(支持自定义回调)
- 监听单元格修改事件,表格内部事件同步到 Vue 响应式变量
SuspendPaint/RecoverPaint挂起、恢复绘制,优化批量写入性能- 双实例表格同步:源表格完整复制内容到目标表格(值、样式、合并、公式、单元格类型)
两个表格实例相互独立,修改源表格不会自动影响目标表格,需要手动调用 API 做数据同步,适合模板复制、审核比对场景。
关键代码片段解析
1. ready 回调初始化工作表
ready拿到 workbook 实例,创建 sheet。批量操作单元格,一定要挂起绘制,否则每修改一次单元格就触发一次重绘,页面会严重卡顿。修改完毕后恢复绘制。
function onReady(book) {
book1.value = book;
const sheet = book.AppendSheet({
name: "常用 API",
rowCount: 20,
colCount: 8,
});
// 挂起绘制,批量修改提升性能
sheet.SuspendPaint();
try {
sheet.MergeCell(0, 0, 0, 5);
sheet.SetCellValue("A1", "ZCell 常用 API 示例");
// 监听单元格值变更事件
sheet.BindEvents("CellValueChangeAfter", "B4", () => {
eventMessage.value = `B4 的值已修改:${sheet.GetCellValue("B4")}`;
});
} finally {
sheet.RecoverPaint();
}
book.RefreshSheetBar();
}
2. 常用单元格 API
ZCell 提供一整套 API,覆盖绝大多数 Excel 编辑场景:
SetCellStyle:字体、加粗、字号、颜色、背景、对齐SetCellBorder:设置上下左右边框颜色与样式SetFormula:设置计算公式,自动运算SetCellFormat:数字格式化,千分位、百分比、小数位数SetCellType:设置特殊单元格,复选框、下拉、按钮,按钮支持自定义回调函数
下拉单元格简单示例:
sheet.SetCellType("D11", {
code: "dropdown",
object: {
source: {
todo: "待处理",
doing: "进行中",
done: "已完成",
},
},
});
3. 多实例数据同步(业务高频场景)
页面存在两个独立 ZCell 实例,点击同步按钮,把源表格列宽、合并区域、单元格值、样式、边框、格式、公式、下拉复选配置复制到目标表格。
⚠️注意:单元格按钮的回调函数不能直接拷贝复制,回调绑定的是源工作表对象,必须在目标 sheet 重新创建回调函数。
function syncToSecond() {
const sourceBook = book1.value;
const targetBook = book2.value;
const sourceSheet = sourceBook?.GetSheet(0);
if (!sourceSheet || !targetBook) return;
targetBook.DeleteAllSheet();
const targetSheet = targetBook.AppendSheet({
name: sourceSheet.name,
rowCount: 20,
colCount: 8,
});
targetSheet.SuspendPaint();
try {
// 复制列宽、合并区域、单元格值、样式、公式、单元格类型
// ...省略部分业务代码
// 按钮需要重新绑定目标sheet实例,不能直接复用源sheet回调
targetSheet.SetCellType("B13", {
code: "button",
object: {
text: "点击写入",
fun: () => targetSheet.SetCellValue("C13", "按钮事件已触发"),
},
});
} finally {
targetSheet.RecoverPaint();
targetBook.RefreshSheetBar();
}
}
两个表格可以各自绑定CellValueChangeAfter事件,修改互不干扰,适合模板复制、双表审核业务。
适用业务场景
- 数据填报系统:复选框、下拉选择、单元格按钮,实现复杂表格填报;
- 报表后台:在线编辑报表模板,公式自动计算;
- 双表对比审核:多表格实例,复制模板、比对两份表格数据;
- 财务测算系统:兼容 Excel 公式,在线完成财务计算;
- 低代码平台:嵌入画布,作为在线表格组件。
开发踩坑总结
- 保存 workbook 实例优先使用
shallowRef,不要用 ref,避免大型实例做响应式劫持; - 批量循环修改单元格,务必调用
SuspendPaint()挂起绘制,修改完成RecoverPaint()恢复,否则性能很差; - 多实例同步,回调函数不能直接拷贝,需要重新创建回调绑定目标 sheet 对象;
- 修改工作表内容后,调用
RefreshSheetBar()刷新工作表页签栏; - Canvas 渲染容器必须设置明确宽高,否则表格渲染异常。
写在最后
如果项目需要在线 Excel 能力,又不想投入巨大成本自研表格,智表 ZCell 是一个不错的备选。原生提供 Vue 组件封装,API 语义清晰,官方 Demo 丰富,Canvas 渲染保证大数据量下的性能,支持多实例、公式、各类特殊单元格,拿来即可二次开发业务。
本文示例全部来自官方 demo,大家可以直接在线体验。

浙公网安备 33010602011771号