ooxml-excel-editor 1.16.0 → 1.16.1
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 +38 -0
- package/README.md +3 -3
- package/dist/chunks/{index-CoOchGdS.js → index-CKf3q6pu.js} +7322 -6722
- package/dist/chunks/{index-B524VYpT.js → index-xD5935xY.js} +5926 -5325
- package/dist/chunks/{index.es-4CG-9vV3.js → index.es-BZzDc3NP.js} +1 -1
- package/dist/chunks/{index.es-DXHaUdz8.js → index.es-CaZDvCo1.js} +1 -1
- package/dist/chunks/{jspdf.es.min-0SH7s6ux.js → jspdf.es.min-BMIqrKfr.js} +2 -2
- package/dist/chunks/{jspdf.es.min-BGxE3IHn.js → jspdf.es.min-DJ2NWx1E.js} +2 -2
- package/dist/chunks/{toolbar-builtins-DldwAB3X.js → toolbar-builtins-IAxeMFn3.js} +1 -1
- package/dist/components/ExcelViewer.vue.d.ts +8 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/plugin.d.ts +16 -0
- package/dist/core/render/canvas-renderer.d.ts +0 -8
- package/dist/core/viewer/controller.d.ts +58 -24
- package/dist/core/viewer/filter-engine.d.ts +57 -0
- package/dist/core/viewer/filter-popup-host.d.ts +36 -0
- package/dist/core/viewer/find-engine.d.ts +31 -0
- package/dist/core/viewer/find-replace-dialog-host.d.ts +69 -0
- package/dist/core.js +1 -1
- package/dist/index.js +1784 -2048
- package/dist/react/ExcelViewer.d.ts +8 -0
- package/dist/react.js +661 -716
- 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/components/FilterPopup.vue.d.ts +0 -21
- package/dist/components/FindBar.vue.d.ts +0 -35
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
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.16.1] - 2026-07-16
|
|
6
|
+
|
|
7
|
+
> **查找和替换 WPS 1:1 深化** —— 内联查找栏升级为 **WPS 式「查找和替换」对话框**(框架无关 core DOM,三壳共用一份;模态脱浮动、标题栏可拖动、不遮网格)。查找/替换 双分页签 + 完整选项(范围 工作表/工作簿、搜索 按行/按列、查找范围 值/公式/批注、区分大小写、单元格匹配、通配符)+「全部查找」结果表。
|
|
8
|
+
|
|
9
|
+
### 新增 — 查找引擎(框架无关)
|
|
10
|
+
|
|
11
|
+
- **`core/viewer/find-engine.ts`**(纯模型层,不依赖渲染器):`buildMatcher`(区分大小写 / 单元格匹配 / 通配符 `* ? ~`)、`cellMatchText`(按 lookIn 取 值=显示文本 / 公式=`=公式` / 批注=comment 文本)、`searchWorkbook`(scope=sheet/workbook、direction=row/col 排序,产出**跨表命中** `FindHit[]` 带 sheet 下标 + 显示值)。因文本全走模型层 `getCellText` / `cell.formula` / `cell.comment`,**对非活动表也能搜**(工作簿范围)。11 单测。
|
|
12
|
+
- 渲染器 `searchCells` 匹配逻辑移出 → 只保留高亮绘制(`setFind` + `drawFind`);控制器把**当前活动表**命中喂进渲染器,`drawFind` 只高亮当前表。
|
|
13
|
+
|
|
14
|
+
### 新增 — 控制器 / 状态
|
|
15
|
+
|
|
16
|
+
- `FindState` 扩展:`scope`('sheet'|'workbook')、`direction`('row'|'col')、`lookIn`('value'|'formula'|'comment')、`wildcard`。新 setter `setFindScope/Direction/LookIn/Wildcard`。
|
|
17
|
+
- 跨表命中导航:`findNext/findPrev` 跨表(切表用 `onActiveSheetChange` 请求壳切表 + `pendingFindFocus` 在 rebuild 重跑查找后落位)。
|
|
18
|
+
- `getFindResults()`(全部查找结果:sheet 下标 + 表名 + 行列 + 显示值)、`gotoFindHit(gi)`(结果表点击跳转)。
|
|
19
|
+
- **替换**作用于**活动表**(跨表命令栈批处理不支持;工作簿范围下也只替当前表),`lookIn=comment` 仅查不替;`replaceInString` 支持通配符/单元格匹配整格替换 + 子串正则替换。
|
|
20
|
+
|
|
21
|
+
### 新增 — WPS 查找和替换对话框(core DOM,三壳共用)
|
|
22
|
+
|
|
23
|
+
- **`core/viewer/find-replace-dialog-host.ts`**:双分页签「查找 / 替换」(替换页仅 editable);查找内容 / 替换为 输入;选项区(范围 / 搜索 / 查找范围 三下拉 + 区分大小写 / 单元格匹配 / 通配符 三复选);计数「第 x 个,共 N 个 / 无结果」;按钮 全部查找 / 查找上一个 / 查找下一个 / 替换 / 全部替换;**「全部查找」结果表**(工作表 · 单元格 · 值,点行跳转,替换后自动刷新)。`position:fixed` 浮动、**标题栏可拖动**、Esc 关闭(焦点在对话框内时)。
|
|
24
|
+
- 控制器 `openFindReplaceDialog(tab?)` / `closeFindReplaceDialog()` / `isFindDialogOpen()`;`ViewerApi` + 三壳句柄(Vue3 `defineExpose` viewerApi / React `ExcelViewerHandle` / Vue2)全绑定。
|
|
25
|
+
- **三壳接入**:移除各自内联查找栏(Vue3 `FindBar.vue` 删除、React 内联 `rxl-findbar` / Vue2 `ov-findbar` 移除 + 死 CSS 清理);工具栏「查找」按钮 + Ctrl/⌘+F 改开这一 core 对话框。**一次落地即三壳视觉/交互 1:1。**
|
|
26
|
+
- 暂缓(未做):**格式查找/替换**(按字体/填充/边框匹配);批注**替换**(仅查);跨表**替换**。
|
|
27
|
+
|
|
28
|
+
### 测试
|
|
29
|
+
|
|
30
|
+
- 单测 `find-engine.test.ts`(11):matcher 各选项 / 通配符 / cellMatchText / searchWorkbook 范围+方向+显示值。
|
|
31
|
+
- e2e 重写:`find.e2e.ts`(计数 / 无结果 / 上下导航 / 全部查找结果表点击跳转 / 通配符 / Esc + 三壳打开同一 core 对话框)、`find-replace.e2e.ts`(三壳:替换页 全部替换 + undo)。选择器改 `.ooxml-finddlg`。
|
|
32
|
+
|
|
5
33
|
## [1.16.0] - 2026-07-10
|
|
6
34
|
|
|
7
35
|
> **WPS 式分组 Ribbon(工具板块)** —— 1:1 复刻 WPS 排版:选项卡 → 命名子组 → 大/小按钮混排 + 组名在底 + 组间竖分隔 + 小按钮严格两行。含**统一设置面板** + **板块布局持久化** + **一大批新工具**(把 core 已有能力接成按钮 + 少量新 core 能力)。三壳(Vue3/React/Vue2)1:1。
|
|
@@ -16,6 +44,16 @@
|
|
|
16
44
|
- **文本分列**:框架无关 [`text-to-columns-dialog-host.ts`](./src/core/viewer/text-to-columns-dialog-host.ts)(制表/逗号/分号/空格/自定义)。`edit.textToColumns(range, delimiter)`:单列每格按分隔符拆分写入本行右侧列(向右覆盖,同 Excel 默认),cloneWorkbook 单次撤销。工具 `text-to-columns`。
|
|
17
45
|
- 仍未做(我们没有,已置灰/省略):分类汇总·创建组/分级显示(outline)·数据对比·合并计算·获取数据/全部刷新/股票·智能分析/数据校对/AI 分析/查找录入/数据查询。措辞对外中性。
|
|
18
46
|
|
|
47
|
+
### 新增 — 条件筛选(数字/文本/日期 + 前十项 + 高于/低于平均值)+ 统一筛选浮层(三壳共用 core DOM)
|
|
48
|
+
|
|
49
|
+
- **条件筛选引擎**(框架无关 [`core/viewer/filter-engine.ts`](./src/core/viewer/filter-engine.ts)):`FilterCondition` 支持 **数字**(=/≠/>/≥/</≤/介于/不介于)、**文本**(包含/不包含/开头是/结尾是/等于/不等于)、**日期**(早于/晚于/介于)、**前十项**(最大/最小 × 项/百分比 × n)、**高于平均值** / **低于平均值**。`inferFilterColType(values)` 按多数(≥60%)推断列类型;`resolveDynamicCondition` 把前十项/平均值折算成具体数值门槛(基于该列全部数值);`matchesCondition(cond, cell)` 单格判定。8 单测。
|
|
50
|
+
- **筛选态双路**:控制器 `filterState: Map<col, {values}|{cond}>`,`applyFilters()` 每列按"按值集合"或"按条件"两路各自命中;条件筛选与按值筛选**互斥**(同列后设覆盖先设)。
|
|
51
|
+
- **★ 统一筛选浮层 [`filter-popup-host.ts`](./src/core/viewer/filter-popup-host.ts)(框架无关 core DOM,三壳共用)**:**WPS 式分页签**布局 —— 顶部 `[按内容]`(值复选,带搜索 + 全选)/ `[数字·文本·日期 筛选]`(条件表单)+ `清除筛选`;上方 升序/降序。值列表**长值横向滚动、不截断**(对齐 WPS)。定位用视口坐标 `position:fixed`(挂 `document.body`,DPR 安全,由 `renderArea.getBoundingClientRect()` 换算)。**此件取代原来 Vue3 `FilterPopup.vue` / React 内联 `FilterPopup` 各自实现** —— 消除三壳漂移、**补齐此前完全缺失的 Vue 2 筛选浮层**,一次落地即三壳视觉/交互 1:1。
|
|
52
|
+
- **编程 API**:`toggleAutoFilter()` / `hasFilters()` / `clearAllFilters()` / `openFilterConditionDialog(col)` / `applyFilterCondition(col, cond|null)`,`ViewerApi` + 三壳句柄(Vue3 `defineExpose` viewerApi / React `ExcelViewerHandle` / Vue2)全绑定。
|
|
53
|
+
- 移除公共导出 `FilterPopupState` 类型(浮层内聚进 core,壳不再渲染它)。**按颜色筛选**暂缓(未做)。
|
|
54
|
+
- **修复「搜索框缩小值列表 → 直接确定 → 却没筛」**:对齐 WPS/Excel —— 搜索激活时 `确定` 应用 `搜索结果 ∩ 已勾选`(而非残留的全量勾选,此前"全选"默认态使 checked=全部 → 等于不筛)。「(全选)」在搜索时改标「(全选搜索结果)」,仅作用于可见匹配项。无搜索时 `shown=全部值`,行为与旧版等价(零回归)。`filter.e2e.ts` 加"搜索+确定"回归用例。
|
|
55
|
+
- e2e:[`filter-condition.e2e.ts`](./e2e/filter-condition.e2e.ts) 三壳(Vue3/React/Vue2)各跑数字>门槛 / 前十项 / 高于平均 / 清除还原;`filter.e2e.ts` / `sort.e2e.ts` 选择器改 `.ooxml-filterpop`。
|
|
56
|
+
|
|
19
57
|
### 新增 — 审阅选项卡(批注导航/显示 + 单元格锁定 + 工作表/工作簿保护 + 允许编辑区域)
|
|
20
58
|
|
|
21
59
|
- **批注组**:`comment-new`(新建批注,活动格开批注编辑器)/ `comment-delete`(删除批注,活动格无批注时禁用)/ `comment-prev` `comment-next`(上一条/下一条,按行列顺序循环移选区并滚动可见)/ `comment-show`(显示,常驻画所有批注**小黄框** + 引线,渲染器 `setShowAllComments` + `drawAllComments`,跨切表保留)。controller `hasAnyComment`/`activeHasComment`/`deleteActiveComment`/`gotoComment(±1)`/`toggleShowAllComments`/`isShowAllComments`。
|
package/README.md
CHANGED
|
@@ -53,7 +53,7 @@ const src = ref<File>() // 绑个 <input type="file" @change> 给它即可
|
|
|
53
53
|
- 📋 **从 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`,那种区域图仍救不回。
|
|
54
54
|
- 📋 **应用内 1:1 复制粘贴**:本组件自己 `Ctrl+C` 的内容会把**完整模型快照**嵌进剪贴板(`<table data-ooxml-clip>`),`Ctrl+V` 时识别并 1:1 还原 —— 数字不会退化成文本、边框/数字格式/合并/DISPIMG 图片/**行高**全保留;因为快照随剪贴板走,**Vue3/Vue2/React 三壳之间、跨标签页互相复制结果都一致**。粘到外部应用(Excel/WPS/Word)则读可见 `<table>`(近似)。**列宽以目标现有表头为准、不被源覆盖**(列宽整列共享,改了会动表头;同 Excel 默认粘贴)。
|
|
55
55
|
- 📝 **文本溢出**到相邻空格、**自动行高**
|
|
56
|
-
- 🖱 **交互**:单元格选区(合并感知)、拖选、公式栏、状态栏(计数/求和/均值/最值)、超链接可点、裁切文本悬停看全文、Ctrl+C 复制(**同应用内 1:1 保真**:含数字原始值/数字格式/边框/合并/图片/行高,跨 Vue3/Vue2/React 实例互相复制都一致;**列宽以目标表头为准不覆盖**;另带 TSV/HTML 供贴进 Excel/WPS)、**Ctrl+F
|
|
56
|
+
- 🖱 **交互**:单元格选区(合并感知)、拖选、公式栏、状态栏(计数/求和/均值/最值)、超链接可点、裁切文本悬停看全文、Ctrl+C 复制(**同应用内 1:1 保真**:含数字原始值/数字格式/边框/合并/图片/行高,跨 Vue3/Vue2/React 实例互相复制都一致;**列宽以目标表头为准不覆盖**;另带 TSV/HTML 供贴进 Excel/WPS)、**Ctrl+F 查找和替换**(WPS 式对话框,查找/替换 双分页签 + 范围 工作表/工作簿 + 搜索 按行/按列 + 查找范围 值/公式/批注 + 区分大小写/单元格匹配/通配符 + 全部查找结果表点击跳转;编辑模式带替换/全部替换;三壳共用同一 core 对话框)、**自动筛选**(点下拉真能筛,WPS 式分页签浮层:`[按内容]` 去重值多选 + 搜值 + 清除;`[条件筛选]` 数字/文本/日期条件 + 前十项 + 高于/低于平均值;三壳共用同一 core 浮层)、**自动填充柄**(编辑模式拖选区右下角填序列:等差/日期/星期月份/文本递增,见 [编辑](#编辑可选默认只读))、**快速填充 Ctrl+E**(编辑模式:目标列打 1~N 个样例 → 从左侧源列推断变换[拼接/分词取段/域名提取]填其余空行)、**不连续多选**(Ctrl/⌘ 点击行头/列头/格 加选不相邻区域,复制堆叠 + 状态栏跨区统计)
|
|
57
57
|
- 🖨 **导出 / 打印**:整表/选区/多表导出 **PNG/JPEG**、**PDF**(位图 + **矢量·文字可选可搜**两种)、**系统打印**(可另存 PDF)、**打印预览浮层**(`openPrintPreview()`,与实际打印同一分页管线、只读也可用);默认还原原生 `pageSetup`(纸张/方向/页边距/缩放/打印区域/**打印标题行列每页重复**/**打印网格线**/**打印行号列标**,`<printOptions>` 往返);宽表**横向跨页**(页矩阵);`beforeRenderPage` 注入页眉/页脚/水印、`configureDoc` 注册字体;内置「导出设置」对话框
|
|
58
58
|
- ⚡ **按需加载**(无图表文件不下载 echarts、不导出 PDF 不下载 jspdf)、**友好错误兜底**(损坏/加密/旧 .xls)、解析失败自动给出可读提示
|
|
59
59
|
|
|
@@ -372,7 +372,7 @@ viewer.value.getRangeData(viewer.value.getSelection()) // 取"我选中的"区
|
|
|
372
372
|
| `plugins` | `ExcelPlugin[]` | 插件数组(`definePlugin` 打包 theme/cellStyle/transformModel/events/overlay/toolbar/setup);见 [插件](EXTENDING.md#插件-defineplugin) |
|
|
373
373
|
| `openLinks` | `boolean` | 单击超链接是否自动打开(默认 `true`;`false` 只发 `@hyperlink` 事件,自己处理) |
|
|
374
374
|
|
|
375
|
-
> 编辑相关 props 详见下方 [编辑](#编辑可选默认只读) 章节;数据验证(开 `editable` 后**编辑时拦截非法输入** + 列表型下拉选值)无需额外 prop,解析到的规则自动生效。**1.16.0 起可创建/修改验证规则**(数据选项卡「有效性 / 下拉列表」→ 对话框:列表/整数/小数/日期/时间/文本长度/自定义 + 出错警告;`openDataValidationDialog()`/`setDataValidation()`,导出 `.xlsx` 往返)。同选项卡还有**删除重复项**(`openRemoveDuplicatesDialog()`)、**文本分列**(`openTextToColumnsDialog()`)
|
|
375
|
+
> 编辑相关 props 详见下方 [编辑](#编辑可选默认只读) 章节;数据验证(开 `editable` 后**编辑时拦截非法输入** + 列表型下拉选值)无需额外 prop,解析到的规则自动生效。**1.16.0 起可创建/修改验证规则**(数据选项卡「有效性 / 下拉列表」→ 对话框:列表/整数/小数/日期/时间/文本长度/自定义 + 出错警告;`openDataValidationDialog()`/`setDataValidation()`,导出 `.xlsx` 往返)。同选项卡还有**删除重复项**(`openRemoveDuplicatesDialog()`)、**文本分列**(`openTextToColumnsDialog()`)、**重新应用筛选**、**条件筛选**(`toggleAutoFilter()` 开自动筛选;`openFilterConditionDialog(col)` 打开某列筛选浮层直达条件页;`applyFilterCondition(col, cond|null)` 程序化设/清列条件——`cond` 支持数字/文本/日期/前十项/高于·低于平均值;`hasFilters()`/`clearAllFilters()`)。**审阅选项卡(1.16.0)**:批注新建/删除/上一条/下一条/**显示批注常驻小黄框**(`gotoComment(±1)`/`toggleShowAllComments()`);**锁定单元格**(`toggleCellLock()`,`CellStyle.protection.locked` 缺省锁定,导出往返);**保护工作表**(`openProtectSheetDialog()`,开启后锁定格变只读、走统一可编辑闸门,密码 + 允许项,`.xlsx` 往返);**允许编辑区域**(`openAllowEditRangesDialog()`,保护时的可编辑例外);**保护工作簿**(`openProtectWorkbookDialog()`,结构锁定,zip 层回注 `<workbookProtection>`)。「共享工作簿」是官方已弃用特性,占位提示不实现。**视图选项卡(1.16.0)**:编辑栏(`toggleFormulaBar()`)、行号列标(`toggleHeaders()`,表头尺寸归 0)、网格线(`toggleGridLines()`)、任务窗格(`toggleTaskPane()`,右停靠面板:工作表列表 + 选区统计 + 显示开关)四个显示开关。**修改标记(1.16.0)**:标题栏文件名前显示红色 `*` 表示文档已被修改;**彻底撤回(undo 到栈空)后视为未改动**,`*` 消失(`isDirty()` + `dirty-change` 事件)。**导出下拉(1.16.0)**:标题栏「导出 ▾」新增导出为 **Excel(.xlsx)/ CSV / JSON**(+ 原有 PNG/PDF/打印)。**设置面板「快捷键」页(1.16.0)**:齿轮设置面板列出全部键盘快捷键(单一真相源 `KEYBOARD_SHORTCUTS`,从 `/core` 导出)。
|
|
376
376
|
|
|
377
377
|
| 事件 | 载荷 | 触发时机 |
|
|
378
378
|
|---|---|---|
|
|
@@ -490,7 +490,7 @@ const myEditor: EditorResolver = (cell, pos) => {
|
|
|
490
490
|
|
|
491
491
|
### 数字格式 / 批注 / 查找替换(1.11.0)
|
|
492
492
|
|
|
493
|
-
-
|
|
493
|
+
- **查找和替换(1.16.1 WPS 1:1)**:`Ctrl+F` 打开 **WPS 式「查找和替换」对话框**(框架无关 core DOM,三壳共用;浮动可拖动、不遮网格)。查找/替换 双分页签(替换页需 editable)+ 选项区 **范围**(工作表/工作簿)、**搜索**(按行/按列)、**查找范围**(值/公式/批注)、**区分大小写 / 单元格匹配 / 通配符**(`* ? ~`);**全部查找**列出全部命中(工作表 · 单元格 · 值)点行跳转(工作簿范围跨表跳转);替换 / 全部替换(整体单次撤销,跳过只读格,作用于活动表)。程序化:`openFindReplaceDialog('find'|'replace')` / `closeFindReplaceDialog()` / `isFindDialogOpen()`。〔暂缓:格式查找、批注替换、跨表替换。〕
|
|
494
494
|
- **数字格式编辑器**:工具栏 `number-format` 入口打开对话框(框架无关 DOM,三壳共用)—— 分类(常规/数值/货币/百分比/日期/时间/文本/自定义)+ 选项(小数位数 / 千分位 / 负数红色 / 货币符号 / 日期时间预设)+ 实时预览 + 可直接编辑格式代码 → 确定即套到选区(单次撤销)。也可 `setSelectionNumberFormat(code)` / `openNumberFormatDialog()` 直调。
|
|
495
495
|
- **批注编辑**:右键单格「插入/编辑/删除批注」打开对话框(多行文本 + 确定/删除/取消);`getCellComment` / `setCellComment(row,col,text)`(空串删除)/ `openCommentEditor()` 直调,单次撤销;**导出 .xlsx 回写批注**(rebuild + overlay)。
|
|
496
496
|
|