@yosai/cli 0.2.1-test.8 → 0.2.1-test.9

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.
@@ -0,0 +1,356 @@
1
+ # 表格页数据字段全量枚举
2
+
3
+ > 按 Univer **`workbook.save()`** 快照(`IWorkbookData`)逐层列出字段与含义。
4
+ > 依据:`@univerjs/core` 类型(本仓库依赖 `^0.25.1`)+ 本包 Demo / 导入导出精简结构。
5
+ > 表格无内嵌服务端 HTTP;持久化由宿主自行完成。本文是工作簿 JSON 契约。
6
+ >
7
+ > **Agent 生成请用精简契约** [`agent/AGENT_SCHEMA.md`](./agent/AGENT_SCHEMA.md) + `yos-sheet validate`,勿把本文整份塞进 prompt。
8
+
9
+ ---
10
+
11
+ ## 0. 读写约定
12
+
13
+ | 方向 | API | 说明 |
14
+ | ---- | --- | ---- |
15
+ | 读取快照 | `getActiveWorkbook().save()` | 返回完整 `IWorkbookData`(含样式、合并、插件 `resources` 等) |
16
+ | 加载快照 | `createWorkbook(snapshot)` | 用同一结构创建 / 替换工作簿 |
17
+ | 导出 xlsx | `exportExcel` → `exportWorkbookToXlsx`(ExcelJS) | 值 / 公式 + 基础样式(背景色 / 字体 / 对齐)+ 合并;不含图表 |
18
+ | 导入 xlsx | `importExcel` → `importWorkbookFromXlsx`(ExcelJS) | 产出精简快照(值 / 公式 / 基础样式 / 合并),再 `createWorkbook` |
19
+
20
+ Demo 初始数据见 `SheetEditor` 内 `buildDemoWorkbook`;可粘贴整本骨架见 [`fixtures/sheet-workbook.template.json`](./fixtures/sheet-workbook.template.json)。
21
+
22
+ 布尔类字段在 Univer 里多用数字枚举 **`BooleanNumber`**:`0` = false,`1` = true。
23
+
24
+ ---
25
+
26
+ ## 1. 工作簿根(`IWorkbookData`)
27
+
28
+ ```json
29
+ {
30
+ "id": "sheet-demo",
31
+ "name": "表格 Demo",
32
+ "appVersion": "0.25.1",
33
+ "locale": "zhCN",
34
+ "styles": {},
35
+ "sheetOrder": ["sheet-1"],
36
+ "sheets": { "sheet-1": { /* IWorksheetData */ } },
37
+ "resources": []
38
+ }
39
+ ```
40
+
41
+ | 参数 | 类型 | 必有 | 含义 | 取值 / 说明 |
42
+ | ---- | ---- | ---- | ---- | ----------- |
43
+ | `id` | `string` | 是 | 工作簿 unit id | 全生命周期建议稳定不变 |
44
+ | `name` | `string` | 是 | 工作簿显示名 | |
45
+ | `appVersion` | `string` | 是* | 模型版本 | 通常为 Univer 版本,如 `"0.25.1"`;缺省时运行时会补 |
46
+ | `locale` | `string` | 是* | 语言 | 本包默认 `"zhCN"`(`LocaleType.ZH_CN`) |
47
+ | `styles` | `Record<string, IStyleData \| null>` | 是* | 样式表 | key 为样式 id,单元格 `s` 引用 |
48
+ | `sheetOrder` | `string[]` | 是 | sheet id 顺序 | 与底部页签顺序一致 |
49
+ | `sheets` | `Record<string, Partial<IWorksheetData>>` | 是 | sheet 字典 | key = sheet `id` |
50
+ | `defaultStyle` | `IStyleData \| string` | 否 | 工作簿默认样式 | 可为样式对象或样式 id |
51
+ | `resources` | `{ name, data, id? }[]` | 否 | 插件资源 | 筛选 / 条件格式 / 批注等插件状态;`data` 多为 JSON 字符串 |
52
+ | `rev` | `number` | 否 | 协同修订号 | 协作场景;本包未接协作 |
53
+ | `custom` | `object` | 否 | 宿主自定义字段 | 勿与 Univer 保留字段冲突 |
54
+
55
+ \* Demo / xlsx 导入的精简快照可省略 `appVersion` / `locale` / `styles`,`createWorkbook` 会补默认值;**生产持久化建议存 `save()` 全量结果**。
56
+
57
+ ---
58
+
59
+ ## 2. 工作表(`IWorksheetData`)
60
+
61
+ ```json
62
+ {
63
+ "id": "sheet-1",
64
+ "name": "Sheet1",
65
+ "tabColor": "",
66
+ "hidden": 0,
67
+ "rowCount": 100,
68
+ "columnCount": 20,
69
+ "defaultColumnWidth": 88,
70
+ "defaultRowHeight": 24,
71
+ "mergeData": [],
72
+ "cellData": {},
73
+ "rowData": {},
74
+ "columnData": {},
75
+ "rowHeader": { "width": 46 },
76
+ "columnHeader": { "height": 20 },
77
+ "showGridlines": 1,
78
+ "rightToLeft": 0,
79
+ "freeze": { "xSplit": 0, "ySplit": 0, "startRow": -1, "startColumn": -1 }
80
+ }
81
+ ```
82
+
83
+ | 参数 | 类型 | 含义 | 说明 |
84
+ | ---- | ---- | ---- | ---- |
85
+ | `id` | `string` | 工作表 id | 稳定 id;出现在 `sheetOrder` |
86
+ | `name` | `string` | 页签名 | Excel 限制约 31 字符 |
87
+ | `tabColor` | `string` | 页签颜色 | 空字符串表示默认 |
88
+ | `hidden` | `BooleanNumber` | 是否隐藏 | `0` / `1` |
89
+ | `rowCount` | `number` | 行数 | 本包上限 `10000`(`MAX_SHEET_ROW_COUNT`) |
90
+ | `columnCount` | `number` | 列数 | Demo 默认 `20` |
91
+ | `defaultColumnWidth` | `number` | 默认列宽(px) | |
92
+ | `defaultRowHeight` | `number` | 默认行高(px) | |
93
+ | `mergeData` | `IRange[]` | 合并单元格 | 见 §5 |
94
+ | `cellData` | 稀疏矩阵 | 单元格内容 | 见 §3;key 为行 / 列 **数字字符串或数字** |
95
+ | `rowData` | 稀疏数组对象 | 行属性 | 见 §6 |
96
+ | `columnData` | 稀疏数组对象 | 列属性 | 见 §6 |
97
+ | `rowHeader` | `{ width, hidden? }` | 行号栏 | |
98
+ | `columnHeader` | `{ height, hidden? }` | 列标栏 | |
99
+ | `showGridlines` | `BooleanNumber` | 显示网格线 | |
100
+ | `gridlinesColor` | `string` | 网格线颜色 | 可选 |
101
+ | `rightToLeft` | `BooleanNumber` | 从右到左 | |
102
+ | `freeze` | `IFreeze` | 冻结窗格 | 见 §5 |
103
+ | `defaultStyle` | `IStyleData \| string` | 表级默认样式 | 可选 |
104
+ | `zoomRatio` / `scrollTop` / `scrollLeft` | `number` | 视图状态 | 已 deprecated,可忽略 |
105
+ | `custom` | `object` | 宿主自定义 | 可选 |
106
+
107
+ `cellData` 形态(稀疏,只存有内容的格):
108
+
109
+ ```json
110
+ {
111
+ "0": {
112
+ "0": { "v": "列1" },
113
+ "1": { "v": 2, "t": 2 }
114
+ },
115
+ "1": {
116
+ "3": { "f": "=B2*C2", "v": 20, "t": 2 }
117
+ }
118
+ }
119
+ ```
120
+
121
+ 行 / 列下标均为 **0-based**。
122
+
123
+ ---
124
+
125
+ ## 3. 单元格(`ICellData`)
126
+
127
+ | 参数 | 类型 | 含义 | 说明 |
128
+ | ---- | ---- | ---- | ---- |
129
+ | `v` | `string \| number \| boolean \| null` | 显示 / 原始值 | 公式格常同时有计算结果 |
130
+ | `t` | `CellValueType` | 值类型 | `1` STRING / `2` NUMBER / `3` BOOLEAN / `4` FORCE_STRING |
131
+ | `f` | `string \| null` | 公式 | 含前导 `=`,如 `"=SUM(A1:B2)"` |
132
+ | `s` | `string \| IStyleData \| null` | 样式 | **推荐**写样式 id(指向根 `styles`);也可内联对象 |
133
+ | `si` | `string \| null` | 公式 id | 公式引擎内部关联 |
134
+ | `p` | `IDocumentData \| null` | 富文本文档 | 单元格内富文本;一般可忽略 |
135
+ | `ref` / `xf` | `string` | 数组公式 / Excel 前缀 | 内部字段,宿主通常不手写 |
136
+ | `custom` | `object` | 宿主自定义 | 可选 |
137
+
138
+ 本包 xlsx 导入导出认 **`v` / `f`(及可选 `t`)**,以及内联 / 引用的基础样式 **`s`**(背景色、字体、对齐)与表级 **`mergeData`**。
139
+
140
+ ---
141
+
142
+ ## 4. 样式(`IStyleData`)
143
+
144
+ 挂在工作簿根 `styles`,由单元格 `s` 引用:
145
+
146
+ ```json
147
+ {
148
+ "styles": {
149
+ "header": {
150
+ "bl": 1,
151
+ "ht": 2,
152
+ "bg": { "rgb": "#E8F3FF" },
153
+ "cl": { "rgb": "#1F2329" }
154
+ }
155
+ }
156
+ }
157
+ ```
158
+
159
+ 常用字段(缩写来自 Univer):
160
+
161
+ | 参数 | 含义 | 取值 |
162
+ | ---- | ---- | ---- |
163
+ | `ff` | 字体 | 字体名字符串 |
164
+ | `fs` | 字号(pt) | `number` |
165
+ | `it` | 斜体 | `BooleanNumber` |
166
+ | `bl` | 粗体 | `BooleanNumber` |
167
+ | `ul` / `st` / `ol` | 下划线 / 删除线 / 上划线 | `ITextDecoration`(`s` 是否显示等) |
168
+ | `bg` | 背景色 | `{ "rgb": "#RRGGBB" }` 或主题色 |
169
+ | `cl` | 前景色(文字) | 同 `bg` |
170
+ | `bd` | 边框 | `{ t, r, b, l }` → `{ s: BorderStyleTypes, cl }` |
171
+ | `ht` | 水平对齐 | `1` LEFT / `2` CENTER / `3` RIGHT / `4` JUSTIFIED … |
172
+ | `vt` | 垂直对齐 | `1` TOP / `2` MIDDLE / `3` BOTTOM |
173
+ | `tb` | 换行策略 | `1` OVERFLOW / `2` CLIP / `3` WRAP |
174
+ | `tr` | 文字旋转 | `{ a: 角度, v?: BooleanNumber }` |
175
+ | `pd` | 内边距 | `{ t, r, b, l }` |
176
+ | `n` | 数字格式 | `{ "pattern": "0.00" }` 等 |
177
+ | `va` | 上标 / 下标 | BaselineOffset |
178
+
179
+ `BorderStyleTypes` 常用:`0` NONE / `1` THIN / `8` MEDIUM / `7` DOUBLE 等。
180
+
181
+ ---
182
+
183
+ ## 5. 合并与冻结
184
+
185
+ ### 5.1 `mergeData`(`IRange[]`)
186
+
187
+ ```json
188
+ {
189
+ "startRow": 0,
190
+ "startColumn": 0,
191
+ "endRow": 0,
192
+ "endColumn": 3
193
+ }
194
+ ```
195
+
196
+ | 参数 | 含义 |
197
+ | ---- | ---- |
198
+ | `startRow` / `endRow` | 起止行(含) |
199
+ | `startColumn` / `endColumn` | 起止列(含) |
200
+ | `rangeType` | 可选;普通合并可省略 |
201
+
202
+ 上例表示合并 `A1:D1`。
203
+
204
+ ### 5.2 `freeze`(`IFreeze`)
205
+
206
+ | 参数 | 含义 |
207
+ | ---- | ---- |
208
+ | `xSplit` | 冻结列数 |
209
+ | `ySplit` | 冻结行数 |
210
+ | `startRow` | 可滚动区域起始行(常与冻结配合;无冻结可为 `-1`) |
211
+ | `startColumn` | 可滚动区域起始列 |
212
+
213
+ 示例:冻结首行 → `"freeze": { "xSplit": 0, "ySplit": 1, "startRow": 1, "startColumn": 0 }`。
214
+
215
+ ---
216
+
217
+ ## 6. 行 / 列属性
218
+
219
+ `rowData` / `columnData` 为稀疏对象,key 为行号 / 列号字符串。
220
+
221
+ **行(`IRowData`)**
222
+
223
+ | 参数 | 含义 |
224
+ | ---- | ---- |
225
+ | `h` | 行高(px) |
226
+ | `hd` | 是否隐藏 |
227
+ | `ia` | 是否自适应高度 |
228
+ | `ah` | 自动行高值 |
229
+ | `s` | 整行样式 id / 对象 |
230
+
231
+ **列(`IColumnData`)**
232
+
233
+ | 参数 | 含义 |
234
+ | ---- | ---- |
235
+ | `w` | 列宽(px) |
236
+ | `hd` | 是否隐藏 |
237
+ | `s` | 整列样式 |
238
+
239
+ ```json
240
+ {
241
+ "rowData": { "0": { "h": 28 } },
242
+ "columnData": { "0": { "w": 120 }, "3": { "w": 100 } }
243
+ }
244
+ ```
245
+
246
+ ---
247
+
248
+ ## 7. `resources`(插件状态)
249
+
250
+ 扩展能力(筛选、条件格式、数据验证、批注、超链接、绘图、表格对象、评论等)的运行时数据,多数写入根级 `resources`:
251
+
252
+ ```json
253
+ {
254
+ "resources": [
255
+ {
256
+ "name": "SHEET_CONDITIONAL_FORMATTING_PLUGIN",
257
+ "data": "{...插件序列化 JSON 字符串...}"
258
+ }
259
+ ]
260
+ }
261
+ ```
262
+
263
+ | 参数 | 含义 |
264
+ | ---- | ---- |
265
+ | `name` | 插件资源名(形如 `SHEET_*_PLUGIN`) |
266
+ | `data` | 序列化字符串(通常再 `JSON.parse`) |
267
+ | `id` | 可选 |
268
+
269
+ 宿主做全量持久化时:**原样保存 `save()` 返回的 `resources`**,不要手改。xlsx 导入导出会丢弃这些字段。`features` 关闭的扩展不会加载对应预设,已有 `resources` 项可能无法还原 UI。
270
+
271
+ ---
272
+
273
+ ## 8. 本包精简结构(导入导出)
274
+
275
+ 与全量 `IWorkbookData` 相比,包内 `UniverWorkbookLike` / xlsx 转换保证:
276
+
277
+ ```ts
278
+ {
279
+ id?: string;
280
+ name?: string;
281
+ sheetOrder?: string[];
282
+ styles?: Record<string, IStyleData | null>; // 导出时解析单元格 s 引用
283
+ sheets?: {
284
+ [id: string]: {
285
+ id?: string;
286
+ name?: string;
287
+ rowCount?: number;
288
+ columnCount?: number;
289
+ cellData?: Record<string, Record<string, { v?, f?, t?, s? }>>;
290
+ mergeData?: IRange[];
291
+ };
292
+ };
293
+ }
294
+ ```
295
+
296
+ | 能力 | 全量 `save()` | xlsx 导入导出(ExcelJS) |
297
+ | ---- | ------------- | ------------- |
298
+ | 值 / 公式 | ✅ | ✅ |
299
+ | 基础样式(背景 / 字体 / 对齐) / 合并 | ✅ | ✅ |
300
+ | 行列宽 / 边框 / 条件格式 / 图表 | ✅ | ❌ |
301
+ | 插件 `resources` | ✅ | ❌ |
302
+
303
+ 生产建议:云端存 **`workbook.save()` JSON**;xlsx 仅作交换格式。
304
+
305
+ ---
306
+
307
+ ## 9. 宿主持久化示意
308
+
309
+ ```ts
310
+ // 保存
311
+ const snapshot = workbook.save();
312
+ await api.putSheet(docId, snapshot);
313
+
314
+ // 打开
315
+ const snapshot = await api.getSheet(docId);
316
+ api.createWorkbook(snapshot);
317
+ ```
318
+
319
+ 本包 `SheetEditor` 支持:
320
+
321
+ | API | 说明 |
322
+ | ---- | --- |
323
+ | prop `workbook` | 初始快照;不传则 Demo 空表 |
324
+ | prop `readOnly` | 只读(拦截命令 + pointer-events) |
325
+ | `getSnapshot()` | `workbook.save()` 全量 JSON |
326
+ | `loadSnapshot(data)` | 替换当前工作簿;不触发 `change`,完成后已保存 |
327
+ | event `change` | 命令执行后防抖通知宿主(同时标脏) |
328
+ | event `save` | Cmd/Ctrl+S:请求宿主落库;成功后调用 `markSaved()` |
329
+ | `v-model:dirty` / `markSaved()` | 保存态;打开与 `loadSnapshot` 后默认已保存 |
330
+
331
+ xlsx 导入导出仍可用,生产云存请优先快照 JSON。行数上限:`MAX_SHEET_ROW_COUNT = 10000`。
332
+
333
+ 可粘贴整本骨架:[`fixtures/sheet-workbook.template.json`](./fixtures/sheet-workbook.template.json)(含双 sheet、公式、样式引用、合并、冻结、行列宽)。
334
+
335
+ ---
336
+
337
+ ## 10. 类型索引(速查)
338
+
339
+ | 层级 | 关键字段 | 章节 |
340
+ | ---- | -------- | ---- |
341
+ | 工作簿 | `id` `name` `appVersion` `locale` `styles` `sheetOrder` `sheets` `resources` | §1 |
342
+ | 工作表 | `cellData` `mergeData` `rowData` `columnData` `freeze` `rowCount` `columnCount` | §2 |
343
+ | 单元格 | `v` `t` `f` `s` | §3 |
344
+ | 样式 | `bl` `it` `bg` `cl` `bd` `ht` `vt` `tb` `n` … | §4 |
345
+ | 合并 / 冻结 | `mergeData[]` `freeze` | §5 |
346
+ | 行列 | `h` `w` `hd` `s` | §6 |
347
+ | 插件 | `resources[].name/data` | §7 |
348
+
349
+ ### 10.1 与运行时核对
350
+
351
+ | 项 | 结果 |
352
+ | --- | ---- |
353
+ | 根类型 | 对齐 `@univerjs/core` `IWorkbookData` / `IWorksheetData` / `ICellData` |
354
+ | Demo 初始 | `buildDemoWorkbook` 仅写 `id/name/sheetOrder/sheets.*.cellData` 等精简字段 |
355
+ | xlsx | `exportWorkbookToXlsx` / `importWorkbookFromXlsx`(ExcelJS)值 / 公式 / 基础样式 / 合并 |
356
+ | 不进快照契约的 | Univer UI 命令、容器 DOM、`features` 开关本身(开关影响能否还原 `resources`) |