xiaodao-spreader 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ZH.md +459 -0
- package/README.md +409 -44
- package/dist/style.css +1 -1
- package/dist/types/components/spreader/{dropdown.vue.d.ts → components/dropdown.vue.d.ts} +7 -5
- package/dist/types/components/spreader/{borderPicker.vue.d.ts → components/pickers/borderPicker.vue.d.ts} +3 -0
- package/dist/types/components/spreader/{colorPicker.vue.d.ts → components/pickers/colorPicker.vue.d.ts} +6 -4
- package/dist/types/components/spreader/components/pickers/mergePicker.vue.d.ts +27 -0
- package/dist/types/components/spreader/{spreader.vue.d.ts → components/spreadsheet.vue.d.ts} +2 -8
- package/dist/types/components/spreader/{tabbar.vue.d.ts → components/tabbar.vue.d.ts} +11 -11
- package/dist/types/components/spreader/components/toolbar.vue.d.ts +111 -0
- package/dist/types/components/spreader/composables/borders-merge.d.ts +48 -0
- package/dist/types/components/spreader/composables/core-state.d.ts +98 -0
- package/dist/types/components/spreader/composables/interactions.d.ts +87 -0
- package/dist/types/components/spreader/composables/sheets-ops.d.ts +45 -0
- package/dist/types/components/spreader/composables/undo-styles.d.ts +86 -0
- package/dist/types/components/spreader/{constants.d.ts → core/constants.d.ts} +7 -0
- package/dist/types/components/spreader/{types.d.ts → core/types.d.ts} +2 -0
- package/dist/types/components/spreader/index.d.ts +8 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/xiaodao-spreader.es.js +3439 -2617
- package/dist/xiaodao-spreader.umd.js +9 -9
- package/package.json +2 -1
- package/dist/types/components/spreader/toolbar.vue.d.ts +0 -44
- /package/dist/types/components/spreader/{formula.d.ts → core/formula.d.ts} +0 -0
- /package/dist/types/components/spreader/{theme.d.ts → core/theme.d.ts} +0 -0
- /package/dist/types/components/spreader/{utils.d.ts → core/utils.d.ts} +0 -0
package/README.ZH.md
ADDED
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
# 小刀电子表格 (Xiaodao Spreader)
|
|
2
|
+
|
|
3
|
+
[中文](./README.ZH.md) | English
|
|
4
|
+
|
|
5
|
+
基于 Canvas 的高性能 Vue 3 电子表格组件,在网页中提供类 Excel 的编辑体验。
|
|
6
|
+
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://vuejs.org/)
|
|
9
|
+
[](https://www.typescriptlang.org/)
|
|
10
|
+
[](https://vitejs.dev/)
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 目录
|
|
17
|
+
|
|
18
|
+
- [功能特性](#功能特性)
|
|
19
|
+
- [安装](#安装)
|
|
20
|
+
- [快速开始](#快速开始)
|
|
21
|
+
- [基础用法](#基础用法)
|
|
22
|
+
- [Props 属性](#props-属性)
|
|
23
|
+
- [数据模型](#数据模型)
|
|
24
|
+
- [架构设计](#架构设计)
|
|
25
|
+
- [键盘快捷键](#键盘快捷键)
|
|
26
|
+
- [公式引擎](#公式引擎)
|
|
27
|
+
- [主题与国际化](#主题与国际化)
|
|
28
|
+
- [开发指南](#开发指南)
|
|
29
|
+
- [构建发布](#构建发布)
|
|
30
|
+
- [路线图](#路线图)
|
|
31
|
+
- [贡献指南](#贡献指南)
|
|
32
|
+
- [开源协议](#开源协议)
|
|
33
|
+
- [English Version](./README.md)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 功能特性
|
|
38
|
+
|
|
39
|
+
### 核心电子表格
|
|
40
|
+
|
|
41
|
+
- **Canvas 2D 渲染** — 高 DPI 自适应(DPR 缩放),虚拟视口渲染,支持 200 行 × 26 列
|
|
42
|
+
- **多 Sheet 工作簿** — 标签栏支持新建、重命名、复制、删除、拖拽排序
|
|
43
|
+
- **公式引擎** — `=SUM()` 区间求和,支持依赖追踪与循环引用检测
|
|
44
|
+
- **合并单元格** — 合并居中、跨列合并、取消合并,边框自动同步
|
|
45
|
+
- **丰富单元格格式** — 字体、字号(5–72)、加粗、斜体、下划线、删除线、文字颜色、填充颜色、水平/垂直对齐、自动换行
|
|
46
|
+
- **边框** — 上/下/左/右/全部/无,5 种预设样式及自定义颜色
|
|
47
|
+
- **撤销 / 重做** — 单元格、列宽、行高的完整状态快照(50 步)
|
|
48
|
+
- **格式刷** — 复制并应用单元格格式到任意区域
|
|
49
|
+
|
|
50
|
+
### 交互体验
|
|
51
|
+
|
|
52
|
+
- **智能选区** — 点击、拖拽、Shift+点击、行/列标题选择、全选按钮
|
|
53
|
+
- **双击编辑** — 行内编辑器,使用 `<textarea>` 支持多行输入
|
|
54
|
+
- **编辑栏** — 专用编辑栏,带单元格地址标签及实时公式显示
|
|
55
|
+
- **完整键盘导航** — 方向键、Tab、Enter、Home、End、Ctrl+Home、Ctrl+End
|
|
56
|
+
- **上下文菜单** — 智能识别当前区域(单元格、行、列、Sheet 标签),支持多级子菜单
|
|
57
|
+
- **行/列操作** — 右键菜单插入、删除、剪切、复制、粘贴
|
|
58
|
+
- **列宽/行高** — 拖拽调整,实时预览,双击自动适配
|
|
59
|
+
- **触摸支持** — 滑动滚动,双击进入编辑模式
|
|
60
|
+
- **响应式** — ResizeObserver 监听容器尺寸变化
|
|
61
|
+
|
|
62
|
+
### 视觉体验
|
|
63
|
+
|
|
64
|
+
- **明/暗双主题** — 完整的调色板,50+ CSS 自定义属性
|
|
65
|
+
- **国际化** — 内置中文(zh-CN)与英文(en-US)
|
|
66
|
+
- **溢出工具栏** — 响应式工具栏,自动将溢出按钮折叠到下拉菜单
|
|
67
|
+
- **自定义滚动条** — 仿原生滚动条,带箭头按钮及可拖拽滑块
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 安装
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# pnpm(推荐)
|
|
75
|
+
pnpm add xiaodao-spreader
|
|
76
|
+
|
|
77
|
+
# npm
|
|
78
|
+
npm install xiaodao-spreader
|
|
79
|
+
|
|
80
|
+
# yarn
|
|
81
|
+
yarn add xiaodao-spreader
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Peer 依赖
|
|
85
|
+
|
|
86
|
+
- `vue` ^3.4.0
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 快速开始
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# 克隆仓库
|
|
94
|
+
git clone https://github.com/xiaodaozhi/xiaodao-spreader.git
|
|
95
|
+
cd xiaodao-spreader
|
|
96
|
+
|
|
97
|
+
# 安装依赖
|
|
98
|
+
pnpm install
|
|
99
|
+
|
|
100
|
+
# 启动开发服务器
|
|
101
|
+
pnpm dev
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
访问 `http://localhost:5173` 查看演示应用。
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 基础用法
|
|
109
|
+
|
|
110
|
+
```vue
|
|
111
|
+
<template>
|
|
112
|
+
<Spreader
|
|
113
|
+
v-model:data="myData"
|
|
114
|
+
:row-count="100"
|
|
115
|
+
:col-count="12"
|
|
116
|
+
theme="light"
|
|
117
|
+
locale="zh-CN"
|
|
118
|
+
/>
|
|
119
|
+
</template>
|
|
120
|
+
|
|
121
|
+
<script setup lang="ts">
|
|
122
|
+
import { ref } from 'vue';
|
|
123
|
+
import Spreader from 'xiaodao-spreader';
|
|
124
|
+
import type { SheetModelData } from 'xiaodao-spreader';
|
|
125
|
+
|
|
126
|
+
const myData = ref<SheetModelData[]>([
|
|
127
|
+
{
|
|
128
|
+
name: 'Sheet1',
|
|
129
|
+
cells: {
|
|
130
|
+
'0,0': { value: '姓名' },
|
|
131
|
+
'0,1': { value: '年龄' },
|
|
132
|
+
'1,0': { value: '张三', style: { fontSize: 14, fontWeight: 'bold' } },
|
|
133
|
+
'1,1': { value: '28' },
|
|
134
|
+
},
|
|
135
|
+
colWidths: { 0: 120, 1: 80 },
|
|
136
|
+
},
|
|
137
|
+
]);
|
|
138
|
+
</script>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Props 属性
|
|
144
|
+
|
|
145
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
146
|
+
|------|------|--------|------|
|
|
147
|
+
| `data` (v-model) | `SheetModelData[]` | `[]` | 多 Sheet 数据(双向绑定) |
|
|
148
|
+
| `rowCount` | `number` | `200` | 每个 Sheet 的总行数 |
|
|
149
|
+
| `colCount` | `number` | `26` | 每个 Sheet 的总列数 |
|
|
150
|
+
| `width` | `number \| string` | — | 组件宽度(像素;传 `string` 或省略则自适应) |
|
|
151
|
+
| `height` | `number \| string` | — | 组件高度(像素;传 `string` 或省略则自适应) |
|
|
152
|
+
| `theme` | `'light' \| 'dark'` | `'light'` | 主题模式 |
|
|
153
|
+
| `locale` | `string` | `'zh-CN'` | 语言 — `'zh-CN'` \| `'en-US'` |
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 数据模型
|
|
158
|
+
|
|
159
|
+
### `SheetModelData`
|
|
160
|
+
|
|
161
|
+
用于 v-model 双向绑定的外部数据格式:
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
interface SheetModelData {
|
|
165
|
+
name: string;
|
|
166
|
+
cells: Record<string, {
|
|
167
|
+
value: string;
|
|
168
|
+
style?: Record<string, unknown>;
|
|
169
|
+
}>;
|
|
170
|
+
merges?: Record<string, SelectionRange>;
|
|
171
|
+
colWidths?: Record<number, number>;
|
|
172
|
+
rowHeights?: Record<number, number>;
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
- **`cells`**:键为 `"列,行"` 格式(如 `"0,0"` 代表 A1 单元格)。
|
|
177
|
+
- **`style`**:类 CSS 样式属性(`fontSize`、`fontWeight`、`color`、`background` 等)。
|
|
178
|
+
- **`merges`**:合并单元格定义,以合并锚点单元格为键。
|
|
179
|
+
- **`colWidths` / `rowHeights`**:稀疏映射 — 仅存储非默认值。
|
|
180
|
+
|
|
181
|
+
### 类型导出
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import type {
|
|
185
|
+
CellCoord, // { col: number; row: number }
|
|
186
|
+
SelectionRange, // { startCol; startRow; endCol; endRow }
|
|
187
|
+
CellData, // { value: string; style: Record<string, unknown> | null }
|
|
188
|
+
Range, // { start: number; end: number }
|
|
189
|
+
SpreadsheetOptions,
|
|
190
|
+
SpreadsheetData,
|
|
191
|
+
SheetModelData, // ← 主要数据接口
|
|
192
|
+
SheetState, // 内部运行时状态
|
|
193
|
+
UndoSnapshot,
|
|
194
|
+
ContextMenuItem,
|
|
195
|
+
ThemeColors,
|
|
196
|
+
Point,
|
|
197
|
+
} from 'xiaodao-spreader';
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## 架构设计
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
src/
|
|
206
|
+
├── components/
|
|
207
|
+
│ └── spreader.ts # 统一出口(Barrel Export)
|
|
208
|
+
│ └── spreader/
|
|
209
|
+
│ ├── components/
|
|
210
|
+
│ │ ├── spreadsheet.vue # 主组件 — 模板 + 样式 + 组合
|
|
211
|
+
│ │ ├── toolbar.vue # 工具栏(含溢出下拉)
|
|
212
|
+
│ │ ├── tabbar.vue # Sheet 标签栏
|
|
213
|
+
│ │ ├── dropdown.vue # 通用下拉组件
|
|
214
|
+
│ │ └── pickers/
|
|
215
|
+
│ │ ├── colorPicker.vue
|
|
216
|
+
│ │ ├── borderPicker.vue
|
|
217
|
+
│ │ └── mergePicker.vue
|
|
218
|
+
│ ├── composables/
|
|
219
|
+
│ │ ├── core-state.ts # Props、cells/merges/selection、字体度量、导航
|
|
220
|
+
│ │ ├── undo-styles.ts # 撤销重做、格式刷、字体/对齐/颜色
|
|
221
|
+
│ │ ├── borders-merge.ts # 边框同步、合并操作、剪贴板、求和
|
|
222
|
+
│ │ ├── sheets-ops.ts # 行列增删、多 Sheet、v-model 发射、主题、refs
|
|
223
|
+
│ │ └── interactions.ts # 渲染器、编辑栏、标签栏、右键菜单、滚动条、事件
|
|
224
|
+
│ └── core/
|
|
225
|
+
│ ├── constants.ts # 布局常量、国际化、主题调色板
|
|
226
|
+
│ ├── types.ts # 全部类型定义
|
|
227
|
+
│ ├── formula.ts # 公式引擎(解析、计算、依赖、缓存)
|
|
228
|
+
│ ├── theme.ts # 主题 CSS 变量构建
|
|
229
|
+
│ └── utils.ts # 纯工具函数(列标签、命中测试、尺寸解析)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 设计原则
|
|
233
|
+
|
|
234
|
+
- **组合式 API**:所有业务逻辑抽取到 `composables/`,保持单一职责
|
|
235
|
+
- **Canvas 2D 渲染**:仅绘制可视区域(虚拟渲染),大表流畅
|
|
236
|
+
- **无脏标记**:在交互结束点手动调用 `scheduleRender()`;`requestAnimationFrame` 自动合并同一帧的多次调用
|
|
237
|
+
- **共享状态**:将 `CoreState` 注入每个 composable,实现跨模块通信而不产生紧耦合
|
|
238
|
+
- **Reactive 包装**:composable 返回值通过 `reactive()` 包装,模板中自动解包 ref/computed
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 键盘快捷键
|
|
243
|
+
|
|
244
|
+
### 导航
|
|
245
|
+
|
|
246
|
+
| 按键 | 功能 |
|
|
247
|
+
|------|------|
|
|
248
|
+
| `↑` `↓` `←` `→` | 移动活动单元格 |
|
|
249
|
+
| `Tab` / `Shift+Tab` | 向右 / 向左移动 |
|
|
250
|
+
| `Enter` / `Shift+Enter` | 向下 / 向上移动 |
|
|
251
|
+
| `Home` / `End` | 跳到首列 / 末列 |
|
|
252
|
+
| `Ctrl+Home` / `Ctrl+End` | 跳到 A1 / 右下角 |
|
|
253
|
+
| `PageUp` / `PageDown` | 向上 / 向下翻页 |
|
|
254
|
+
|
|
255
|
+
### 编辑
|
|
256
|
+
|
|
257
|
+
| 按键 | 功能 |
|
|
258
|
+
|------|------|
|
|
259
|
+
| `F2` / `双击` / `直接输入` | 进入编辑模式 |
|
|
260
|
+
| `Enter`(编辑中) | 提交并向下移动 |
|
|
261
|
+
| `Tab`(编辑中) | 提交并向右移动 |
|
|
262
|
+
| `Escape`(编辑中) | 取消编辑 |
|
|
263
|
+
| `Ctrl+Enter` | 多行单元格内换行 |
|
|
264
|
+
| `Delete` / `Backspace` | 清除选区内容 |
|
|
265
|
+
|
|
266
|
+
### 剪贴板与历史
|
|
267
|
+
|
|
268
|
+
| 按键 | 功能 |
|
|
269
|
+
|------|------|
|
|
270
|
+
| `Ctrl+C` / `Ctrl+X` / `Ctrl+V` | 复制 / 剪切 / 粘贴 |
|
|
271
|
+
| `Ctrl+Z` / `Ctrl+Y` | 撤销 / 重做 |
|
|
272
|
+
| `Ctrl+A` | 全选 |
|
|
273
|
+
|
|
274
|
+
### 格式
|
|
275
|
+
|
|
276
|
+
| 按键 | 功能 |
|
|
277
|
+
|------|------|
|
|
278
|
+
| `Ctrl+B` | 加粗 |
|
|
279
|
+
| `Ctrl+I` | 斜体 |
|
|
280
|
+
| `Ctrl+U` | 下划线 |
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 公式引擎
|
|
285
|
+
|
|
286
|
+
### 支持的公式
|
|
287
|
+
|
|
288
|
+
| 公式 | 语法 | 说明 |
|
|
289
|
+
|------|------|------|
|
|
290
|
+
| `SUM` | `=SUM(A1:B5)` | 区间求和 |
|
|
291
|
+
| 绝对引用 | `$A$1` | 锁定列与行 |
|
|
292
|
+
| 混合引用 | `$A1`、`A$1` | 仅锁定列或行 |
|
|
293
|
+
|
|
294
|
+
### 依赖追踪
|
|
295
|
+
|
|
296
|
+
`FormulaDeps` 类维护双向依赖图:
|
|
297
|
+
|
|
298
|
+
- **正向**:`formulaKey` → `[depKey, ...]` — 公式引用了哪些单元格
|
|
299
|
+
- **反向**:`depKey` → `Set<formulaKey>` — 哪些公式依赖此单元格
|
|
300
|
+
|
|
301
|
+
单元格变更时,脏标记通过反向图传播。循环引用(深度 > 20)返回 `#ERROR`。
|
|
302
|
+
|
|
303
|
+
### 粘贴时的引用偏移
|
|
304
|
+
|
|
305
|
+
`shiftFormulaRefs()` 在粘贴时自动调整公式中的单元格引用,支持 `$` 绝对引用锁定。
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 主题与国际化
|
|
310
|
+
|
|
311
|
+
### 内置主题
|
|
312
|
+
|
|
313
|
+
```typescript
|
|
314
|
+
import type { ThemeColors } from 'xiaodao-spreader';
|
|
315
|
+
|
|
316
|
+
const lightTheme: ThemeColors = { /* 50+ 颜色字段 */ };
|
|
317
|
+
const darkTheme: ThemeColors = { /* 50+ 颜色字段 */ };
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### CSS 变量注入
|
|
321
|
+
|
|
322
|
+
主题颜色通过 CSS 自定义属性(`--sp-*`)注入:
|
|
323
|
+
|
|
324
|
+
```css
|
|
325
|
+
--sp-bg, --sp-gridBg, --sp-gridLine, --sp-selectionBg,
|
|
326
|
+
--sp-headerBg, --sp-headerBorder, --sp-headerText,
|
|
327
|
+
--sp-formulaBarBg, --sp-formulaBarInputBorder,
|
|
328
|
+
--sp-wrapperBg, --sp-cellEditorBorder,
|
|
329
|
+
/* ... 以及更多 */
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### 自定义主题
|
|
333
|
+
|
|
334
|
+
传入 `theme="dark"` 启用暗色模式,或通过包装组件覆盖 CSS 变量实现完全自定义:
|
|
335
|
+
|
|
336
|
+
```vue
|
|
337
|
+
<template>
|
|
338
|
+
<div style="--sp-bg: #1a1a2e; --sp-cellText: #e0e0e0;">
|
|
339
|
+
<Spreader v-model:data="myData" theme="dark" />
|
|
340
|
+
</div>
|
|
341
|
+
</template>
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### 国际化
|
|
345
|
+
|
|
346
|
+
内置语言:`'zh-CN'`、`'en-US'`。通过 `locale` 属性传入。右键菜单和工具栏标签自动本地化。
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 开发指南
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# 安装依赖
|
|
354
|
+
pnpm install
|
|
355
|
+
|
|
356
|
+
# 启动开发服务器(自动热更新)
|
|
357
|
+
pnpm dev
|
|
358
|
+
|
|
359
|
+
# 仅做类型检查
|
|
360
|
+
pnpm type-check
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
开发服务器默认运行在 `http://localhost:5173`。
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 构建发布
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
# 生产构建(类型检查 + vite build)
|
|
371
|
+
pnpm build
|
|
372
|
+
|
|
373
|
+
# 预览生产构建
|
|
374
|
+
pnpm preview
|
|
375
|
+
|
|
376
|
+
# 演示/测试构建
|
|
377
|
+
pnpm build:demo
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 构建产物
|
|
381
|
+
|
|
382
|
+
| 文件 | 说明 |
|
|
383
|
+
|------|------|
|
|
384
|
+
| `dist/xiaodao-spreader.es.js` | ES 模块(供打包器使用) |
|
|
385
|
+
| `dist/xiaodao-spreader.umd.js` | UMD 包(供 `<script>` 直接引用) |
|
|
386
|
+
| `dist/xiaodao-spreader.css` | 提取的样式表 |
|
|
387
|
+
| `dist/types/` | TypeScript 声明文件 |
|
|
388
|
+
|
|
389
|
+
### CI/CD
|
|
390
|
+
|
|
391
|
+
项目包含 GitHub Actions 工作流(`.github/workflows/publish.yml`),用于自动发布到 npm。
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
## 路线图
|
|
396
|
+
|
|
397
|
+
### 近期
|
|
398
|
+
|
|
399
|
+
- [ ] 更多公式:`AVERAGE`、`COUNT`、`IF`、`VLOOKUP`、`CONCATENATE`
|
|
400
|
+
- [ ] 单元格背景颜色选择器
|
|
401
|
+
- [ ] 数字格式(货币、百分比、日期、小数位数)
|
|
402
|
+
- [ ] 条件格式规则
|
|
403
|
+
- [ ] 自动填充拖拽手柄
|
|
404
|
+
- [ ] 查找与替换
|
|
405
|
+
|
|
406
|
+
### 中期
|
|
407
|
+
|
|
408
|
+
- [ ] 冻结窗格(冻结行/列)
|
|
409
|
+
- [ ] 数据验证(下拉列表、输入约束)
|
|
410
|
+
- [ ] 行列分组与折叠
|
|
411
|
+
- [ ] 排序与筛选
|
|
412
|
+
- [ ] 单元格批注
|
|
413
|
+
- [ ] 打印布局
|
|
414
|
+
|
|
415
|
+
### 远期
|
|
416
|
+
|
|
417
|
+
- [ ] OffscreenCanvas + Web Worker 多线程渲染
|
|
418
|
+
- [ ] Shared Worker 跨标签页协作
|
|
419
|
+
- [ ] 插件系统(自定义单元格渲染器)
|
|
420
|
+
- [ ] Excel / CSV 导入导出
|
|
421
|
+
- [ ] 图表引擎(嵌入式迷你图表)
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## 技术栈
|
|
426
|
+
|
|
427
|
+
| 层级 | 技术 | 版本 |
|
|
428
|
+
|------|------|------|
|
|
429
|
+
| 框架 | Vue 3(Composition API + `<script setup>`) | ^3.4 |
|
|
430
|
+
| 构建 | Vite | ^5.0 |
|
|
431
|
+
| 语言 | TypeScript(严格模式) | ~5.4 |
|
|
432
|
+
| 渲染 | Canvas 2D API | — |
|
|
433
|
+
| 类型检查 | vue-tsc | ^2.2 |
|
|
434
|
+
| 包管理 | pnpm | — |
|
|
435
|
+
| CSS | Scoped CSS + CSS 自定义属性 | — |
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## 贡献指南
|
|
440
|
+
|
|
441
|
+
欢迎贡献代码!请按以下步骤操作:
|
|
442
|
+
|
|
443
|
+
1. Fork 仓库
|
|
444
|
+
2. 创建功能分支(`git checkout -b feature/amazing-feature`)
|
|
445
|
+
3. 提交更改(`git commit -m 'feat: add amazing feature'`)
|
|
446
|
+
4. 推送到分支(`git push origin feature/amazing-feature`)
|
|
447
|
+
5. 提交 Pull Request
|
|
448
|
+
|
|
449
|
+
提交前请确保类型检查通过(`pnpm type-check`)且构建成功(`pnpm build`)。
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## 开源协议
|
|
454
|
+
|
|
455
|
+
本项目基于 MIT 协议 — 详见 [LICENSE](LICENSE) 文件。
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
**由 [xiaodaozhi](https://github.com/xiaodaozhi) 精心打造**
|