Vue3 集成智表 ZCell:多实例在线 Excel 实践

背景

做企业后台、数据填报、报表类系统,经常遇到在线 Excel 类需求:合并单元格、公式计算、下拉复选、批量写入,甚至页面同时渲染多个独立表格,做模板复制、双表比对。

如果从零开发一套表格,工作量巨大;市面上部分表格组件存在几个痛点:

  1. 和 Vue 组合式 API 适配差,实例管理麻烦;
  2. DOM 渲染,大数据量滚动卡顿;
  3. 页面多表格实例容易互相干扰;
  4. 事件回调、单元格类型配置繁琐。

智表 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事件,修改互不干扰,适合模板复制、双表审核业务。

适用业务场景

  1. 数据填报系统:复选框、下拉选择、单元格按钮,实现复杂表格填报;
  2. 报表后台:在线编辑报表模板,公式自动计算;
  3. 双表对比审核:多表格实例,复制模板、比对两份表格数据;
  4. 财务测算系统:兼容 Excel 公式,在线完成财务计算;
  5. 低代码平台:嵌入画布,作为在线表格组件。

开发踩坑总结

  1. 保存 workbook 实例优先使用shallowRef,不要用 ref,避免大型实例做响应式劫持;
  2. 批量循环修改单元格,务必调用SuspendPaint()挂起绘制,修改完成RecoverPaint()恢复,否则性能很差;
  3. 多实例同步,回调函数不能直接拷贝,需要重新创建回调绑定目标 sheet 对象;
  4. 修改工作表内容后,调用RefreshSheetBar()刷新工作表页签栏;
  5. Canvas 渲染容器必须设置明确宽高,否则表格渲染异常。

写在最后

如果项目需要在线 Excel 能力,又不想投入巨大成本自研表格,智表 ZCell 是一个不错的备选。原生提供 Vue 组件封装,API 语义清晰,官方 Demo 丰富,Canvas 渲染保证大数据量下的性能,支持多实例、公式、各类特殊单元格,拿来即可二次开发业务。

本文示例全部来自官方 demo,大家可以直接在线体验。

posted @ 2026-10-19 21:31  帆张芳显  阅读(3)  评论(0)    收藏  举报