# vue-canvas-sheet
**Repository Path**: leepule/vue-canvas-sheet
## Basic Information
- **Project Name**: vue-canvas-sheet
- **Description**: 一款基于 Canvas 渲染、Rust + WASM 向量化公式引擎驱动的高性能 Vue 3 表格组件。专为百万级单元格场景设计,在 Web 上交付接近原生 Excel 的操作体验。
- **Primary Language**: JavaScript
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: https://leepule.github.io/vue-canvas-sheet/
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-05-26
- **Last Updated**: 2026-09-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🚀 Vue Canvas Sheet
[](https://www.npmjs.com/package/vue-canvas-sheet)
[](https://vuejs.org/)
[](https://opensource.org/licenses/Apache-2.0)
[](https://webassembly.org/)
[](./readme.md)
> 一款基于 Canvas 渲染、共享 JS 公式引擎并为已验证数值公式提供 Rust + WASM 加速的高性能 Vue 3 表格组件。专为**百万级单元格**场景设计,在 Web 上交付接近原生 Excel 的操作体验。
[**English**](./readme.md) · [**使用文档**](./docs/USAGE.md) · [**在线 Demo**](./samples/basic-usage)
---
## ✨ 核心亮点
- **⚡ Canvas 集群渲染** —— 纯 Canvas 2D 管线,10W+ 行数据下保持 60 FPS 滚动,零 DOM 渲染开销。
- **🦀 Rust + WASM 引擎** —— 加速已验证的纯数字算术子集;引用、函数、字符串、布尔值、比较和未支持语法统一走共享 JS RPN 引擎。
- **🧵 Worker + SharedArrayBuffer** —— 计算线程与 UI 线程彻底解耦,大数据更新时界面依然响应如飞。
- **💾 IndexedDB 持久化** —— 基于 diff 的增量保存,启用 `enable-persistence` 即可秒开历史数据。
- **🧩 Headless 友好** —— `Workbook` 可在 Node.js / Web Worker 中独立运行,UI 层与核心层完全解耦。
- **🤝 实时协同** —— 内置协同插件,支持光标同步、选区共享、单元格锁定(基于 WebSocket)。
- **📥 导入 / 导出** —— 通过专用插件支持 `.xlsx / .xls / .csv / .tsv / .json` 双向转换(Excel 导出走 Worker,不阻塞主线程)。
- **🌈 Excel 级特性** —— 100+ 公式、单元格合并、冻结窗格、条件格式、公式栏、撤销重做、查找替换。
---
## 📊 性能表现 (Benchmark)
| 测试项目 (50,000 行 / 200,000 单元格) | 耗时 | 备注 |
| :--- | :--- | :--- |
| 数据初始化加载 (`setData`) | **~200ms** | 含 5W 个动态公式的解析与注入 |
| 首帧渲染 | **~16ms** | Canvas 硬件加速,60 FPS 滚动 |
---
## 📦 安装
```bash
npm install vue-canvas-sheet
# 或
pnpm add vue-canvas-sheet
# 或
yarn add vue-canvas-sheet
```
> Rust/WASM 引擎已预构建并随包发布,无需额外的工具链。
Peer 依赖:`vue ^3.5.0`。
---
## 🚀 快速开始
```vue
```
> `TableDesigner` 会撑满父容器,请确保父容器具有显式 `height`。
---
---
## 📑 多工作表
`TableDesigner` 内置底部工作表标签页,组件 ref 也暴露同名 API:
```js
const sheetId = table.value.addSheet('明细');
table.value.switchSheet('总表');
table.value.sheetName = '汇总';
table.value.deleteSheet(sheetId);
table.value.getSheets(); // [{ id, name, isActive }]
```
在界面中双击底部工作表标签可以直接进入重命名输入框;回车或点击外部确认,Esc 取消,重名或空名称会保留编辑状态并提示。多表时标签右侧提供删除按钮;最后一个工作表不可删除。
每个工作表独立保存数据、样式、合并、冻结与选区;`toJSON()` 会一并导出所有工作表。当前公式引擎仍以单工作表为边界,暂不支持 `=Sheet2!A1` 跨表引用。IndexedDB 自动保存在多 Sheet 场景会保存完整 Workbook 快照,可恢复所有工作表名称、活动表与数据。
---
## 🧩 插件体系
所有插件均以工厂函数形式从包根导出:
```js
import {
TableDesigner,
createSelectionHistoryPlugin,
createAutoSavePlugin,
createExportPlugin,
createImportPlugin,
createCollaborativeCursorPlugin,
createRealtimeCollaborationPlugin,
} from 'vue-canvas-sheet';
```
| 插件 | 用途 |
| --- | --- |
| `SelectionHistoryPlugin` | 选区前进 / 后退 |
| `AutoSavePlugin` | 事件驱动或定时自动保存(IndexedDB / localStorage) |
| `ExportPlugin` | 导出 `.xlsx`(Worker)/`.csv`/`.json` |
| `ImportPlugin` | 导入 `.xlsx / .xls / .csv / .tsv / .json` |
| `CollaborativeCursorPlugin` | 渲染远端用户光标与选区 |
| `RealtimeCollaborationPlugin` | 通过 WebSocket 同步编辑、选区与单元格锁 |
CSV 导出默认为类公式文本添加单引号前缀。仅当数据可信且必须保留表格公式语义时,使用 `exportCSV({ allowFormulas: true })` 显式放行。
```vue
```
仓库内含参考 WebSocket 服务器,执行 `npm run collab:server` 即可在本地体验协同功能。
---
## 🛠 Workbook API(节选)
通过组件 ref 获取底层 `Workbook` 实例:
```js
const wb = tableRef.value.workbook;
// 单元格
wb.setCell(0, 0, { v: 100 });
wb.setCell(0, 1, { f: '=A1*2' });
const cell = wb.getCell(0, 1);
const value = wb.getCellValue(0, 1);
// 选区与样式
wb.setSelection(0, 0, 5, 5);
wb.setStyle(range, { bold: true, color: '#f00' });
wb.setBorder(range, 'all', '#000', 'solid');
// 结构操作
wb.mergeCells(range);
wb.setFreeze(1, 1);
wb.undo(); wb.redo();
// 计算引擎
wb.registerFunction('DOUBLE', value => value * 2);
wb.setCell(0, 2, { f: '=DOUBLE(A1)' });
wb.enableWorker();
wb.recalcAll({ useWorker: true });
wb.getSystemReport();
// 事件订阅
const off = wb.on('cell-change', (changes) => { /* ... */ });
off();
```
完整文档(使用 / API / 插件 / 公式)参见 [文档中心](./docs/README.md)。
---
## ⚡ 性能调优
**大数据集 + 主线程向量化** —— 跳过 Worker 序列化开销:
```js
table.value.workbook.recalcAll({ useWorker: false });
```
**懒加载** 适用于 5W+ 行:
```vue
```
**启用 `SharedArrayBuffer`** —— 生产环境配置以下响应头即可激活多线程 WASM:
```http
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
```
未配置 COOP/COEP 时引擎会自动降级到主线程计算,可调用 `wb.getSystemReport()` 查看当前运行状态。
---
## 📁 多入口导出
```js
import { TableDesigner, Workbook, SvgIcon } from 'vue-canvas-sheet';
import { Workbook as CoreWorkbook } from 'vue-canvas-sheet/core';
import { OffscreenRenderer } from 'vue-canvas-sheet/render';
```
---
## 🧪 本地开发
```bash
npm install
npm run dev # 开发服务器 (vite)
npm run demo # 运行 samples/basic-usage
npm run test # 单元测试 (vitest)
npm run benchmark # 性能基准
npm run build # 构建 WASM + JS 产物
npm run collab:server # 启动协同参考服务器
```
---
## 📄 开源协议
[Apache License 2.0](./LICENSE) —— Copyright © 2026-Present, Lee & Vue-Canvas-Sheet Team.