tor-univer-sheet 1.0.4 → 1.0.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.md +334 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,2 +1,334 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# TorUniverSheet 项目笔记整理(完整版)
|
|
2
|
+
|
|
3
|
+
## 📦 项目概述
|
|
4
|
+
|
|
5
|
+
**项目名称**: `tor-univer-sheet`
|
|
6
|
+
**版本**: `1.0.5`
|
|
7
|
+
**描述**: 基于 Univer 的 Vue3 电子表格组件
|
|
8
|
+
**作者**: tortormore
|
|
9
|
+
**许可证**: MIT
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 🏗️ 技术栈
|
|
14
|
+
|
|
15
|
+
| 类别 | 技术 | 版本 |
|
|
16
|
+
| ---------- | ------------ | -------- |
|
|
17
|
+
| 框架 | Vue | ^3.5.0 |
|
|
18
|
+
| UI 库 | Element Plus | ^2.13.5 |
|
|
19
|
+
| 表格核心 | Univer | ^0.15.5 |
|
|
20
|
+
| 构建工具 | Vite | ^7.3.1 |
|
|
21
|
+
| 语言 | TypeScript | ~5.9.3 |
|
|
22
|
+
| 日期处理 | Dayjs | ^1.11.20 |
|
|
23
|
+
| 数值计算 | Decimal.js | ^10.6.0 |
|
|
24
|
+
| Excel 处理 | Xlsx | ^0.18.5 |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 📁 项目结构
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
src/
|
|
32
|
+
├── components/
|
|
33
|
+
│ ├── ContentWrap/ # 内容包装组件
|
|
34
|
+
│ ├── Form/ # 表单组件
|
|
35
|
+
│ ├── GlobalLoading/ # 全局加载组件
|
|
36
|
+
│ ├── IndicatorPointSelect/ # 指标选择组件
|
|
37
|
+
│ └── UniverSheet/ # 核心表格组件
|
|
38
|
+
│ ├── plugins/ # 自定义插件
|
|
39
|
+
│ │ ├── importFile/ # 文件导入插件
|
|
40
|
+
│ │ ├── indicatorsContextMenu/ # 指标右键菜单插件
|
|
41
|
+
│ │ ├── saveButton/ # 保存按钮插件
|
|
42
|
+
│ │ ├── syncContextMenu/ # 同步右键菜单插件
|
|
43
|
+
│ │ └── timeConfigContextMenu/ # 时间配置右键菜单插件
|
|
44
|
+
│ ├── UniverSheet.vue # 主组件
|
|
45
|
+
│ ├── UniverSheet.data.ts # 数据类型定义
|
|
46
|
+
│ └── data.ts # 数据工具
|
|
47
|
+
├── hooks/ # 组合式函数
|
|
48
|
+
├── types/ # 类型定义
|
|
49
|
+
├── utils/ # 工具函数
|
|
50
|
+
├── index.ts # 入口文件
|
|
51
|
+
└── main.ts # 应用入口
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 🔌 核心组件 API
|
|
57
|
+
|
|
58
|
+
### UniverSheet 组件
|
|
59
|
+
|
|
60
|
+
```vue
|
|
61
|
+
<template>
|
|
62
|
+
<UniverSheet
|
|
63
|
+
:mode="ModeEnum.edit"
|
|
64
|
+
:license="''"
|
|
65
|
+
show-import-file-plugin
|
|
66
|
+
show-indicators-context-menu-plugin
|
|
67
|
+
show-time-config-context-menu-plugin
|
|
68
|
+
/>
|
|
69
|
+
</template>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### Props
|
|
73
|
+
|
|
74
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
75
|
+
| --------------------------------- | ------------------ | ---------------------- | ---------------- |
|
|
76
|
+
| [mode] | `'view' \| 'edit'` | `'view'` | 组件模式 |
|
|
77
|
+
| [license] | `''` | Univer Advanced 许可证 |
|
|
78
|
+
| [showImportFilePlugin] | `boolean` | `false` | 显示导入插件 |
|
|
79
|
+
| [showIndicatorsContextMenuPlugin] | `boolean` | `false` | 显示指标配置插件 |
|
|
80
|
+
| [showSyncContextMenuPlugin] | `boolean` | `false` | 显示同步插件 |
|
|
81
|
+
| [showTimeConfigContextMenuPlugin] | `boolean` | `false` | 显示时间配置插件 |
|
|
82
|
+
|
|
83
|
+
#### Exposed Methods
|
|
84
|
+
|
|
85
|
+
| 方法 | 返回值 | 说明 |
|
|
86
|
+
| ---------------------------------- | ------------------ | ------------------ |
|
|
87
|
+
| [createUniverSheets(data)] | `Promise<boolean>` | 创建表格实例 |
|
|
88
|
+
| [destroyUniver()] | `void` | 销毁表格实例 |
|
|
89
|
+
| [getWorkbookData()] | [IWorkbookData] | 获取工作簿数据 |
|
|
90
|
+
| [getActiveSheetData()] | `Promise<any>` | 获取当前工作表数据 |
|
|
91
|
+
| [batchUpdateCells(cells, sheetId)] | `Promise<void>` | 批量更新单元格 |
|
|
92
|
+
| [executeCalculation()] | `void` | 执行公式计算 |
|
|
93
|
+
|
|
94
|
+
#### Events
|
|
95
|
+
|
|
96
|
+
| 事件 | 参数 | 说明 |
|
|
97
|
+
| ---------------------- | --------------------------- | -------------------- |
|
|
98
|
+
| `active-sheet-changed` | `{ workbook, activeSheet }` | 活动工作表切换时触发 |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 🔧 自定义插件系统
|
|
103
|
+
|
|
104
|
+
### 插件列表
|
|
105
|
+
|
|
106
|
+
| 插件 | 功能 | 菜单位置 |
|
|
107
|
+
| ----------------------------- | ---------------- | ----------------- |
|
|
108
|
+
| [ImportFilePlugin] | 导入 XLSX 文件 | 工具栏 - 布局组 |
|
|
109
|
+
| [SaveButtonPlugin] | 保存工作簿 | 工具栏 - 布局组 |
|
|
110
|
+
| [IndicatorsContextMenuPlugin] | 指标配置右键菜单 | 右键菜单 - 其他组 |
|
|
111
|
+
| [TimeConfigContextMenuPlugin] | 时间配置右键菜单 | 右键菜单 - 其他组 |
|
|
112
|
+
| [SyncContextMenuPlugin] | 同步右键菜单 | 右键菜单 - 其他组 |
|
|
113
|
+
|
|
114
|
+
### 注册外部组件
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// main.ts
|
|
118
|
+
import { registerExternalComponents } from 'tor-univer-sheet'
|
|
119
|
+
import IndicatorPointSelect from './components/IndicatorPointSelect.vue'
|
|
120
|
+
|
|
121
|
+
registerExternalComponents({
|
|
122
|
+
IndicatorPointSelect,
|
|
123
|
+
})
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 📝 表单配置 Schema
|
|
129
|
+
|
|
130
|
+
### 指标配置表单 (`indicatorsFormSchemas`)
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
{
|
|
134
|
+
title: '基本信息',
|
|
135
|
+
schemas: [
|
|
136
|
+
{ field: 'indicatorName', label: '指标名称', component: 'Input' },
|
|
137
|
+
{ field: 'indicatorCode', label: '指标编码', component: 'Input', disabled: true },
|
|
138
|
+
{ field: 'indicatorId', label: '指标 ID', component: 'Input', disabled: true },
|
|
139
|
+
{ field: 'indicatorDimensionName', label: '维度名称', component: 'Input', disabled: true },
|
|
140
|
+
{ field: 'indicatorDimensionConfig', label: '维度编码', component: 'Input', disabled: true },
|
|
141
|
+
{ field: 'required', label: '是否必填', component: 'ElCheckbox' }
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 时间配置表单 ([timeConfigFormSchemas])
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
{
|
|
150
|
+
title: '时间条件',
|
|
151
|
+
schemas: [
|
|
152
|
+
{ field: 'cycleType', label: '周期类型', component: 'Select' },
|
|
153
|
+
{ field: 'timeIncrement', label: '时间递增量', component: 'InputNumber' },
|
|
154
|
+
{ field: 'defaultShift', label: '默认排班班次', component: 'ElCheckbox' },
|
|
155
|
+
{ field: 'forwardPush', label: '向前推 7 天', component: 'ElCheckbox' }
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
title: '拓展形式',
|
|
160
|
+
schemas: [
|
|
161
|
+
{ field: 'copyType', label: '复制方式', component: 'Select' },
|
|
162
|
+
{ field: 'copyInterval', label: '跨多少 (行/列) 复制', component: 'InputNumber' }
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 周期类型枚举 ([CycleTypeEnum])
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
enum CycleTypeEnum {
|
|
171
|
+
无 = 'no',
|
|
172
|
+
年 = 'year',
|
|
173
|
+
月 = 'month',
|
|
174
|
+
周 = 'week',
|
|
175
|
+
天 = 'day',
|
|
176
|
+
班组 = 'shift',
|
|
177
|
+
小时 = 'hour',
|
|
178
|
+
半小时 = 'half_hour',
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 🛠️ 工具函数
|
|
185
|
+
|
|
186
|
+
### decimal.ts - 数值计算
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
import { decimal } from 'tor-univer-sheet'
|
|
190
|
+
|
|
191
|
+
// 链式调用
|
|
192
|
+
const result = decimal(100).add(50).multiply(2).toNumber() // 300
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
| 方法 | 说明 |
|
|
196
|
+
| --------------- | ---------- |
|
|
197
|
+
| [add(num)] | 加法 |
|
|
198
|
+
| [subtract(num)] | 减法 |
|
|
199
|
+
| [multiply(num)] | 乘法 |
|
|
200
|
+
| [divide(num)] | 除法 |
|
|
201
|
+
| [toFixed(dp)] | 保留小数位 |
|
|
202
|
+
| [toNumber()] | 转换为数字 |
|
|
203
|
+
|
|
204
|
+
### fileHelp.ts - 文件处理
|
|
205
|
+
|
|
206
|
+
| 方法 | 说明 |
|
|
207
|
+
| -------------------------------------------- | --------------- |
|
|
208
|
+
| [openMultipleFileSelector(accept, multiple)] | 打开文件选择器 |
|
|
209
|
+
| [getXlsxData(file)] | 读取 Excel 数据 |
|
|
210
|
+
| `downloadBlobRes(res, filename)` | 下载 Blob 文件 |
|
|
211
|
+
|
|
212
|
+
### is.ts - 类型判断
|
|
213
|
+
|
|
214
|
+
| 方法 | 说明 |
|
|
215
|
+
| ----------------- | ---------------- |
|
|
216
|
+
| `isEmpty(val)` | 判断是否为空 |
|
|
217
|
+
| `isString(val)` | 判断是否为字符串 |
|
|
218
|
+
| `isNumber(val)` | 判断是否为数字 |
|
|
219
|
+
| `isFunction(val)` | 判断是否为函数 |
|
|
220
|
+
| `isArray(val)` | 判断是否为数组 |
|
|
221
|
+
|
|
222
|
+
## 🚀 使用示例
|
|
223
|
+
|
|
224
|
+
### 基础用法
|
|
225
|
+
|
|
226
|
+
```vue
|
|
227
|
+
<template>
|
|
228
|
+
<div style="width: 100%; height: 100vh">
|
|
229
|
+
<UniverSheet ref="sheetRef" :mode="ModeEnum.edit" :license="''" />
|
|
230
|
+
</div>
|
|
231
|
+
</template>
|
|
232
|
+
|
|
233
|
+
<script setup lang="ts">
|
|
234
|
+
import { ref } from 'vue'
|
|
235
|
+
import { UniverSheet, ModeEnum } from 'tor-univer-sheet'
|
|
236
|
+
|
|
237
|
+
const sheetRef = ref()
|
|
238
|
+
|
|
239
|
+
// 获取工作簿数据
|
|
240
|
+
const saveData = () => {
|
|
241
|
+
const data = sheetRef.value.getWorkbookData()
|
|
242
|
+
console.log(data)
|
|
243
|
+
}
|
|
244
|
+
</script>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 启用插件
|
|
248
|
+
|
|
249
|
+
```vue
|
|
250
|
+
<template>
|
|
251
|
+
<UniverSheet
|
|
252
|
+
show-import-file-plugin
|
|
253
|
+
show-indicators-context-menu-plugin
|
|
254
|
+
show-time-config-context-menu-plugin
|
|
255
|
+
show-sync-context-menu-plugin
|
|
256
|
+
/>
|
|
257
|
+
</template>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 批量更新单元格
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
const cells = {
|
|
264
|
+
0: {
|
|
265
|
+
0: {
|
|
266
|
+
v: 'Hello',
|
|
267
|
+
custom: {
|
|
268
|
+
cellType: 'indicator',
|
|
269
|
+
indicatorName: '测试指标',
|
|
270
|
+
businessDate: '2024-01-01',
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
await sheetRef.value.batchUpdateCells(cells, sheetId)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 📋 开发命令
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# 开发
|
|
285
|
+
npm run dev
|
|
286
|
+
|
|
287
|
+
# 构建
|
|
288
|
+
npm run build
|
|
289
|
+
|
|
290
|
+
# 类型检查
|
|
291
|
+
npm run type-check
|
|
292
|
+
|
|
293
|
+
# 测试
|
|
294
|
+
npm run test:unit
|
|
295
|
+
|
|
296
|
+
# 代码检查
|
|
297
|
+
npm run lint
|
|
298
|
+
|
|
299
|
+
# 代码格式化
|
|
300
|
+
npm run format
|
|
301
|
+
|
|
302
|
+
# 发布
|
|
303
|
+
npm publish
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## ⚠️ 注意事项
|
|
309
|
+
|
|
310
|
+
1. **Peer Dependencies**: 使用方需自行安装 [vue], [element-plus], [xlsx], [decimal.js], [dayjs]
|
|
311
|
+
2. **样式引入**: 需要单独引入 `import 'tor-univer-sheet/dist/style.css'`
|
|
312
|
+
3. **许可证**: Univer Advanced 功能需要有效的 license
|
|
313
|
+
4. **Node 版本**: 要求 Node.js `^20.19.0 || >=22.12.0`
|
|
314
|
+
5. **外部组件注册**: 使用 [IndicatorPointSelect] 等组件前需通过 [registerExternalComponents] 注册
|
|
315
|
+
6. **2FA 认证**: 发布时需准备 2FA 验证码,建议保存备用代码
|
|
316
|
+
7. **版本管理**: 遵循语义化版本规范,发布前更新 [package.json] 版本号
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## 📝 版本记录
|
|
321
|
+
|
|
322
|
+
| 版本 | 日期 | 说明 |
|
|
323
|
+
| ------ | ---- | -------- |
|
|
324
|
+
| 1.0.04 | - | 初始发布 |
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 🔗 相关资源
|
|
329
|
+
|
|
330
|
+
- **npm**: https://www.npmjs.com/package/tor-univer-sheet
|
|
331
|
+
- **Univer 官方**: https://univer.ai/
|
|
332
|
+
- **Element Plus**: https://element-plus.org/
|
|
333
|
+
- **Vue 3**: https://vuejs.org/
|
|
334
|
+
- **NPM 文档**: https://docs.npmjs.com/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tor-univer-sheet",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"style": "./dist/style.css",
|
|
5
5
|
"description": "基于 Univer 的 Vue3 电子表格组件",
|
|
6
6
|
"author": "tortormore",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"dayjs": "^1.11.20",
|
|
38
38
|
"decimal.js": "^10.6.0",
|
|
39
|
-
"element-plus": "
|
|
39
|
+
"element-plus": ">=2.9.0",
|
|
40
40
|
"vue": "^3.5.0",
|
|
41
41
|
"xlsx": "^0.18.5"
|
|
42
42
|
},
|