ooxml-excel-editor 1.7.0 → 1.14.0
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/CHANGELOG.md +104 -0
- package/README.md +46 -10
- package/dist/chunks/index-Bjz3tYi5.js +14854 -0
- package/dist/chunks/{index.es-BVXJfTmn.js → index.es-B3mABd8F.js} +1 -1
- package/dist/chunks/{index.es-gb2_kTSZ.js → index.es-CcbrVJaV.js} +1 -1
- package/dist/chunks/{jspdf.es.min-CBWDsR7H.js → jspdf.es.min-BMcdd8Dx.js} +2 -2
- package/dist/chunks/{jspdf.es.min-C7JL2eZm.js → jspdf.es.min-CLpuypj-.js} +2 -2
- package/dist/chunks/plugin-CwzVfkkX.js +6 -0
- package/dist/chunks/plugin-overlay-BeNsEblo.js +13289 -0
- package/dist/chunks/{toolbar-icons-CD7G5Aof.js → toolbar-icons-DKbl4uz2.js} +50 -44
- package/dist/components/ExcelViewer.vue.d.ts +22 -0
- package/dist/components/FindBar.vue.d.ts +8 -0
- package/dist/core/edit/autofill.d.ts +10 -0
- package/dist/core/edit/commands.d.ts +9 -1
- package/dist/core/edit/data-validation.d.ts +15 -0
- package/dist/core/edit/edit-controller.d.ts +11 -1
- package/dist/core/edit/editor-context.d.ts +5 -2
- package/dist/core/edit/formula-autocomplete.d.ts +20 -0
- package/dist/core/edit/types.d.ts +6 -0
- package/dist/core/formula/builtin/eval.d.ts +7 -0
- package/dist/core/formula/builtin/functions.d.ts +7 -0
- package/dist/core/formula/builtin/index.d.ts +23 -0
- package/dist/core/formula/builtin/parse.d.ts +54 -0
- package/dist/core/formula/builtin/values.d.ts +35 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/model/mutations.d.ts +2 -0
- package/dist/core/model/types.d.ts +52 -2
- package/dist/core/plugin.d.ts +33 -1
- package/dist/core/render/canvas-renderer.d.ts +19 -0
- package/dist/core/viewer/comment-dialog-host.d.ts +16 -0
- package/dist/core/viewer/conditional-format-dialog-host.d.ts +30 -0
- package/dist/core/viewer/controller.d.ts +90 -2
- package/dist/core/viewer/number-format-dialog-host.d.ts +25 -0
- package/dist/core/viewer/validation-prompt-host.d.ts +25 -0
- package/dist/core.js +141 -74
- package/dist/index.js +974 -839
- package/dist/react/ExcelViewer.d.ts +21 -0
- package/dist/react.js +817 -654
- package/dist/style.css +1 -1
- package/dist/vue2.css +1 -1
- package/dist/vue2.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-BNQIWClg.js +0 -12532
- package/dist/chunks/plugin-overlay-C_qauTcv.js +0 -11057
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,110 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
+
## [1.14.0] - 2026-06-15
|
|
6
|
+
|
|
7
|
+
> 新增**内置公式引擎**(MIT,零依赖)设为 recalc 默认引擎(取代 GPL 的 HyperFormula),+ **公式自动补全**。覆盖日常 ~60 个常用函数;需更全覆盖可注入 HyperFormula 或自研引擎。
|
|
8
|
+
|
|
9
|
+
### 新增 — 内置 MIT 公式引擎(默认)
|
|
10
|
+
|
|
11
|
+
- **从零实现**(`formula/builtin/`):词法 + 表达式解析(运算符优先级 / `A1` 绝对相对 / 区域 `A1:B2` / 跨表 `Sheet1!A1` / 函数 / 一元 ± / `%`)→ AST;求值器(错误就近传播 `#DIV/0! #N/A #NAME? #NUM! #REF! #VALUE!`);**依赖图 + 拓扑级联重算 + 循环引用检测**(环上格 → `#REF!`)。
|
|
12
|
+
- **函数 ~60**:聚合(SUM/AVERAGE/MAX/MIN/COUNT/COUNTA/PRODUCT/SUMPRODUCT)、数学(ROUND/ROUNDUP/ROUNDDOWN/ABS/INT/MOD/SQRT/POWER/CEILING/FLOOR…)、逻辑(IF/IFERROR/IFNA/AND/OR/NOT/XOR/IFS)、文本(LEFT/RIGHT/MID/LEN/CONCAT/UPPER/LOWER/TRIM/SUBSTITUTE/FIND/SEARCH…)、查找(VLOOKUP/HLOOKUP/INDEX/MATCH/CHOOSE)、条件聚合(SUMIF/COUNTIF/AVERAGEIF)、信息(ISNUMBER/ISBLANK/ISERROR…)、日期(TODAY/NOW/DATE/YEAR/MONTH/DAY/WEEKDAY/DAYS)。
|
|
13
|
+
- **★ 默认引擎变更**:recalc(`:recalc`,opt-in)的默认引擎由 **HyperFormula → 内置引擎**。好处:**MIT 无 GPL 顾虑、零额外依赖、不再懒加载 ~400KB**。代价:函数集比 HyperFormula 的 ~395 小(日常足够)。
|
|
14
|
+
- **HyperFormula 仍可用**:注入 `:formula-engine="hyperFormulaEngineFactory"`(或自研)获得更全覆盖。`core` 新导出 `builtinFormulaEngineFactory` / `BuiltinFormulaEngine` / `FUNCTION_NAMES` / `hyperFormulaEngineFactory`;`defaultFormulaEngineFactory` 保留为 HyperFormula 别名(向后兼容显式注入它的旧代码)。
|
|
15
|
+
- **解析/显示不受影响**:打开文件仍显示原件缓存的计算结果(与引擎无关);引擎只在编辑后重算时介入。
|
|
16
|
+
### 新增 — 公式自动补全
|
|
17
|
+
|
|
18
|
+
- 在框架无关默认单元格编辑器(`edit/formula-autocomplete.ts`,三壳自动都有)里:输 `=SU` 时下方弹**函数名列表 + 参数提示**(`FUNCTION_SIGNATURES`);↑↓ 选、Enter/Tab 接受(插入 `NAME(` 并把光标移进括号)、Esc 关、点选即填。只在公式(`=` 开头)且光标处于函数名 token 时弹,不影响普通文本编辑。列表来源 = 引擎实际支持的函数(`FUNCTION_NAMES`),所见即所得。
|
|
19
|
+
- 测试:`formula/builtin/__tests__`(parse 12 + eval 11 + engine 7 = 30 例:运算符/函数/级联/循环/跨表);`e2e/formula-autocomplete.e2e.ts`(=SU→弹 SUM→点选插入,三壳);现有 `edit-formula.e2e.ts` 重算 e2e 改由内置引擎驱动仍全过。基线:**419 单测 + 192 e2e**。
|
|
20
|
+
|
|
21
|
+
## [1.13.0] - 2026-06-15
|
|
22
|
+
|
|
23
|
+
> 新增 **不连续多区域选择**(Ctrl/⌘ + 点击)。选区模型从单矩形扩成多矩形;纯框架无关 core 交互,壳只转发鼠标。
|
|
24
|
+
|
|
25
|
+
### 新增 — Ctrl 多区域选择
|
|
26
|
+
|
|
27
|
+
- **Ctrl/⌘ + 点击** 行头 / 列头 / 单元格 → 把当前选区收进多选集再起新区,**加选不相邻**区域(Shift 仍是连续区间,已有);普通点击 / 键盘导航 / `selectCell` / 全选回到单选。
|
|
28
|
+
- 选区模型加 `selRanges[]` + `getSelectionRanges()`(全部矩形,末个为活动区)/ `hasMultiSelection()`;`canvas-renderer` 加 `setExtraSelection` 画所有附加区(填充 + 边框;多选时不画自动填充柄,对齐 Excel)。
|
|
29
|
+
- **复制**:多选时各区按出现顺序**逐行堆叠**成块 → TSV + HTML 表写剪贴板(覆盖最常见的"Ctrl 点多个行头复制非相邻行",粘到 Excel/WPS / app 内都成堆叠块)。
|
|
30
|
+
- **状态栏统计**跨所有选区聚合(count/sum/avg/min/max);新增控制器 `getSelectionStats()`,三壳状态栏改用它。
|
|
31
|
+
- 三壳句柄 + 插件 `ViewerApi` 暴露 `getSelectionRanges` / `hasMultiSelection`。测试:`e2e/multi-select.e2e.ts`(Ctrl+点击两不邻行头 → 2 区域 + 回单选,Vue/React/Vue2)。基线:**389 单测 + 189 e2e**。
|
|
32
|
+
|
|
33
|
+
## [1.12.0] - 2026-06-15
|
|
34
|
+
|
|
35
|
+
> 新增 **格式刷**(Format Painter)。纯框架无关 core 交互(控制器采样 + onMouseUp 刷),壳只加工具栏按钮;需 `editable`。
|
|
36
|
+
|
|
37
|
+
### 新增 — 格式刷
|
|
38
|
+
|
|
39
|
+
- 工具栏 `format-painter` 入口:先选**源格**点按钮采样其完整样式(字体/填充/边框/对齐/换行/数字格式),再**点或拖**目标格/区域即刷上(单次撤销);`Esc` 或再点按钮退出,待刷时光标变 `copy`。
|
|
40
|
+
- 控制器 `startFormatPainter(sticky?)` / `isFormatPainterArmed()` / `cancelFormatPainter()`;刷动作在 `onMouseUp` 选区完成后应用(复用 setStyle)。三壳句柄 + 插件 `ViewerApi` 暴露;三 demo 工具栏加 `format-painter` 入口(工具栏按钮 active 态反映待刷)。
|
|
41
|
+
- 测试:`e2e/format-painter.e2e.ts`(采样红底 → 刷到目标格 + undo,Vue/React/Vue2 三壳)。
|
|
42
|
+
- 顺手:`toolbar` 溢出相关 e2e 宽屏断言 1280→1680(工具栏又加了按钮,宽屏才全部容纳)。基线:**389 单测 + 186 e2e**。
|
|
43
|
+
|
|
44
|
+
## [1.11.0] - 2026-06-15
|
|
45
|
+
|
|
46
|
+
> 三个编辑小件合并:**查找替换补全 + 数字格式编辑器 + 批注编辑**。都复用已有引擎/对话框套路;对话框均为框架无关 DOM(三壳共用一份,UI 天然 1:1)。
|
|
47
|
+
|
|
48
|
+
### 新增 — 查找替换
|
|
49
|
+
|
|
50
|
+
- 此前只有「查找」(高亮定位),现补「替换」:查找栏开 `editable` 时多出替换行(替换输入 + 替换 / 全部替换);控制器 `setFindReplace` / `replaceCurrent`(替换当前并查找下一个,替换后重算命中)/ `replaceAll`(全部替换,**整体单次撤销**)。支持区分大小写 / 全字匹配;跳过只读格。三壳查找栏都加替换行(Vue3 `FindBar.vue` + React/Vue2 内联)。
|
|
51
|
+
|
|
52
|
+
### 新增 — 数字格式编辑器
|
|
53
|
+
|
|
54
|
+
- 框架无关对话框 `viewer/number-format-dialog-host.ts`(工具栏 `number-format` 入口):分类(常规/数值/货币/百分比/日期/时间/文本/自定义)+ 选项(小数位数 / 千分位 / 负数红色 / 货币符号 / 日期时间预设)→ **实时预览**(复用 number-format 引擎)+ 可直接编辑「格式代码」→ 确定即 `setStyle({ numFmt })`(单次撤销)。控制器 `setSelectionNumberFormat(code)` / `openNumberFormatDialog()`。
|
|
55
|
+
|
|
56
|
+
### 新增 — 批注编辑
|
|
57
|
+
|
|
58
|
+
- 批注此前只读显示,现可**新建/编辑/删除**:新 `set-comment` 命令(逆 = restore-cells 精确还原,单次撤销)+ `model/mutations.ts` 的 `setCellComment`(空批注清除、空格挂批注/清空);右键菜单单格加「插入/编辑/删除批注」;框架无关对话框 `viewer/comment-dialog-host.ts`(多行文本 + 确定/删除/取消)。控制器 `getCellComment` / `setCellComment` / `openCommentEditor`。**导出回写**:`xlsx-writer` rebuild + overlay 都把批注写成 ExcelJS note(此前 rebuild 丢批注)。
|
|
59
|
+
|
|
60
|
+
- 三壳句柄 + 插件 `ViewerApi` 都暴露上述 API;三 demo 工具栏加 `number-format` 入口。测试:`find-replace` / `number-format` / `comment` e2e(各 Vue/React/Vue2)+ `autofill`/`comment` 等单测。基线:**389 单测 + 183 e2e**。
|
|
61
|
+
|
|
62
|
+
## [1.10.0] - 2026-06-15
|
|
63
|
+
|
|
64
|
+
> 新增 **自动填充柄**(Excel/WPS 拖拽填充)。纯框架无关 core canvas 交互(渲染层画柄 + 控制器拖拽),三壳零改动自动获得;需 `editable`。
|
|
65
|
+
|
|
66
|
+
### 新增 — 自动填充柄(拖拽填充序列)
|
|
67
|
+
|
|
68
|
+
- **序列引擎**(`edit/autofill.ts`,纯函数可单测):接续源值产出新值 —— 全数值(1 个复制 / ≥2 个等差外推)、全日期(每格 +1 天 / 按相邻差)、"前缀+末尾整数"文本(`Item 1`→`Item 2`,保留前导零位宽)、星期/月份名(中英常见写法循环接续)、其它循环复制。
|
|
69
|
+
- **渲染层**(`canvas-renderer`):选区右下角画**填充柄**小方块(`editable` 才画,随 editable 实时显隐)+ `fillHandleAt` 命中检测 + 拖拽时画目标范围**虚线预览**。
|
|
70
|
+
- **控制器**:`onMouseDown` 命中填充柄 → `fill` 拖拽模式;`onMouseMove` 按鼠标位置算目标范围(主轴 = 偏移更大的方向,支持上/下/左/右)+ 设预览;`onMouseUp` 按源选区逐列/行接续序列,**整体单次撤销**(`set-cells` 命令),填充后选区扩到整片。填充柄上悬停显示十字光标。跳过只读格。
|
|
71
|
+
- **Ctrl/⌘ 修饰键翻转"复制 ↔ 序列"**(对齐 Excel):普通拖 单个数字→复制、≥2 数字→等差;按住 Ctrl 拖 单个数字→递增(+1)、序列→复制;日期/星期月份/文本递增普通→序列、Ctrl→复制。
|
|
72
|
+
- 注:v1 填充**值**(不复制源格式);列/行各自独立成序列。
|
|
73
|
+
- 测试:`edit/__tests__/autofill.test.ts`(13 例:复制/等差/日期/文本递增/星期/月份/循环 + Ctrl 翻转)+ `e2e/autofill.e2e.ts`(拖填充柄出等差序列 + undo + Ctrl 单数字递增,Vue/React/Vue2 三壳)。基线:**386 单测 + 171 e2e**。
|
|
74
|
+
|
|
75
|
+
## [1.9.0] - 2026-06-14
|
|
76
|
+
|
|
77
|
+
> 路线图「保真/编辑完整化」第二阶段:**条件格式从只读渲染 → 可编辑**。整个功能由 `conditionalFormat` prop 开启(三壳同名,默认 false = 关闭、与历史一致;三 demo 已开启)。支持全 6 类规则的新建/编辑/删除 + 导出回写,overlay 模式保留原件未编辑规则原样。
|
|
78
|
+
|
|
79
|
+
### 新增 — 条件格式可编辑(全类型)
|
|
80
|
+
|
|
81
|
+
- **模型 + 解析**:`ConditionalRule` 加 `id` / `origin`('parsed'|'user')/ `dirty` / `raw`(原始 ExcelJS rule,导出原样回写用)+ `top10`(rank/percent/bottom)/ `iconSet.reverse`。`parseConditional` 给每条规则派 id、存 raw、补全 top10/iconSet 字段。
|
|
82
|
+
- **命令栈**:新增 `set-conditional` 命令(整张 `conditional` 数组不可变替换,逆=换回前态)→ 新建/编辑/删除规则**整体单次撤销**。
|
|
83
|
+
- **编程 API**(控制器 + 插件 viewer + 三壳句柄):`getConditionalRules` / `addConditionalRule` / `updateConditionalRule` / `removeConditionalRule` / `setConditionalRules` / `openConditionalFormatDialog`。改完即 live 重渲。需 `conditionalFormat` + `editable`。
|
|
84
|
+
- **管理对话框**(框架无关 DOM `viewer/conditional-format-dialog-host.ts`,三壳共用一份 → UI 天然 1:1):列出当前表所有规则(可删/可编辑)+ 新建。6 类编辑器:突出显示单元格(cellIs:大于/小于/介于/等于… + 填充/字体色/加粗)、公式(expression)、色阶(colorScale 2/3 色)、数据条(dataBar 颜色 + 渐变)、图标集(iconSet 7 种 + 反向)、项目选取(top10 前/后 N + 百分比)。新建默认套到当前选区。
|
|
85
|
+
- **工具栏入口** `conditional-format`(三壳 + 三 demo,`conditionalFormat` 关时不渲染)。
|
|
86
|
+
- **导出回写**(rebuild + overlay 共用 `xlsx-writer` 的 `writeConditionalFormatting`):清空 ExcelJS 现有 CF 后按模型重建 —— **未编辑的 parsed 规则用 `raw` 原样回写**(含 cfvo 阈值,零退化);用户新建/编辑过的按模型 `buildExcelCfRule` 构造(全 6 类)。**1.9.0 起 rebuild 也回写条件格式**(此前 rebuild 丢弃);overlay 满足"原件规则原样留、只增改用户改的"。
|
|
87
|
+
- 测试:`edit/__tests__/conditional-format.test.ts`(解析保真 / 命令撤销 / rebuild + overlay 往返 5 例)+ `e2e/conditional-format.e2e.ts`(API 新增+撤销、对话框新建 cellIs,Vue + React + Vue 2 三壳)。基线:**373 单测 + 165 e2e**。
|
|
88
|
+
|
|
89
|
+
## [1.8.0] - 2026-06-14
|
|
90
|
+
|
|
91
|
+
> 路线图「保真/编辑完整化」第一阶段:① 把 1.7.0 起步的数据验证**做完整**(从"只能选值"到"编辑拦截非法输入 + 输入/出错提示");② 补上 **Vue 2 壳的 e2e 回归网**(此前 Vue 2 零 e2e,改 Vue 2 全靠手测,是 CLAUDE.md 点名的空洞)。
|
|
92
|
+
|
|
93
|
+
### 新增 — 数据验证完整化:编辑时拦截非法输入 + WPS 式提示
|
|
94
|
+
|
|
95
|
+
- **解析全类型规则**(`SheetModel.dataValidationRules`):list / 整数(whole)/ 小数(decimal)/ 日期(date)/ 时间(time)/ 文本长度(textLength)/ 自定义(custom),连同 operator(between/greaterThan/…)、约束操作数、`allowBlank`、出错信息(errorStyle/errorTitle/error)、输入提示(promptTitle/prompt)。1.7.0 的 `dataValidations`(下拉箭头区域)/`dataValidationLists`(选项)从这里派生,**零回归**。
|
|
96
|
+
- **编辑时拦截**(框架无关引擎 `edit/data-validation.ts`,纯函数可单测):内置编辑器提交 / 公式栏提交时校验。`errorStyle='stop'`(默认)→ **硬拒,不写入**,弹模态出错提示,**编辑器保持打开让用户改正**;`warning`/`information` → toast 软提示但放行;`custom` 公式与以 `=` 开头的公式不拦(结果未知);空值放行(允许清空)。
|
|
97
|
+
- **提示 UI**(框架无关 DOM,三壳共用 `viewer/validation-prompt-host.ts`):出错模态 / toast + 选中带"输入提示"的格时格旁弹黄色气泡(随选区/滚动跟手)。
|
|
98
|
+
- **顺手修一个编辑器 UX bug**:校验拒绝后,内置编辑器的"已提交"锁(`done`)曾被卡死 → 用户改正后回车无反应。现 `commit()` 返回成功与否,拒绝时解锁并记住被拒值(避免点弹窗按钮的 blur 二次触发叠弹),改内容即可再次提交;弹窗关闭后焦点还给编辑器。
|
|
99
|
+
- 测试:`edit/__tests__/data-validation.test.ts`(12 例:各类型/operator/空值/坏约束/软提示/自定义信息)+ `date-locale.test.ts` 加全类型规则解析;`data-validation.e2e.ts` 加"整数 1-100 校验:输入 999 → 弹拒、值不变、改 80 → 写入"(Vue + React + **Vue 2** 三壳)。
|
|
100
|
+
|
|
101
|
+
### 新增 — Vue 2 壳 e2e 回归网
|
|
102
|
+
|
|
103
|
+
- 此前 Vue 2 壳**完全没有 e2e**(只有 Vue 3 + React 双覆盖),改 Vue 2 只能手测 → 高风险点(patch 复用 controller 持有的 DOM 致 stale、Vue 2.6 函数 ref 被忽略)迟早回归。现补上:
|
|
104
|
+
- `playwright.config.ts` 加**第二个 dev server**(端口 5302,`npm run dev:vue2`,plugin-vue2 SFC 编译器隔离);`vue2-demo` DEV 下把命令式 API 挂 `window.__excelViewerVue2`(对齐 Vue3 `__excelViewer` / React `__excelViewerReact`)。
|
|
105
|
+
- `e2e/vue2-smoke.e2e.ts`:加载示例→canvas 渲染+模型有 sheet、编辑模式 editCell+undo、rectOf 几何、demo 顶栏按钮 1:1 —— 把"只有真 Vue 2 浏览器才暴露"的 DOM 复用/imperative DOM 回归钉死。
|
|
106
|
+
- `data-validation.e2e.ts` 加 Vue 2 行,数据验证下拉 + 整数拦截在 Vue 2 上同样覆盖。
|
|
107
|
+
- 基线更新:**368 单测 + 159 e2e**(Vue 3 / React / Vue 2 三壳)。
|
|
108
|
+
|
|
5
109
|
## [1.7.0] - 2026-06-12
|
|
6
110
|
|
|
7
111
|
### 新增 — 列表型数据验证:点下拉箭头选值(B4,审计后续专项)
|
package/README.md
CHANGED
|
@@ -41,14 +41,14 @@ const src = ref<File>() // 绑个 <input type="file" @change> 给它即可
|
|
|
41
41
|
- 🔢 **自写数字格式引擎**:千分位/货币/百分比/科学计数/分数、四段格式(正;负;零;文本)、`[Red]` 颜色、`[>=100]` 条件段、中文日期 `yyyy"年"`、`[h]:mm` 经过时间
|
|
42
42
|
- 🗓 **日期序列号**:含 Excel 1900 闰年 bug、1904 系统
|
|
43
43
|
- 🎨 **主题色 + tint**、indexed 调色板、合并单元格、边框(细/粗/虚/双线)、填充(纯色/图案/渐变)
|
|
44
|
-
- 🌈 **条件格式**:色阶 / 数据条 / 图标集 / cellIs / top10
|
|
45
|
-
- 🖼 **图片 + 图表**(DrawingML → ECharts 近似还原)、**形状/文本框**、**迷你图**(sparklines)
|
|
44
|
+
- 🌈 **条件格式**:色阶 / 数据条 / 图标集 / cellIs / top10 渲染;开 `conditionalFormat` 后可**新建/编辑/删除全 6 类规则**(工具栏入口 + API,导出回写 .xlsx)
|
|
45
|
+
- 🖼 **图片 + 图表**(DrawingML → ECharts 近似还原)、**形状/文本框**、**迷你图**(sparklines)、**批注**、**数据验证**(列表型点格内箭头弹选可撤销;整数/小数/日期/文本长度等在编辑模式**拦截非法输入** + WPS 式出错/输入提示)、**自动筛选**样式
|
|
46
46
|
- 📌 **WPS 单元格内嵌图(DISPIMG)**:识别并展示 WPS 私有的"嵌在格里的图"(普通工具会缺图);编辑模式下支持**一键浮动 ⇄ 嵌入互转**。见 [WPS 单元格内嵌图](#wps-单元格内嵌图dispimg)
|
|
47
47
|
- 🔍 **图片点击放大 + 下载原图**:网格里的图(内嵌图/浮动图)点开看大图、下载原件。只读模式单击图放大、编辑模式右键「查看大图」。`imageLightbox` prop 控制(默认开),`openImageLightbox(src)` 命令式打开。
|
|
48
48
|
- 📋 **从 Excel/WPS 富粘贴**:`Ctrl+V` 解析剪贴板 HTML → 还原字体/颜色/填充/边框/对齐/合并单元格,整块单次撤销。**Excel/WPS 把格式放在 `<style>` 块的 CSS 类里(`<td class="xl65">`),解析时会把类规则合并进每格** —— 不只读内联 `style=`。**`Ctrl+V` 走 `paste` 事件拿原始 HTML**;`navigator.clipboard.read()`(右键菜单粘贴用)会**净化**删掉 `<style>`/注释,所以右键粘贴从 WPS 拿的格式不如 `Ctrl+V` 全。图片走多通道:data-uri `<img>` / **WPS VML `o:gfxdata`**(区域复制的内嵌图藏在 VML 里,是个 zip,解出来落格)/ 单图 blob / 拖文件;**数字格式**(日期/货币)也从 `mso-number-format` 解析还原,不再变成裸序列号。**注**:Excel 某些版本只给 `file:///` 本地路径的 `<img>`(浏览器读不到)而不带 `o:gfxdata`,那种区域图仍救不回。
|
|
49
49
|
- 📋 **应用内 1:1 复制粘贴**:本组件自己 `Ctrl+C` 的内容会把**完整模型快照**嵌进剪贴板(`<table data-ooxml-clip>`),`Ctrl+V` 时识别并 1:1 还原 —— 数字不会退化成文本、边框/数字格式/合并/DISPIMG 图片/**行高**全保留;因为快照随剪贴板走,**Vue3/Vue2/React 三壳之间、跨标签页互相复制结果都一致**。粘到外部应用(Excel/WPS/Word)则读可见 `<table>`(近似)。**列宽以目标现有表头为准、不被源覆盖**(列宽整列共享,改了会动表头;同 Excel 默认粘贴)。
|
|
50
50
|
- 📝 **文本溢出**到相邻空格、**自动行高**
|
|
51
|
-
- 🖱 **交互**:单元格选区(合并感知)、拖选、公式栏、状态栏(计数/求和/均值/最值)、超链接可点、裁切文本悬停看全文、Ctrl+C 复制(**同应用内 1:1 保真**:含数字原始值/数字格式/边框/合并/图片/行高,跨 Vue3/Vue2/React 实例互相复制都一致;**列宽以目标表头为准不覆盖**;另带 TSV/HTML 供贴进 Excel/WPS)、**Ctrl+F
|
|
51
|
+
- 🖱 **交互**:单元格选区(合并感知)、拖选、公式栏、状态栏(计数/求和/均值/最值)、超链接可点、裁切文本悬停看全文、Ctrl+C 复制(**同应用内 1:1 保真**:含数字原始值/数字格式/边框/合并/图片/行高,跨 Vue3/Vue2/React 实例互相复制都一致;**列宽以目标表头为准不覆盖**;另带 TSV/HTML 供贴进 Excel/WPS)、**Ctrl+F 查找替换**(高亮 + 上/下定位 + 计数 + 区分大小写/全字匹配;编辑模式带替换 / 全部替换)、**自动筛选**(点下拉真能筛:去重值多选 + 搜值 + 清除)、**自动填充柄**(编辑模式拖选区右下角填序列:等差/日期/星期月份/文本递增,见 [编辑](#编辑可选默认只读))、**不连续多选**(Ctrl/⌘ 点击行头/列头/格 加选不相邻区域,复制堆叠 + 状态栏跨区统计)
|
|
52
52
|
- 🖨 **导出 / 打印**:整表/选区/多表导出 **PNG/JPEG**、**PDF**(位图 + **矢量·文字可选可搜**两种)、**系统打印**(可另存 PDF);默认还原原生 `pageSetup`(纸张/方向/页边距/缩放/打印区域/**打印标题行列每页重复**);宽表**横向跨页**(页矩阵);`beforeRenderPage` 注入页眉/页脚/水印、`configureDoc` 注册字体;内置「导出设置」对话框
|
|
53
53
|
- ⚡ **按需加载**(无图表文件不下载 echarts、不导出 PDF 不下载 jspdf)、**友好错误兜底**(损坏/加密/旧 .xls)、解析失败自动给出可读提示
|
|
54
54
|
|
|
@@ -94,7 +94,7 @@ npm i hyperformula
|
|
|
94
94
|
|
|
95
95
|
> **三壳 UI 1:1**: Vue 3 SFC 是参考实现 (Standard), Vue 2 / React 1:1 复刻视觉与交互 (工具栏 SVG 图标 / 下拉子菜单 / 公式栏 / 状态栏 / dialog / 浮层 / 演示 demo 全部对齐). 详见 [docs/Vue2.md](./docs/Vue2.md) 跟 Vue 3 的差异速查 + [CLAUDE.md](./CLAUDE.md) 第 7 中心原则。
|
|
96
96
|
|
|
97
|
-
>
|
|
97
|
+
> 公式重算的引擎(1.14.0 起):默认是**内置 MIT 引擎**(零依赖,覆盖 ~60 常用函数,无许可证负担)。需要更全函数集时,`formulaEngine` prop 注入 **HyperFormula**(`hyperFormulaEngineFactory`,GPL-3.0/商业双授权,~395 函数)或自研引擎(实现 `FormulaEngine` 接口)。
|
|
98
98
|
|
|
99
99
|
## 使用
|
|
100
100
|
|
|
@@ -294,6 +294,7 @@ viewer.value.getRangeData(viewer.value.getSelection()) // 取"我选中的"区
|
|
|
294
294
|
| `fileName` | `string` | 标题栏显示的文件名(可选) |
|
|
295
295
|
| `editable` | `boolean` | 开启编辑(默认 `false` = 只读,行为与历史一致) |
|
|
296
296
|
| `pivotTable` | `boolean` | 透视表功能开关(默认 `false` = 关闭)。开启后(还需 `editable`):工具栏 `pivot-table` 入口可见、`createPivotTable`/`openPivotTableDialog` 等 API 生效、导出 .xlsx 回注真实 OOXML 透视表零件(overlay 模式同时保留原文件透视表) |
|
|
297
|
+
| `conditionalFormat` | `boolean` | 条件格式编辑开关(默认 `false` = 关闭、只读渲染)。开启后(还需 `editable`):工具栏 `conditional-format` 入口可见、`openConditionalFormatDialog`/`addConditionalRule`/`updateConditionalRule`/`removeConditionalRule`/`setConditionalRules`/`getConditionalRules` API 生效、导出 .xlsx 回写条件格式(overlay 保留原件未编辑规则原样,只增改用户改的)。支持全 6 类规则(cellIs / 公式 / 色阶 / 数据条 / 图标集 / top10)新建·编辑·删除,整体单次撤销 |
|
|
297
298
|
| `cellReadOnly` | `(cell, pos) => boolean` | 按格只读判定(编辑时) |
|
|
298
299
|
| `readOnlyRanges` | `MergeRange[]` | 只读区域(命中即只读,黑名单) |
|
|
299
300
|
| `editableTargets` | `EditableTarget \| EditableTarget[]` | **可编辑白名单**(2026-06-08)— 设了就是白名单语义:默认只读,**只**命中**任一** target 的格可编辑。4 种 target 形状自动识别:`{row,col}` 单格 / `{row}` 整行 / `{col}` 整列 / `MergeRange` 矩形。单值或数组都行,允许**不相邻**多 target。`undefined` (不传) = 不启用白名单 = 老行为(默认全可编辑);`[]` (显式空) = 全只读。与 `readOnlyRanges` / `cellReadOnly` 叠加 — 白名单命中后仍可被二次"黑"掉。运行时改:命令式 `viewer.setEditableTargets(targets)` |
|
|
@@ -301,7 +302,7 @@ viewer.value.getRangeData(viewer.value.getSelection()) // 取"我选中的"区
|
|
|
301
302
|
| `readOnlyCellStyle` | `boolean \| CellStyleOverride \| CellStyleFn` | **只读视觉钩子**(Phase C, 2026-06-08)— 默认 `false` 无视觉差异(老行为);`true` 套内置浅灰底 `#f5f7fa`;对象 = 固定样式给所有只读格;函数 = 按格自定义。仅在该格 `editable=false` 时套用,跟 `editableTargets` 配合一眼看出哪些格可编辑。**鼠标光标**: 编辑模式下悬停只读格自动变 `not-allowed`(内置,不可关)。 |
|
|
302
303
|
| `editor` | `EditorResolver` | 自定义单元格编辑器工厂(返回任意 DOM) |
|
|
303
304
|
| `recalc` | `boolean` | 公式重算(默认 `false`;需 `editable`) |
|
|
304
|
-
| `formulaEngine` | `FormulaEngineFactory` | 自定义/自研公式引擎(默认
|
|
305
|
+
| `formulaEngine` | `FormulaEngineFactory` | 自定义/自研公式引擎(默认 = 内置 MIT 引擎;可注入 `hyperFormulaEngineFactory` 或自研) |
|
|
305
306
|
| `pasteBehavior` | `Partial<PasteBehavior>` | 粘贴行为(默认 = 覆盖式 1:1)。逐项可配:`cellStyle`/`fill`(`overwrite`/`merge`/`skip`)·`rowHeight`(`source`/`keep`)·`colWidth`(`firstRowOnly`/`source`/`keep`)·`sourceMerges`(`apply`/`skip`)·`targetMerges`(`clear`/`keep`,默认清=修旧合并吞列)·`images`(`apply`/`skip`)。缺项回落默认。也可运行时 `viewer.setPasteBehavior(cfg)` / 右键「选择性粘贴」/ 工具栏「⚙ 粘贴配置」面板 |
|
|
306
307
|
| `readOnlyPrompt` | `'dialog' \| 'toast' \| 'none'` | 粘贴撞只读格的内置提醒(默认 `'dialog'`):`dialog` 弹窗**列出具体哪些格**只读 / `toast` 顶部气泡 / `none` 只发 `permission-denied` 事件。逐格精确(编辑模式下也可能有只读格) |
|
|
307
308
|
| `cellImageFit` | `'fill' \| 'contain' \| 'cover'` | WPS 单元格内嵌图贴合方式(默认 `contain` 等比,与 WPS 渲染一致) |
|
|
@@ -406,9 +407,43 @@ const myEditor: EditorResolver = (cell, pos) => {
|
|
|
406
407
|
- 全部入撤销栈、发 `cell-change`/`image-change`、翻脏标记。(`convertImageToCell(imgIdx,row,col)` 仍保留,用于显式指定目标格。)
|
|
407
408
|
- **导出往返**:`downloadXlsx()` / `exportXlsx()` 导出时,在 ExcelJS 写出后**于 zip 层回注** WPS 私有件(`cellimages.xml` + rels + media + `[Content_Types].xml`/`workbook.xml.rels` 补丁,从模型重建),原有的 + App 内新转的内嵌图导出后用 WPS 打开都正常显示。rebuild / overlay 两种保真模式均覆盖;无字节的 blob-only 图除外。
|
|
408
409
|
|
|
410
|
+
### 不连续多区域选择(1.13.0)
|
|
411
|
+
|
|
412
|
+
**Ctrl/⌘ + 点击** 行头 / 列头 / 单元格 → 加选不相邻区域(Shift 仍是连续区间);普通点击 / 键盘导航回单选。多选时复制把各区**逐行堆叠**成块(TSV + HTML,粘到 Excel/WPS/app 内都成堆叠块),状态栏统计跨所有区聚合。`getSelectionRanges()` / `hasMultiSelection()` 读多选状态。纯框架无关 core 交互,三壳一致。
|
|
413
|
+
|
|
414
|
+
### 格式刷(1.12.0)
|
|
415
|
+
|
|
416
|
+
工具栏 `format-painter` 入口:先选**源格**点按钮采样其完整样式(字体/填充/边框/对齐/换行/数字格式),再**点或拖**目标格/区域即把格式刷上(单次撤销);`Esc` 或再点按钮退出,待刷时光标变 `copy`。也可 `startFormatPainter()` / `isFormatPainterArmed()` / `cancelFormatPainter()` 直调。纯框架无关 core 交互,三壳一致。
|
|
417
|
+
|
|
418
|
+
### 数字格式 / 批注 / 查找替换(1.11.0)
|
|
419
|
+
|
|
420
|
+
- **查找替换**:`Ctrl+F` 打开查找栏,编辑模式下多出替换行 —— 替换输入 + 「替换」(替换当前并跳下一个)/「全部替换」(整体单次撤销),支持区分大小写 / 全字匹配,跳过只读格。
|
|
421
|
+
- **数字格式编辑器**:工具栏 `number-format` 入口打开对话框(框架无关 DOM,三壳共用)—— 分类(常规/数值/货币/百分比/日期/时间/文本/自定义)+ 选项(小数位数 / 千分位 / 负数红色 / 货币符号 / 日期时间预设)+ 实时预览 + 可直接编辑格式代码 → 确定即套到选区(单次撤销)。也可 `setSelectionNumberFormat(code)` / `openNumberFormatDialog()` 直调。
|
|
422
|
+
- **批注编辑**:右键单格「插入/编辑/删除批注」打开对话框(多行文本 + 确定/删除/取消);`getCellComment` / `setCellComment(row,col,text)`(空串删除)/ `openCommentEditor()` 直调,单次撤销;**导出 .xlsx 回写批注**(rebuild + overlay)。
|
|
423
|
+
|
|
424
|
+
### 自动填充柄(拖拽填充序列)
|
|
425
|
+
|
|
426
|
+
开 `:editable` 后,选区右下角出现**填充柄**小方块(像 Excel/WPS)。拖它向下/上/左/右,松手即把源选区的模式**接续填充**进新增格(整体单次撤销):
|
|
427
|
+
|
|
428
|
+
- **全数值**:1 个 → 复制;≥2 个 → 等差外推(`1,2` → `3,4,5`;`2,4` → `6,8,10`,支持递减)
|
|
429
|
+
- **全日期**:1 个 → 每格 +1 天;≥2 个 → 按相邻差外推
|
|
430
|
+
- **"前缀+末尾整数"文本**:`Item 1` → `Item 2,Item 3`;`第1周` → `第2周`;`A01` → `A02`(保留前导零位宽)
|
|
431
|
+
- **星期 / 月份名**(中英常见写法):`周五` → `周六,周日,周一`;`Nov` → `Dec,Jan`(循环接续)
|
|
432
|
+
- **其它**:循环复制源值
|
|
433
|
+
|
|
434
|
+
**按住 Ctrl/⌘ 拖**翻转"复制 ↔ 序列"(对齐 Excel):单个数字普通拖=复制、Ctrl 拖=递增(`5`→`6,7,8`);两个数字序列普通拖=等差、Ctrl 拖=复制;日期/星期月份/文本递增普通=序列、Ctrl=复制。
|
|
435
|
+
|
|
436
|
+
主轴按鼠标偏移更大的方向决定(上下 vs 左右);列 / 行各自独立成序列;跳过只读格。注:v1 填充**值**,不复制源单元格的格式。纯框架无关 core canvas 交互,三壳一致。
|
|
437
|
+
|
|
409
438
|
### 公式重算(可换引擎)
|
|
410
439
|
|
|
411
|
-
开 `:recalc` 后,编辑公式格或被公式引用的格 → 依赖格**自动级联重算**,每个变动都发 `cell-change`(`source: 'api'|'ui'|'undo'|'redo'`)
|
|
440
|
+
开 `:recalc` 后,编辑公式格或被公式引用的格 → 依赖格**自动级联重算**,每个变动都发 `cell-change`(`source: 'api'|'ui'|'undo'|'redo'`)。
|
|
441
|
+
|
|
442
|
+
**默认引擎(1.14.0 起)= 内置 MIT 引擎**:从零实现的解析 + 求值 + 依赖图 + 拓扑级联 + 循环检测,**零依赖、无 GPL**,覆盖日常 ~60 个常用函数(SUM/AVERAGE/IF/IFERROR/VLOOKUP/INDEX/MATCH/SUMIF/COUNTIF/ROUND/LEFT/MID/CONCAT/DATE/TODAY… 见 `FUNCTION_NAMES` 导出)。函数集比 HyperFormula 小,但日常足够。
|
|
443
|
+
|
|
444
|
+
需要更全覆盖:`:formula-engine="hyperFormulaEngineFactory"` 注入 **HyperFormula**(可选 peer `npm i hyperformula`,GPL-3.0/商业双授权,~395 函数),或注入自研引擎(实现 `FormulaEngine` 接口)。`isRecalcReady()` 查引擎是否就绪。**打开文件的显示值与引擎无关**(读原件缓存结果),引擎只在编辑后重算时介入。
|
|
445
|
+
|
|
446
|
+
**公式自动补全**(1.14.0):在单元格里输 `=SU` 时下方弹**函数名列表 + 参数提示**;↑↓ 选、Enter/Tab 接受(插入 `SUM(` 并把光标移进括号)、Esc 关、点选即填。列表 = 引擎实际支持的函数(所见即所得),框架无关默认编辑器内置,三壳一致。
|
|
412
447
|
|
|
413
448
|
### 事件 = 前后完整快照
|
|
414
449
|
|
|
@@ -450,7 +485,7 @@ const myEditor: EditorResolver = (cell, pos) => {
|
|
|
450
485
|
| `rendered` / `error` / `progress` | 见上 |
|
|
451
486
|
|
|
452
487
|
### 命令式 API(模板 ref)
|
|
453
|
-
`load(src)` / `getWorkbook()` / `getActiveSheet()` / `setActiveSheet(i)` / `getSelection()` / `setSelection(range)` / `scrollToCell(row,col,{select?})` / `rectOf(row,col)` / `rectOfRange(range)` / `redraw()`,以及下面的导出方法;**编辑命令式 API**(`editCell`/`setStyle`/`createPivotTable`/`openPivotTableDialog`/`createPivotTableFromSelection`/`insertRows`/`undo`/`exportXlsx`…)见 [编辑](#编辑可选默认只读)。
|
|
488
|
+
`load(src)` / `getWorkbook()` / `getActiveSheet()` / `setActiveSheet(i)` / `getSelection()` / `setSelection(range)` / `scrollToCell(row,col,{select?})` / `rectOf(row,col)` / `rectOfRange(range)` / `redraw()`,以及下面的导出方法;**编辑命令式 API**(`editCell`/`setStyle`/`createPivotTable`/`openPivotTableDialog`/`createPivotTableFromSelection`/`getConditionalRules`/`addConditionalRule`/`openConditionalFormatDialog`/`setSelectionNumberFormat`/`openNumberFormatDialog`/`getCellComment`/`setCellComment`/`openCommentEditor`/`replaceCurrent`/`replaceAll`/`insertRows`/`undo`/`exportXlsx`…)见 [编辑](#编辑可选默认只读)。
|
|
454
489
|
|
|
455
490
|
```ts
|
|
456
491
|
// 需组件开启 :pivot-table="true"(默认关闭)+ :editable="true"
|
|
@@ -484,7 +519,7 @@ viewer.value?.createPivotTable({
|
|
|
484
519
|
|
|
485
520
|
**.xlsx 两种保真模式**:
|
|
486
521
|
|
|
487
|
-
- **`rebuild`(默认)** —— **从编辑后模型完整重建**:遍历 cells/公式/样式(字体/填充/边框/对齐/数字格式)
|
|
522
|
+
- **`rebuild`(默认)** —— **从编辑后模型完整重建**:遍历 cells/公式/样式(字体/填充/边框/对齐/数字格式)/合并/行高列宽/冻结/图片/**条件格式**(1.9.0 起)/**批注**(1.11.0 起) 重组成 ExcelJS 工作簿。干净、所见即所得,但**丢失**原件里我们不建模的部分(数据验证、VBA 宏、工作表保护、复杂 DrawingML/图表 等)。图片导出区分 oneCell/twoCell 锚点 + 子格 EMU 偏移。
|
|
488
523
|
- **`overlay`(`exportXlsx({ fidelity: 'overlay' })`)** —— **重载原始 .xlsx,只把编辑后的 值/样式/合并/行高列宽/冻结 叠加上去**,**保留** ExcelJS 能往返的其余部分(条件格式 / 数据验证 / 打印设置 / 定义名 / 图表 等)。组件加载时自动留存原件字节供其使用;缺原件时自动回退 `rebuild`。注:overlay 不反映**增删行列 / 图片**编辑(那类用 `rebuild`)。
|
|
489
524
|
|
|
490
525
|
公共选项:`target`(`'active'`(默认)/`'all'`/索引/索引数组)、`range`(限定单元格区域)、`scale`(清晰度,默认 2)、`includeHeaders`、`gridlines`、`background`;PDF/打印另有 `format`(a4/a3/letter/`[宽,高]mm`)、`orientation`、`margin`(mm)、`fitToWidth`。
|
|
@@ -611,7 +646,7 @@ viewer.closeContextMenu()
|
|
|
611
646
|
<ExcelViewer :toolbar="['find','filter','separator','zoom','export']" /> <!-- 控制项/顺序/分隔 -->
|
|
612
647
|
<ExcelViewer :toolbar="false" /> <!-- 隐藏整条 -->
|
|
613
648
|
```
|
|
614
|
-
- **内置 id**:`find`(查找)、`filter`(切换自动筛选 —— 文件没设也能点出下拉)、`sort`(按活动单元格所在列升序/降序;未开启自动筛选时会先按选区/已用区建立范围)、`clear-filter`(清除筛选,无筛选时禁用)、`copy`(复制选区)、`pivot-table`(透视表入口:选中带表头数据区后选择生成位置,可输出到现有工作表单元格或新建工作表;创建后打开 WPS 风格右侧字段面板,需 `pivotTable` + `editable`,功能未开启时不渲染)、`wrap-text`(自动换行 toggle,WPS 风格,需 `editable`)、`image-tools`(图片工具 ▾:选区/整表/整列 浮动 ⇄ 嵌入互转,需 `editable`)、`template`(模板 ▾:仅 JSON / 模型数据源下生效;导入 .xlsx 当样式捐赠者;xlsx 数据源下禁用)、`freeze`(冻结/取消)、`zoom`(缩放下拉)、`export`(导出/打印下拉)、`'separator'`/`'|'`(分隔线)。
|
|
649
|
+
- **内置 id**:`find`(查找)、`filter`(切换自动筛选 —— 文件没设也能点出下拉)、`sort`(按活动单元格所在列升序/降序;未开启自动筛选时会先按选区/已用区建立范围)、`clear-filter`(清除筛选,无筛选时禁用)、`copy`(复制选区)、`pivot-table`(透视表入口:选中带表头数据区后选择生成位置,可输出到现有工作表单元格或新建工作表;创建后打开 WPS 风格右侧字段面板,需 `pivotTable` + `editable`,功能未开启时不渲染)、`conditional-format`(条件格式管理入口:列出当前表规则可删/可编辑 + 新建全 6 类规则,需 `conditionalFormat` + `editable`,功能未开启时不渲染)、`number-format`(数字格式编辑入口:分类 + 预览 + 自定义格式代码,需 `editable`)、`format-painter`(格式刷:采样源格样式刷到目标,需 `editable`)、`wrap-text`(自动换行 toggle,WPS 风格,需 `editable`)、`image-tools`(图片工具 ▾:选区/整表/整列 浮动 ⇄ 嵌入互转,需 `editable`)、`template`(模板 ▾:仅 JSON / 模型数据源下生效;导入 .xlsx 当样式捐赠者;xlsx 数据源下禁用)、`freeze`(冻结/取消)、`zoom`(缩放下拉)、`export`(导出/打印下拉)、`'separator'`/`'|'`(分隔线)。
|
|
615
650
|
- **富项类型**(`ToolbarItem`):`type:'separator'` 分隔线;`items: ToolbarItem[]` 变下拉子菜单;`disabled?(viewer)` 禁用态;`iconSvg`(内联 SVG,优先于 `icon` emoji)/ `icon` / `label` / `title` / `onClick(viewer)` / `active?(viewer)`。
|
|
616
651
|
- **响应式溢出**:宽度不足时,放不下的项自动折叠进「⋯ 更多」下拉。
|
|
617
652
|
- **插件贡献**:`ExcelPlugin.toolbar: ToolbarItem[]`,插件加载即追加(opt-in)。
|
|
@@ -673,6 +708,7 @@ const highlightNegatives = definePlugin({
|
|
|
673
708
|
- **编辑**已支持(默认只读;开 `editable`,见 [编辑](#编辑可选默认只读))。下列为暂不覆盖项:
|
|
674
709
|
- 增删行列**不自动重写公式引用**;写回 .xlsx 丢 VBA/工作表保护/复杂 DrawingML
|
|
675
710
|
- 透视表:已有透视表**数据按普通单元格显示**并显示只读字段按钮;`pivot-table` 入口可从当前选区选择生成位置,生成静态透视汇总表到当前表指定单元格或新建工作表,随后打开 WPS 风格右侧“数据透视表”字段面板。创建出的透视表**空白起步**(对齐 WPS/Excel:不自动猜字段),在右侧面板里选字段填充。面板支持搜索字段;**勾选字段列表的复选框** = 加入透视表(数值字段→值,其它→行),取消 = 移出;也可用 筛/列/行/Σ 按钮或拖拽把字段加入“筛选器 / 列 / 行 / 值”四区,并可拖到移除区删除字段。改动后即时重建结果:筛选器支持“全部 / 非空 / 多选(勾选要保留的具体值,WPS 风格)”,列区生成横向分组,行区生成纵向分组,值区可放多个字段且可切换“求和 / 计数 / 平均值 / 最大值 / 最小值”。**透视结果是“活”的**:① 编辑源数据区任意单元格(含撤销/重做)后,所有透视表自动按源区域重算;② 放两个及以上行字段时,外层分组带小计且可点行首 [−]/[+] 折叠/展开内层明细(单行字段为扁平结果,无折叠)。也可调用 `createPivotTable({ sourceRange, sourceSheetIndex, output, layout, showPanel })` 不经过页面直接创建;旧的 `createPivotTableFromSelection({ rowFieldIndex, valueFieldIndex, output })` 仍保留。创建出的 `PivotTableModel` 会保存 `source` 和 `layout` 元数据,供运行时重建与导出使用。失败时会提示原因。**整个透视表功能由 `pivotTable` 配置开启(默认关闭)**,关闭时入口/API/导出回注全部不生效、行为与历史版本一致。**导出 .xlsx 时回注真实 OOXML 透视表零件**(pivotCacheDefinition / pivotCacheRecords / pivotTableDefinition + 全套 rels,带 `refreshOnLoad`):Excel/WPS 打开导出件即识别为真透视表并按源区域重算原生布局;静态汇总结果仍在单元格里,不支持透视的查看器也能看。筛选器导出语义对齐 WPS:“= 具体值”写入页字段选中项(打开还原筛选状态),“多选/非空”映射为 `multipleItemSelectionAllowed` + 未选项隐藏(`item@h`),“全部”不写选中。原文件已有的透视表在 **overlay 导出模式**下从原件 zip 原样搬运整套零件(保持“打开→编辑→另存,透视表仍在”);rebuild 模式因结构可能被增删行列改动不搬运(退化为普通单元格)
|
|
711
|
+
- 条件格式编辑:解析时全 6 类规则(突出显示单元格 `cellIs` / 公式 `expression` / 色阶 `colorScale` / 数据条 `dataBar` / 图标集 `iconSet` / 项目选取 `top10`)都渲染;**开 `conditionalFormat`(还需 `editable`)后可新建/编辑/删除**。工具栏 `conditional-format` 入口打开**条件格式管理对话框**(框架无关 DOM,三壳共用一份,UI 天然 1:1):列出当前表所有规则(每条可「编辑」「删除」)+「新建规则」。新建时选规则类型,弹出对应编辑器 —— cellIs:运算符(大于/小于/介于/不介于/等于/不等于/大于等于/小于等于)+ 值(介于类两个值)+ 命中格式(填充色 / 字体色 / 加粗);expression:自定义公式 + 命中格式;colorScale:双色/三色 + 各色标取色;dataBar:条颜色 + 渐变开关;iconSet:7 种图标集(三色交通灯 / 三向箭头 / 三符号 / 三色旗 / 四等评级 / 五等评级 / 五象限)+ 反向;top10:前/后 + 个数 + 百分比开关 + 命中格式。**新建规则默认套到当前选区**;编辑保留原区域。所有改动**整体单次撤销**(`set-conditional` 命令替换整张规则集),改完即时重渲。也可不开对话框直接调 API:`getConditionalRules()` / `addConditionalRule(rule)`(返回新 id)/ `updateConditionalRule(id, patch)` / `removeConditionalRule(id)` / `setConditionalRules(rules)` / `openConditionalFormatDialog()`。**导出 .xlsx 回写条件格式**:`rebuild` 与 `overlay` 都回写(1.9.0 起 rebuild 不再丢条件格式);**从文件解析、未在 app 内编辑过的规则按原始 OOXML 原样回写**(保留色阶/数据条/图标集的 cfvo 阈值等不全建模字段,零退化),用户新建或编辑过的规则按模型重建(全 6 类)。整个功能由 `conditionalFormat` 配置开启(默认关闭),关闭时入口/API/导出回写全部不生效、行为与历史一致。当前限制:色阶/数据条/图标集的**阈值(cfvo)** 暂不在编辑器里微调(未编辑时靠原样回写保住,用户新建用默认阈值);文本包含等 OOXML 子类型用 `cellIs`/`expression` 表达。
|
|
676
712
|
- SmartArt;形状仅支持 rect/roundRect/ellipse + 文本(复杂自定义几何按矩形近似)
|
|
677
713
|
- `.xls`(旧 BIFF 二进制)/ 加密文件(给出友好提示)
|
|
678
714
|
- 图表为 ECharts 近似,非像素级一致
|
|
@@ -691,7 +727,7 @@ npm run build # 构建组件库(dist/)
|
|
|
691
727
|
npm run build:demo # 构建 demo 站点
|
|
692
728
|
```
|
|
693
729
|
|
|
694
|
-
> **e2e 说明**:`npm run test:e2e` 用 Playwright 起 dev 服务 + 无头 Chromium,加载示例 → 渲染 → 导出 PNG/位图PDF/矢量PDF,校验产物(PNG 魔数、`%PDF`、矢量 PDF 的文字操作符数量多于位图)。覆盖 node 单测做不到的真实 canvas/jsPDF 绘制。首次需 `npx playwright install chromium` 下载浏览器(本仓库 `@playwright/test` 固定 `1.58.0` 对应 chromium-1208)
|
|
730
|
+
> **e2e 说明**:`npm run test:e2e` 用 Playwright 起 dev 服务 + 无头 Chromium,加载示例 → 渲染 → 导出 PNG/位图PDF/矢量PDF,校验产物(PNG 魔数、`%PDF`、矢量 PDF 的文字操作符数量多于位图)。覆盖 node 单测做不到的真实 canvas/jsPDF 绘制。首次需 `npx playwright install chromium` 下载浏览器(本仓库 `@playwright/test` 固定 `1.58.0` 对应 chromium-1208)。**Vue 3 / React demo 在 5300**(`/` 与 `/react.html`),**Vue 2 demo 在独立 5302**(plugin-vue2 SFC 隔离);两个 dev server 都由 Playwright 自动拉起。三壳均有 e2e 覆盖。
|
|
695
731
|
|
|
696
732
|
## 文档 / 二开
|
|
697
733
|
|