ooxml-excel-editor 1.1.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 +95 -0
- package/LICENSE +21 -0
- package/README.md +516 -0
- package/dist/chunks/plugin-overlay-Cfnn9EOi.js +7144 -0
- package/dist/chunks/worker-client.stub-BQVZfaLd.js +7 -0
- package/dist/components/ActionToolbar.vue.d.ts +9 -0
- package/dist/components/ExcelViewer.vue.d.ts +283 -0
- package/dist/components/ExportDialog.vue.d.ts +14 -0
- package/dist/components/FilterPopup.vue.d.ts +21 -0
- package/dist/components/FindBar.vue.d.ts +27 -0
- package/dist/components/SheetTabs.vue.d.ts +11 -0
- package/dist/components/ToolbarMenu.vue.d.ts +10 -0
- package/dist/components/ViewerToolbar.vue.d.ts +21 -0
- package/dist/components/export-types.d.ts +14 -0
- package/dist/components/toolbar-icons.d.ts +7 -0
- package/dist/components/toolbar-types.d.ts +18 -0
- package/dist/composables/useExcelDocument.d.ts +17 -0
- package/dist/composables/worker-client.d.ts +3 -0
- package/dist/composables/worker-client.stub.d.ts +3 -0
- package/dist/core/edit/commands.d.ts +94 -0
- package/dist/core/edit/default-editor.d.ts +2 -0
- package/dist/core/edit/edit-controller.d.ts +137 -0
- package/dist/core/edit/editor-context.d.ts +40 -0
- package/dist/core/edit/editor-host.d.ts +22 -0
- package/dist/core/edit/permissions.d.ts +3 -0
- package/dist/core/edit/types.d.ts +23 -0
- package/dist/core/export/composite.d.ts +18 -0
- package/dist/core/export/data-export.d.ts +9 -0
- package/dist/core/export/exporter.d.ts +64 -0
- package/dist/core/export/index.d.ts +9 -0
- package/dist/core/export/paginate.d.ts +36 -0
- package/dist/core/export/pdf.d.ts +28 -0
- package/dist/core/export/print.d.ts +3 -0
- package/dist/core/export/raster.d.ts +13 -0
- package/dist/core/export/types.d.ts +92 -0
- package/dist/core/export/vector-pdf.d.ts +42 -0
- package/dist/core/export/xlsx-writer.d.ts +15 -0
- package/dist/core/finalize.d.ts +10 -0
- package/dist/core/format/builtin-formats.d.ts +7 -0
- package/dist/core/format/color.d.ts +11 -0
- package/dist/core/format/date-serial.d.ts +16 -0
- package/dist/core/format/number-format.d.ts +5 -0
- package/dist/core/formula/engine.d.ts +27 -0
- package/dist/core/formula/hyperformula-adapter.d.ts +3 -0
- package/dist/core/formula/recalc.d.ts +9 -0
- package/dist/core/formula/refs.d.ts +21 -0
- package/dist/core/index.d.ts +52 -0
- package/dist/core/layout/autofit.d.ts +2 -0
- package/dist/core/layout/freeze.d.ts +11 -0
- package/dist/core/layout/grid-metrics.d.ts +37 -0
- package/dist/core/layout/merges.d.ts +14 -0
- package/dist/core/layout/units.d.ts +20 -0
- package/dist/core/layout/viewport.d.ts +29 -0
- package/dist/core/loader.d.ts +5 -0
- package/dist/core/model/clone.d.ts +9 -0
- package/dist/core/model/data-access.d.ts +30 -0
- package/dist/core/model/mutations.d.ts +46 -0
- package/dist/core/model/snapshot.d.ts +14 -0
- package/dist/core/model/structure.d.ts +26 -0
- package/dist/core/model/types.d.ts +289 -0
- package/dist/core/overlay/anchor.d.ts +9 -0
- package/dist/core/overlay/chart-mapper.d.ts +3 -0
- package/dist/core/overlay/echarts-loader.d.ts +3 -0
- package/dist/core/parse.worker.d.ts +14 -0
- package/dist/core/parser/chart-parser.d.ts +3 -0
- package/dist/core/parser/drawing-parser.d.ts +3 -0
- package/dist/core/parser/exceljs-adapter.d.ts +8 -0
- package/dist/core/parser/index.d.ts +3 -0
- package/dist/core/parser/page-break-parser.d.ts +3 -0
- package/dist/core/parser/raw-xml.d.ts +15 -0
- package/dist/core/parser/sparkline-parser.d.ts +3 -0
- package/dist/core/parser/theme.d.ts +3 -0
- package/dist/core/plugin.d.ts +180 -0
- package/dist/core/progress.d.ts +7 -0
- package/dist/core/render/autofilter.d.ts +14 -0
- package/dist/core/render/borders.d.ts +13 -0
- package/dist/core/render/canvas-renderer.d.ts +225 -0
- package/dist/core/render/conditional.d.ts +25 -0
- package/dist/core/render/fills.d.ts +2 -0
- package/dist/core/render/text.d.ts +20 -0
- package/dist/core/render/theme.d.ts +19 -0
- package/dist/core/viewer/controller.d.ts +339 -0
- package/dist/core/viewer/overlay-manager.d.ts +27 -0
- package/dist/core/viewer/plugin-overlay.d.ts +8 -0
- package/dist/core.d.ts +2 -0
- package/dist/core.js +74 -0
- package/dist/demo-shared/demo-editor.d.ts +2 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +1493 -0
- package/dist/react/ExcelViewer.d.ts +153 -0
- package/dist/react/index.d.ts +11 -0
- package/dist/react/use-excel-document.d.ts +17 -0
- package/dist/react.d.ts +2 -0
- package/dist/react.js +838 -0
- package/dist/style.css +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { CellStyle, CellStyleFn, MergeRange, SheetModel, WorkbookModel } from '../model/types';
|
|
2
|
+
import { ViewerTheme } from './theme';
|
|
3
|
+
import { GridMetrics } from '../layout/grid-metrics';
|
|
4
|
+
import { FreezeGeometry } from '../layout/freeze';
|
|
5
|
+
export interface RendererOptions {
|
|
6
|
+
theme?: Partial<ViewerTheme>;
|
|
7
|
+
cellStyle?: CellStyleFn;
|
|
8
|
+
}
|
|
9
|
+
/** 导出为离屏 canvas 的选项 */
|
|
10
|
+
export interface ExportToCanvasOptions {
|
|
11
|
+
/** 0-based 闭区间;缺省 = 整个已用范围 */
|
|
12
|
+
range?: MergeRange;
|
|
13
|
+
/** 设备像素缩放(越大越清晰),默认 2;受 maxPixels 限制可能被下调 */
|
|
14
|
+
scale?: number;
|
|
15
|
+
/** 是否含行号/列字母表头,默认 false(同 Excel 打印默认) */
|
|
16
|
+
includeHeaders?: boolean;
|
|
17
|
+
/** 覆盖网格线显隐(缺省跟随 sheet.showGridLines) */
|
|
18
|
+
gridlines?: boolean;
|
|
19
|
+
/** 背景色,默认白 */
|
|
20
|
+
background?: string;
|
|
21
|
+
/** 单维度设备像素安全上限,默认 16384(超大表自动降 scale) */
|
|
22
|
+
maxPixels?: number;
|
|
23
|
+
}
|
|
24
|
+
/** exportToCanvas 的产物 + 合成叠加层(图片/图表/形状)所需的坐标信息 */
|
|
25
|
+
export interface ExportToCanvasResult {
|
|
26
|
+
canvas: HTMLCanvasElement;
|
|
27
|
+
/** 实际用的设备像素缩放(可能被 maxPixels 下调) */
|
|
28
|
+
scale: number;
|
|
29
|
+
/** 解析出的导出范围 */
|
|
30
|
+
range: MergeRange;
|
|
31
|
+
/** 正文宽高(css px,不含表头,zoom=1) */
|
|
32
|
+
bodyW: number;
|
|
33
|
+
bodyH: number;
|
|
34
|
+
/** 导出空间几何(zoom=1),供合成叠加层定位 */
|
|
35
|
+
metrics: GridMetrics;
|
|
36
|
+
/** 画布内"范围左上角格子"所在的 css 像素偏移(含表头时为表头宽高,否则 0) */
|
|
37
|
+
originX: number;
|
|
38
|
+
originY: number;
|
|
39
|
+
/** 范围左上角在网格坐标系的像素(zoom=1);合成时: deviceX = (originX + gridLeft - gridOriginX) * scale */
|
|
40
|
+
gridOriginX: number;
|
|
41
|
+
gridOriginY: number;
|
|
42
|
+
}
|
|
43
|
+
export interface ViewState {
|
|
44
|
+
scrollX: number;
|
|
45
|
+
scrollY: number;
|
|
46
|
+
width: number;
|
|
47
|
+
height: number;
|
|
48
|
+
zoom: number;
|
|
49
|
+
}
|
|
50
|
+
/** 矢量导出: 一个单元格解析后的绘制信息 */
|
|
51
|
+
export interface CellDrawInfo {
|
|
52
|
+
style: CellStyle;
|
|
53
|
+
text: string;
|
|
54
|
+
/** 有效字色(已并入条件格式/数字格式/超链接色) */
|
|
55
|
+
color: string;
|
|
56
|
+
bold: boolean;
|
|
57
|
+
/** 条件格式可矢量化的效果(背景色/数据条/图标);无则省略 */
|
|
58
|
+
effect?: {
|
|
59
|
+
fillColor?: string;
|
|
60
|
+
dataBar?: {
|
|
61
|
+
ratio: number;
|
|
62
|
+
color: string;
|
|
63
|
+
gradient: boolean;
|
|
64
|
+
};
|
|
65
|
+
icon?: {
|
|
66
|
+
setName: string;
|
|
67
|
+
level: number;
|
|
68
|
+
count: number;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
/** 矢量层仍画不动的效果(迷你图/旋转/富文本)→ 调用方栅格兜底 */
|
|
72
|
+
complex: boolean;
|
|
73
|
+
}
|
|
74
|
+
export declare class CanvasRenderer {
|
|
75
|
+
private canvas;
|
|
76
|
+
private sheet;
|
|
77
|
+
private workbook;
|
|
78
|
+
metrics: GridMetrics;
|
|
79
|
+
private merges;
|
|
80
|
+
private freeze;
|
|
81
|
+
private cond;
|
|
82
|
+
private ctx;
|
|
83
|
+
private dpr;
|
|
84
|
+
private sparklineIndex;
|
|
85
|
+
private theme;
|
|
86
|
+
private cellStyleHook?;
|
|
87
|
+
constructor(canvas: HTMLCanvasElement, sheet: SheetModel, workbook: WorkbookModel, zoom?: number, opts?: RendererOptions);
|
|
88
|
+
/** 改变缩放: 重建几何(列宽行高表头按 zoom 缩放)。合并/条件格式无需重建。 */
|
|
89
|
+
setZoom(zoom: number): void;
|
|
90
|
+
/** 内容总尺寸(含表头),给外层滚动容器用 */
|
|
91
|
+
get contentWidth(): number;
|
|
92
|
+
get contentHeight(): number;
|
|
93
|
+
get freezeGeometry(): FreezeGeometry;
|
|
94
|
+
/** 默认行高(已含缩放),供翻页步长估算 */
|
|
95
|
+
get defaultRowPx(): number;
|
|
96
|
+
/** 把行列号映射到当前视图的屏幕矩形(供叠加层定位) */
|
|
97
|
+
screenRectOfCell(view: ViewState, row: number, col: number): {
|
|
98
|
+
x: number;
|
|
99
|
+
y: number;
|
|
100
|
+
w: number;
|
|
101
|
+
h: number;
|
|
102
|
+
};
|
|
103
|
+
private selection;
|
|
104
|
+
setSelection(sel: MergeRange | null): void;
|
|
105
|
+
private findHits;
|
|
106
|
+
private findCurrent;
|
|
107
|
+
/** 扫描非空单元格,返回命中的格(按阅读顺序: 先行后列) */
|
|
108
|
+
searchCells(query: string, opts?: {
|
|
109
|
+
matchCase?: boolean;
|
|
110
|
+
wholeCell?: boolean;
|
|
111
|
+
}): {
|
|
112
|
+
row: number;
|
|
113
|
+
col: number;
|
|
114
|
+
}[];
|
|
115
|
+
/** 设置高亮命中集 + 当前项(供 drawFind 绘制) */
|
|
116
|
+
setFind(hits: {
|
|
117
|
+
row: number;
|
|
118
|
+
col: number;
|
|
119
|
+
}[], current: number): void;
|
|
120
|
+
private filteredCols;
|
|
121
|
+
/** 标记哪些列处于筛选态(下拉按钮画成蓝色漏斗) */
|
|
122
|
+
setFilteredCols(cols: Set<number>): void;
|
|
123
|
+
/** 单元格的当前屏幕矩形(冻结感知: 冻结行/列不随滚动) */
|
|
124
|
+
cellScreenRect(view: ViewState, row: number, col: number): {
|
|
125
|
+
x: number;
|
|
126
|
+
y: number;
|
|
127
|
+
w: number;
|
|
128
|
+
h: number;
|
|
129
|
+
};
|
|
130
|
+
/** 屏幕坐标是否落在某个自动筛选表头的下拉按钮上;是则返回列号 */
|
|
131
|
+
filterButtonAt(view: ViewState, px: number, py: number): number | null;
|
|
132
|
+
/** 屏幕坐标 → 单元格(0-based)。落在表头或越界返回 null。 */
|
|
133
|
+
cellAtScreen(view: ViewState, x: number, y: number): {
|
|
134
|
+
row: number;
|
|
135
|
+
col: number;
|
|
136
|
+
} | null;
|
|
137
|
+
/** 屏幕 y → 行(用于点行号选整行);落在列表头返回 -1 */
|
|
138
|
+
rowAtScreen(view: ViewState, y: number): number;
|
|
139
|
+
/** 屏幕 x → 列(用于点列标选整列);落在行表头返回 -1 */
|
|
140
|
+
colAtScreen(view: ViewState, x: number): number;
|
|
141
|
+
/** 该 cell 所属的合并区(用于选区/复制时按整块处理) */
|
|
142
|
+
mergeAt(row: number, col: number): MergeRange | null;
|
|
143
|
+
/** 双击列边界: 把列宽自适应到该列内容最宽处 */
|
|
144
|
+
autoFitColumn(col: number): void;
|
|
145
|
+
/** 双击行边界: 行高自适应到该行内容最高处 */
|
|
146
|
+
autoFitRow(row: number): void;
|
|
147
|
+
/** 拖拽改列宽(传入屏幕像素,内部换算为非缩放存储) */
|
|
148
|
+
setColWidthPx(col: number, px: number): void;
|
|
149
|
+
/** 拖拽改行高 */
|
|
150
|
+
setRowHeightPx(row: number, px: number): void;
|
|
151
|
+
/** 复制带格式用: 单元格的内联 CSS(粗体/斜体/色/底色/对齐) */
|
|
152
|
+
cellInlineStyle(row: number, col: number): string;
|
|
153
|
+
/** 列宽/行高变化后重建几何 */
|
|
154
|
+
rebuildMetrics(): void;
|
|
155
|
+
/** 选区统计: 遍历非空 cell(O(非空数),不随选区大小爆炸) */
|
|
156
|
+
selectionStats(range: MergeRange): {
|
|
157
|
+
count: number;
|
|
158
|
+
numCount: number;
|
|
159
|
+
sum: number;
|
|
160
|
+
avg: number;
|
|
161
|
+
min: number;
|
|
162
|
+
max: number;
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* 矢量导出用: 解析一个单元格的绘制信息(样式 + 显示文本 + 有效字色/粗体 + 是否"复杂")。
|
|
166
|
+
* complex = 含条件格式背景/数据条/图标、迷你图、旋转、富文本 —— 矢量层画不动,调用方应栅格兜底。
|
|
167
|
+
* 返回 null 表示该格无任何可绘制内容(无填充/边框/文本)。
|
|
168
|
+
*/
|
|
169
|
+
exportCellDraw(row: number, col: number): CellDrawInfo | null;
|
|
170
|
+
/** 单元格的显示文本(套数字格式后);空返回 '' */
|
|
171
|
+
cellText(row: number, col: number): string;
|
|
172
|
+
/** 单元格的公式文本(无则 null),供公式栏显示 */
|
|
173
|
+
cellFormula(row: number, col: number): string | null;
|
|
174
|
+
/** 单元格原始数值(供状态栏统计);非数字返回 null */
|
|
175
|
+
cellNumber(row: number, col: number): number | null;
|
|
176
|
+
cellHyperlink(row: number, col: number): string | null;
|
|
177
|
+
/** 单元格批注(无则 null) */
|
|
178
|
+
commentAt(row: number, col: number): string | null;
|
|
179
|
+
private inDataValidation;
|
|
180
|
+
/** 若该 cell 文本被裁切(非换行、宽度不足、且溢出也放不下),返回完整文本供 tooltip;否则 null */
|
|
181
|
+
overflowTextAt(row: number, col: number): string | null;
|
|
182
|
+
render(view: ViewState): void;
|
|
183
|
+
/**
|
|
184
|
+
* 绘制核心: 被实时 render() 与导出 exportToCanvas() 共用。
|
|
185
|
+
* 用 this.{canvas,ctx,metrics,freeze,selection,dpr} 当前值,flags 控制 UI 装饰是否绘制。
|
|
186
|
+
*/
|
|
187
|
+
private paint;
|
|
188
|
+
/** 查找高亮: 所有命中淡黄,当前项橙色描边 */
|
|
189
|
+
private drawFind;
|
|
190
|
+
/**
|
|
191
|
+
* 把整表(或指定区域)渲染到一张离屏 canvas: 无选区高亮/分页线/冻结分区,scale 可控。
|
|
192
|
+
* 复用全部单元格绘制逻辑(填充/边框/条件格式/迷你图/文本)。图片/图表/形状是 DOM 叠加层,
|
|
193
|
+
* 不在此绘制 —— 由调用方拿到 result.metrics/scale/origin 后合成到底图上。
|
|
194
|
+
*/
|
|
195
|
+
exportToCanvas(opts?: ExportToCanvasOptions): ExportToCanvasResult;
|
|
196
|
+
/** 手动分页符: 蓝色虚线(在正文区内,随内容滚动) */
|
|
197
|
+
private drawPageBreaks;
|
|
198
|
+
/** 选区高亮: 半透明填充 + 蓝色边框,裁到表头以下的正文区。 */
|
|
199
|
+
private drawSelection;
|
|
200
|
+
private drawPane;
|
|
201
|
+
/** 取某格指定边的边框样式(供相邻共享边取较重者);越界/无格返回 undefined */
|
|
202
|
+
private borderEdgeOf;
|
|
203
|
+
/** 画单个 cell(或合并区)的: 填充 → 条件背景 → 数据条 → 边框 → 内容 → 图标 → 筛选按钮 */
|
|
204
|
+
private paintCellBox;
|
|
205
|
+
private drawCellContent;
|
|
206
|
+
/**
|
|
207
|
+
* 文本溢出可用的裁剪范围: 从本格向对齐方向延伸,吞掉相邻"空白"格(无值且无填充)。
|
|
208
|
+
* 返回扩展后的 clip x/w(对齐锚点仍用原格,只是裁剪放宽)。
|
|
209
|
+
*/
|
|
210
|
+
private spillClip;
|
|
211
|
+
private drawRichText;
|
|
212
|
+
private drawRotatedText;
|
|
213
|
+
private drawVerticalText;
|
|
214
|
+
private drawTextDecoration;
|
|
215
|
+
private drawHeaders;
|
|
216
|
+
private drawColHeaderRange;
|
|
217
|
+
private drawRowHeaderRange;
|
|
218
|
+
private drawFreezeLines;
|
|
219
|
+
private styleOf;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* [start,end] 减去 gaps(合并区内部区间,可重叠/乱序)的补集 → 要画的实线段。
|
|
223
|
+
* 纯函数,便于单测。合并区内部的网格线靠此被"挖空"。
|
|
224
|
+
*/
|
|
225
|
+
export declare function gridSegments(start: number, end: number, gaps: Array<[number, number]>): Array<[number, number]>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SheetModel } from '../model/types';
|
|
2
|
+
export interface CellEffect {
|
|
3
|
+
fillColor?: string;
|
|
4
|
+
fontColor?: string;
|
|
5
|
+
bold?: boolean;
|
|
6
|
+
dataBar?: {
|
|
7
|
+
ratio: number;
|
|
8
|
+
color: string;
|
|
9
|
+
gradient: boolean;
|
|
10
|
+
};
|
|
11
|
+
icon?: {
|
|
12
|
+
setName: string;
|
|
13
|
+
level: number;
|
|
14
|
+
count: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare class ConditionalEngine {
|
|
18
|
+
private sheet;
|
|
19
|
+
private prepared;
|
|
20
|
+
constructor(sheet: SheetModel);
|
|
21
|
+
hasRules(): boolean;
|
|
22
|
+
private numericValuesIn;
|
|
23
|
+
private prepare;
|
|
24
|
+
effectsFor(row: number, col: number, value: number | string | boolean | Date | null): CellEffect | null;
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CellStyle, Font, HAlign } from '../model/types';
|
|
2
|
+
/** 行高系数(字号 → 行盒高度)。渲染与自动行高测量共用,保证算高=占高。 */
|
|
3
|
+
export declare const LINE_HEIGHT_FACTOR = 1.18;
|
|
4
|
+
/** 单元格文本左右/上下内边距(px @ zoom=1) */
|
|
5
|
+
export declare const CELL_PADDING = 3;
|
|
6
|
+
export declare function fontToCss(font: Font, zoom?: number): string;
|
|
7
|
+
export declare function measureWidth(ctx: CanvasRenderingContext2D, text: string, fontCss: string): number;
|
|
8
|
+
/** 默认对齐: 文本左对齐、数字右对齐(general 语义) */
|
|
9
|
+
export declare function resolveHAlign(align: HAlign, isNumber: boolean): Exclude<HAlign, 'general'>;
|
|
10
|
+
/** 按可用宽度把文本拆成多行(wrapText) */
|
|
11
|
+
export declare function wrapLines(ctx: CanvasRenderingContext2D, text: string, fontCss: string, maxWidth: number): string[];
|
|
12
|
+
/** shrink-to-fit: 计算能塞进 maxWidth 的缩放比例(只缩不放) */
|
|
13
|
+
export declare function shrinkScale(ctx: CanvasRenderingContext2D, text: string, fontCss: string, maxWidth: number): number;
|
|
14
|
+
export interface TextAppearance {
|
|
15
|
+
fontCss: string;
|
|
16
|
+
color: string;
|
|
17
|
+
underline: boolean;
|
|
18
|
+
strike: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function appearanceOf(style: CellStyle, zoom: number, overrideColor?: string): TextAppearance;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** 预览器外观主题(可由 :theme prop 覆盖)。 */
|
|
2
|
+
export interface ViewerTheme {
|
|
3
|
+
/** 行/列表头背景 */
|
|
4
|
+
headerBg: string;
|
|
5
|
+
/** 选中行/列时表头高亮背景(预留) */
|
|
6
|
+
headerActiveBg: string;
|
|
7
|
+
/** 表头文字色 */
|
|
8
|
+
headerText: string;
|
|
9
|
+
/** 表头边线色 */
|
|
10
|
+
headerLine: string;
|
|
11
|
+
/** 网格线色 */
|
|
12
|
+
gridLine: string;
|
|
13
|
+
/** 选区边框色 */
|
|
14
|
+
selBorder: string;
|
|
15
|
+
/** 多格选区填充色(含透明) */
|
|
16
|
+
selFill: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const DEFAULT_THEME: ViewerTheme;
|
|
19
|
+
export declare function mergeTheme(partial?: Partial<ViewerTheme>): ViewerTheme;
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { CellModel, CellStyleOverride, ImageAnchor, MergeRange, SheetModel, WorkbookModel } from '../model/types';
|
|
2
|
+
import { EditConfig } from '../edit/types';
|
|
3
|
+
import { EditController, EditEventName } from '../edit/edit-controller';
|
|
4
|
+
import { CellValue, SheetToJSONOptions } from '../model/data-access';
|
|
5
|
+
import { CellSnapshot } from '../model/snapshot';
|
|
6
|
+
import { EditorCommitValue, EditorResolver } from '../edit/editor-context';
|
|
7
|
+
import { CanvasRenderer, RendererOptions, ViewState } from '../render/canvas-renderer';
|
|
8
|
+
import { OverlayQuads } from './overlay-manager';
|
|
9
|
+
import { ImageExportOptions, PdfExportOptions, PrintOptions } from '../export/types';
|
|
10
|
+
import { XlsxExportOptions } from '../export/xlsx-writer';
|
|
11
|
+
export type Cell = {
|
|
12
|
+
row: number;
|
|
13
|
+
col: number;
|
|
14
|
+
};
|
|
15
|
+
export interface TooltipState {
|
|
16
|
+
text: string;
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
kind: 'overflow' | 'comment';
|
|
20
|
+
}
|
|
21
|
+
/** 查找状态快照(供壳渲染 FindBar) */
|
|
22
|
+
export interface FindState {
|
|
23
|
+
query: string;
|
|
24
|
+
matchCase: boolean;
|
|
25
|
+
wholeCell: boolean;
|
|
26
|
+
count: number;
|
|
27
|
+
index: number;
|
|
28
|
+
}
|
|
29
|
+
/** 自动筛选下拉浮层(列去重值 + 已选 + 屏幕位置) */
|
|
30
|
+
export interface FilterPopupState {
|
|
31
|
+
col: number;
|
|
32
|
+
values: string[];
|
|
33
|
+
selected: string[];
|
|
34
|
+
x: number;
|
|
35
|
+
y: number;
|
|
36
|
+
/** 该列当前排序方向(用于浮层高亮 ↑/↓);null = 未按此列排序 */
|
|
37
|
+
sortDir: 'asc' | 'desc' | null;
|
|
38
|
+
}
|
|
39
|
+
export interface ViewerControllerEls {
|
|
40
|
+
canvas: HTMLCanvasElement;
|
|
41
|
+
/** 量可视区尺寸用 */
|
|
42
|
+
renderArea: HTMLElement;
|
|
43
|
+
/** 原生滚动容器 */
|
|
44
|
+
scroller: HTMLElement;
|
|
45
|
+
/** 撑开滚动范围的占位元素(控制器直接设其宽高) */
|
|
46
|
+
spacer: HTMLElement;
|
|
47
|
+
/** 叠加层四象限 */
|
|
48
|
+
overlays: OverlayQuads;
|
|
49
|
+
/** 单元格编辑器挂载层(在格 + overlay 之上;E2) */
|
|
50
|
+
editorSlot: HTMLElement;
|
|
51
|
+
}
|
|
52
|
+
export interface ViewerControllerHooks {
|
|
53
|
+
/** renderer 重建时回调,壳据此镜像到响应式(保持现有 renderer.value 读法 + chrome 响应) */
|
|
54
|
+
onRenderer: (renderer: CanvasRenderer | null) => void;
|
|
55
|
+
/** 每次绘制后回调,壳据此 +1 让 overlay slot 重算位置 */
|
|
56
|
+
onRenderTick: () => void;
|
|
57
|
+
/** 选区模型变化(壳据此 +1 让 selection/activeCell/stats 等计算属性重算) */
|
|
58
|
+
onSelectionChange: () => void;
|
|
59
|
+
/** 单击单元格(壳 emit 'cell-click' + 派发插件) */
|
|
60
|
+
onCellClick: (row: number, col: number, text: string) => void;
|
|
61
|
+
/** 双击单元格(壳 emit 'cell-dblclick') */
|
|
62
|
+
onCellDblClick: (row: number, col: number, text: string) => void;
|
|
63
|
+
/** 单击超链接(壳 emit 'hyperlink-click' + 按 openLinks 决定是否 window.open) */
|
|
64
|
+
onHyperlink: (url: string, cell: Cell) => void;
|
|
65
|
+
/** 悬停提示变化(壳渲染 tooltip DOM) */
|
|
66
|
+
onTooltip: (tip: TooltipState | null) => void;
|
|
67
|
+
/** 查找状态变化(壳据此 +1 让 FindBar / 工具栏重算) */
|
|
68
|
+
onFindChange: () => void;
|
|
69
|
+
/** 筛选状态/浮层变化(壳据此 +1 让 FilterPopup / 工具栏重算) */
|
|
70
|
+
onFilterChange: () => void;
|
|
71
|
+
/** 编辑事件(cell-change/edit-start/edit-commit;壳转 emit + 插件派发) */
|
|
72
|
+
onEditEvent: (event: EditEventName, payload: unknown) => void;
|
|
73
|
+
}
|
|
74
|
+
export declare class ViewerController {
|
|
75
|
+
private els;
|
|
76
|
+
private hooks;
|
|
77
|
+
/** 当前渲染器(壳通过 onRenderer 镜像) */
|
|
78
|
+
renderer: CanvasRenderer | null;
|
|
79
|
+
/** 视图状态(滚动/缩放/尺寸);壳与控制器共享同一对象 */
|
|
80
|
+
readonly view: ViewState;
|
|
81
|
+
private overlays;
|
|
82
|
+
private sheet;
|
|
83
|
+
private rafId;
|
|
84
|
+
private contentW;
|
|
85
|
+
private contentH;
|
|
86
|
+
private workbook;
|
|
87
|
+
private activeIndex;
|
|
88
|
+
private rendererOpts;
|
|
89
|
+
/** 下载默认文件名(壳可随 props 更新) */
|
|
90
|
+
fileName: string | undefined;
|
|
91
|
+
/** 原始 .xlsx 字节(壳加载时注入;供高保真 overlay 导出重载原件) */
|
|
92
|
+
private sourceBuffer;
|
|
93
|
+
/** 壳在加载后注入原始字节(供 exportXlsx({fidelity:'overlay'}) 重载原件叠加编辑) */
|
|
94
|
+
setSourceBuffer(buf: ArrayBuffer | null): void;
|
|
95
|
+
private exporter;
|
|
96
|
+
private selAnchor;
|
|
97
|
+
private selActive;
|
|
98
|
+
private selMode;
|
|
99
|
+
private dragMode;
|
|
100
|
+
private resizeTarget;
|
|
101
|
+
private imageDragIdx;
|
|
102
|
+
private imageDragStartRect;
|
|
103
|
+
private imageDragStartMouse;
|
|
104
|
+
private imageDragBefore;
|
|
105
|
+
private resizeStartPos;
|
|
106
|
+
private resizeStartSize;
|
|
107
|
+
private resizeStartInfo;
|
|
108
|
+
private resizeStartModelSize;
|
|
109
|
+
private dragMoved;
|
|
110
|
+
private findQuery;
|
|
111
|
+
private findMatchCase;
|
|
112
|
+
private findWholeCell;
|
|
113
|
+
private findHits;
|
|
114
|
+
private findIndex;
|
|
115
|
+
private filterState;
|
|
116
|
+
private filterOrigHidden;
|
|
117
|
+
private filterPopup;
|
|
118
|
+
private sortCol;
|
|
119
|
+
private sortDir;
|
|
120
|
+
private editCfg;
|
|
121
|
+
/** 编辑底座(命令栈/快照/事件;E1) */
|
|
122
|
+
readonly edit: EditController;
|
|
123
|
+
/** 单元格编辑器宿主(E2) */
|
|
124
|
+
private editorHost;
|
|
125
|
+
/** 按格解析编辑器(壳合并 plugin.editor + prop.editor 后注入;E2) */
|
|
126
|
+
private editorResolver?;
|
|
127
|
+
constructor(els: ViewerControllerEls, hooks: ViewerControllerHooks);
|
|
128
|
+
/** 切表/换簿/主题变化: 清状态,重建渲染器,重置滚动,量尺寸,建叠加层,绘制,按需重跑查找 */
|
|
129
|
+
rebuild(sheet: SheetModel, workbook: WorkbookModel, zoom: number, opts: RendererOptions): void;
|
|
130
|
+
/** 立即绘制(取消挂起的 rAF)。绘制 + 定位叠加层 + 通知 tick。 */
|
|
131
|
+
render(): void;
|
|
132
|
+
/** 合并到下一帧绘制(滚动/拖选高频时,每帧最多一次) */
|
|
133
|
+
scheduleRender(): void;
|
|
134
|
+
/** 量可视区尺寸 */
|
|
135
|
+
measure(): void;
|
|
136
|
+
/** 同步滚动量(壳的 scroll 事件里调) */
|
|
137
|
+
setScroll(scrollX: number, scrollY: number): void;
|
|
138
|
+
/** 缩放: 保持视口中心相对内容的比例,避免跳到左上角 */
|
|
139
|
+
setZoom(zoom: number): void;
|
|
140
|
+
/** 拖拽改列宽(px) */
|
|
141
|
+
setColWidthPx(col: number, px: number): void;
|
|
142
|
+
/** 拖拽改行高(px) */
|
|
143
|
+
setRowHeightPx(row: number, px: number): void;
|
|
144
|
+
/** 双击列边界: 自适应列宽(editable 时入命令栈/发事件/记脏) */
|
|
145
|
+
autoFitColumn(col: number): void;
|
|
146
|
+
/** 双击行边界: 自适应行高(editable 时入命令栈/发事件/记脏) */
|
|
147
|
+
autoFitRow(row: number): void;
|
|
148
|
+
/** 程序化设列宽(px,模型单位/非缩放);editable 时走命令栈(可撤销+发 dim-change+记脏)。 */
|
|
149
|
+
setColumnWidth(col: number, width: number): boolean;
|
|
150
|
+
/** 程序化设行高(px,模型单位/非缩放);editable 时走命令栈。 */
|
|
151
|
+
setRowHeight(row: number, height: number): boolean;
|
|
152
|
+
/** 公式引擎是否已就绪(recalc 开启 + 异步 warm 完成);未开重算恒 false。 */
|
|
153
|
+
isRecalcReady(): boolean;
|
|
154
|
+
/** 当前是否有未保存修改(自加载/还原以来发生过编辑或 resize)。 */
|
|
155
|
+
isDirty(): boolean;
|
|
156
|
+
/** 放弃全部修改,还原到刚加载的原件;返回是否还原(无 baseline → false)。 */
|
|
157
|
+
resetToOriginal(): boolean;
|
|
158
|
+
/** 单元格当前屏幕矩形(render-area 相对) */
|
|
159
|
+
rectOf(row: number, col: number): {
|
|
160
|
+
x: number;
|
|
161
|
+
y: number;
|
|
162
|
+
w: number;
|
|
163
|
+
h: number;
|
|
164
|
+
} | null;
|
|
165
|
+
/** 区域当前屏幕矩形(左上到右下并集) */
|
|
166
|
+
rectOfRange(range: MergeRange): {
|
|
167
|
+
x: number;
|
|
168
|
+
y: number;
|
|
169
|
+
w: number;
|
|
170
|
+
h: number;
|
|
171
|
+
} | null;
|
|
172
|
+
dispose(): void;
|
|
173
|
+
/** 内容总尺寸变化 → 量 + 直接撑 spacer(滚动范围由它决定) */
|
|
174
|
+
refreshContentSize(): void;
|
|
175
|
+
/** 当前选区(随 mode 解析为单元格/整行/整列范围,含合并单元格扩展) */
|
|
176
|
+
getSelection(): MergeRange | null;
|
|
177
|
+
/** 活动单元格(选区的"焦点"角) */
|
|
178
|
+
getActiveCell(): Cell | null;
|
|
179
|
+
/** 清空选区 */
|
|
180
|
+
clearSelection(): void;
|
|
181
|
+
/** 全选 */
|
|
182
|
+
selectAll(): void;
|
|
183
|
+
/** 选中单个单元格并滚动到视图(查找定位用);range 模式,anchor=active */
|
|
184
|
+
selectCell(row: number, col: number): void;
|
|
185
|
+
/** 命令式设选区(anchor=左上, active=右下) */
|
|
186
|
+
setSelectionRange(range: MergeRange): void;
|
|
187
|
+
private setCell;
|
|
188
|
+
private setRows;
|
|
189
|
+
private setCols;
|
|
190
|
+
private localXY;
|
|
191
|
+
private hitRegion;
|
|
192
|
+
private nearColBorder;
|
|
193
|
+
private nearRowBorder;
|
|
194
|
+
onMouseDown(e: MouseEvent): void;
|
|
195
|
+
onMouseMove(e: MouseEvent): void;
|
|
196
|
+
onMouseUp(e: MouseEvent): void;
|
|
197
|
+
/** 命中最上层浮动图(editable;p 为 render-area 坐标含表头);返回 index 或 -1。 */
|
|
198
|
+
private imageHitAt;
|
|
199
|
+
/** 拖拽起始:editable 时捕获 baseline + 起始维度信息(供 undo / dim-change)。 */
|
|
200
|
+
private beginResizeRecord;
|
|
201
|
+
/** 拖拽结束:模型已被 renderer 改完,补登一条 undo 项 + 发 dim-change。 */
|
|
202
|
+
private endResizeRecord;
|
|
203
|
+
onMouseLeave(): void;
|
|
204
|
+
private updateHover;
|
|
205
|
+
onDblClick(e: MouseEvent): void;
|
|
206
|
+
private pageRows;
|
|
207
|
+
onKeyDown(e: KeyboardEvent): void;
|
|
208
|
+
private scrollActiveIntoView;
|
|
209
|
+
copySelection(): Promise<void>;
|
|
210
|
+
/** 查找状态快照(壳渲染 FindBar) */
|
|
211
|
+
getFindState(): FindState;
|
|
212
|
+
setFindQuery(q: string): void;
|
|
213
|
+
setFindMatchCase(b: boolean): void;
|
|
214
|
+
setFindWholeCell(b: boolean): void;
|
|
215
|
+
/** 重算命中并应用(query/选项变化时) */
|
|
216
|
+
private recomputeFind;
|
|
217
|
+
/** 把当前命中应用到渲染器 + 移动选区/滚动到视图 */
|
|
218
|
+
private applyFind;
|
|
219
|
+
findNext(): void;
|
|
220
|
+
findPrev(): void;
|
|
221
|
+
/** 关闭查找: 清 query + 命中(保留 matchCase/wholeCell 选项),清除高亮 */
|
|
222
|
+
clearFind(): void;
|
|
223
|
+
/** 当前是否有列处于筛选中(工具栏「清除筛选」启用判断) */
|
|
224
|
+
hasFilters(): boolean;
|
|
225
|
+
/** 当前筛选浮层(壳渲染 FilterPopup) */
|
|
226
|
+
getFilterPopup(): FilterPopupState | null;
|
|
227
|
+
/** 筛选数据区底行: 正常用 af.bottom;若 af 只含表头(bottom===top)则延伸到数据末行 */
|
|
228
|
+
private filterDataBottom;
|
|
229
|
+
/** 某列(自动筛选数据区)的去重值,数值/中文自然排序 */
|
|
230
|
+
private distinctColumnValues;
|
|
231
|
+
/** 重算筛选导致的隐藏行并应用到模型(行隐藏机制 → 几何归零) */
|
|
232
|
+
private applyFilters;
|
|
233
|
+
/** 点中下拉按钮 / 命令式: 打开某列筛选浮层(算去重值 + 已选 + 屏幕位置) */
|
|
234
|
+
openFilterPopup(col: number): void;
|
|
235
|
+
closeFilterPopup(): void;
|
|
236
|
+
/** 浮层「确定」: 勾选值落筛选态(全选=取消该列;子集=保留;空集=全隐藏)。 */
|
|
237
|
+
applyFilterSelection(checked: string[]): void;
|
|
238
|
+
/** 浮层「清除」: 取消该列筛选 */
|
|
239
|
+
clearFilterColumn(): void;
|
|
240
|
+
/** 清除当前表全部筛选 */
|
|
241
|
+
clearAllFilters(): void;
|
|
242
|
+
/**
|
|
243
|
+
* 离开某表 / 取消自动筛选: 恢复被筛选隐藏的行,清空筛选态。
|
|
244
|
+
* 传入要恢复的 sheet(切表时是"旧表",取消筛选时是当前表)。
|
|
245
|
+
*/
|
|
246
|
+
resetFilter(sheet: SheetModel | null | undefined): void;
|
|
247
|
+
/** 换工作簿: 仅清筛选态(旧 sheet 已废,不需恢复行) */
|
|
248
|
+
clearFilterState(): void;
|
|
249
|
+
/** 工具栏「筛选」: 切换自动筛选。无则按选区(或整张已用区)新建,使下拉按钮出现。 */
|
|
250
|
+
toggleAutoFilter(): void;
|
|
251
|
+
/** 当前排序状态(壳可读以显示指示) */
|
|
252
|
+
getSortState(): {
|
|
253
|
+
col: number;
|
|
254
|
+
dir: 'asc' | 'desc' | null;
|
|
255
|
+
};
|
|
256
|
+
/**
|
|
257
|
+
* 按某列对自动筛选数据区排序(只读视图重排:移动行内容 + 行高,不改文件)。
|
|
258
|
+
* 合并区与数据区相交则拒绝(与 Excel 一致)。排序前会清除该表筛选,避免行索引快照错位。
|
|
259
|
+
*/
|
|
260
|
+
sortColumn(col: number, dir: 'asc' | 'desc'): void;
|
|
261
|
+
/** 设置编辑配置(默认只读;壳在挂载 + props 变化时调) */
|
|
262
|
+
setEditConfig(cfg: EditConfig): void;
|
|
263
|
+
/** 该格当前是否可编辑(综合 editable + readOnlyRanges + cellReadOnly) */
|
|
264
|
+
isCellEditable(row: number, col: number): boolean;
|
|
265
|
+
editCell(row: number, col: number, value: CellValue): boolean;
|
|
266
|
+
editRange(range: MergeRange, values: CellValue[][]): boolean;
|
|
267
|
+
clearRange(range: MergeRange): boolean;
|
|
268
|
+
/** 给区域套样式覆盖(E5;粗体/对齐/填充等);editable 时走命令栈(可撤销 + 发 cell-change + 记脏) */
|
|
269
|
+
setStyle(range: MergeRange, patch: CellStyleOverride): boolean;
|
|
270
|
+
/** 读当前表全部图片锚点(克隆)。 */
|
|
271
|
+
getImages(): ImageAnchor[];
|
|
272
|
+
/** 加一张图(无 src 但有 bytes+mime 时自动生成 blob url);返回插入索引(失败 -1)。 */
|
|
273
|
+
addImage(anchor: ImageAnchor): number;
|
|
274
|
+
/** 删一张图。 */
|
|
275
|
+
removeImage(index: number): boolean;
|
|
276
|
+
/** 移动图片(屏幕像素增量);editable 时入命令栈 + 发 image-change。 */
|
|
277
|
+
moveImage(index: number, dxPx: number, dyPx: number): boolean;
|
|
278
|
+
/** 缩放图片(目标屏幕像素宽高);editable 时入命令栈 + 发 image-change。 */
|
|
279
|
+
resizeImage(index: number, widthPx: number, heightPx: number): boolean;
|
|
280
|
+
/** 在 at 处插入 count 行(原 at 行及之后下移)。 */
|
|
281
|
+
insertRows(at: number, count?: number): boolean;
|
|
282
|
+
/** 删除 [at, at+count) 行(与合并相交则警告,相交合并被移除)。 */
|
|
283
|
+
deleteRows(at: number, count?: number): boolean;
|
|
284
|
+
/** 在 at 处插入 count 列。 */
|
|
285
|
+
insertCols(at: number, count?: number): boolean;
|
|
286
|
+
/** 删除 [at, at+count) 列(与合并相交则警告)。 */
|
|
287
|
+
deleteCols(at: number, count?: number): boolean;
|
|
288
|
+
/** 移动/缩放公共路径:算当前矩形 → 变换 → setImageRect → 重定位 → 补登命令。 */
|
|
289
|
+
private editImageRect;
|
|
290
|
+
undo(): void;
|
|
291
|
+
redo(): void;
|
|
292
|
+
canUndo(): boolean;
|
|
293
|
+
canRedo(): boolean;
|
|
294
|
+
getEditingCell(): {
|
|
295
|
+
row: number;
|
|
296
|
+
col: number;
|
|
297
|
+
} | null;
|
|
298
|
+
getCellSnapshot(row: number, col: number): CellSnapshot | null;
|
|
299
|
+
/** 壳注入合并后的编辑器解析器(plugin.editor + prop.editor) */
|
|
300
|
+
setEditorResolver(fn?: EditorResolver): void;
|
|
301
|
+
/**
|
|
302
|
+
* 进入编辑:解析编辑器工厂(无自定义则用内置文本编辑器)→ 挂载。只读则不进入。
|
|
303
|
+
* initialText 为打字进入时的起始字符。返回是否进入。
|
|
304
|
+
*/
|
|
305
|
+
beginEdit(row: number, col: number, initialText?: string): boolean;
|
|
306
|
+
/**
|
|
307
|
+
* 提交当前编辑(取值 → 命令栈 → 卸编辑器)。value 可为裸值或 {value,style}(样式 E5 起生效)。
|
|
308
|
+
* move 指示提交后活动格移动(Enter→down / Tab→right)。
|
|
309
|
+
*/
|
|
310
|
+
commitEdit(value: EditorCommitValue, move?: 'down' | 'right'): void;
|
|
311
|
+
/** 取消当前编辑(不改模型) */
|
|
312
|
+
cancelEdit(): void;
|
|
313
|
+
/** 当前是否有活动编辑器 */
|
|
314
|
+
isEditing(): boolean;
|
|
315
|
+
exportImage(opts?: ImageExportOptions): Promise<Blob>;
|
|
316
|
+
downloadImage(opts?: ImageExportOptions): Promise<void>;
|
|
317
|
+
exportPdf(opts?: PdfExportOptions): Promise<Blob>;
|
|
318
|
+
downloadPdf(opts?: PdfExportOptions): Promise<void>;
|
|
319
|
+
print(opts?: PrintOptions): Promise<void>;
|
|
320
|
+
exportXlsx(opts?: XlsxExportOptions): Promise<Blob>;
|
|
321
|
+
downloadXlsx(opts?: XlsxExportOptions): Promise<void>;
|
|
322
|
+
exportJson(opts?: SheetToJSONOptions): string;
|
|
323
|
+
downloadJson(opts?: SheetToJSONOptions): void;
|
|
324
|
+
exportCsv(opts?: {
|
|
325
|
+
target?: number;
|
|
326
|
+
format?: boolean;
|
|
327
|
+
}): string;
|
|
328
|
+
downloadCsv(opts?: {
|
|
329
|
+
target?: number;
|
|
330
|
+
format?: boolean;
|
|
331
|
+
}): void;
|
|
332
|
+
}
|
|
333
|
+
/** 排序用:空值判定(null / 空串 / undefined) */
|
|
334
|
+
export declare function isBlankValue(v: CellModel['raw']): boolean;
|
|
335
|
+
/**
|
|
336
|
+
* 排序用:非空值比较(升序基准,返回 -1/0/1)。
|
|
337
|
+
* 类型序:数字/日期 < 文本 < 布尔;同类型内数值比大小、文本按自然顺序(中文/数字混排)。
|
|
338
|
+
*/
|
|
339
|
+
export declare function compareCellValues(a: CellModel['raw'], b: CellModel['raw']): number;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SheetModel } from '../model/types';
|
|
2
|
+
import { CanvasRenderer, ViewState } from '../render/canvas-renderer';
|
|
3
|
+
/** 冻结四象限容器: 主区 / 冻结行 / 冻结列 / 冻结角 */
|
|
4
|
+
export interface OverlayQuads {
|
|
5
|
+
main: HTMLElement;
|
|
6
|
+
frow: HTMLElement;
|
|
7
|
+
fcol: HTMLElement;
|
|
8
|
+
corner: HTMLElement;
|
|
9
|
+
}
|
|
10
|
+
export declare class OverlayManager {
|
|
11
|
+
private quads;
|
|
12
|
+
private chartInstances;
|
|
13
|
+
private imageEls;
|
|
14
|
+
private chartPlaceholders;
|
|
15
|
+
private shapeEls;
|
|
16
|
+
/** 防止异步加载 echarts 期间已切表/重建: build 自增,await 后 token 变了就放弃 */
|
|
17
|
+
private buildToken;
|
|
18
|
+
constructor(quads: OverlayQuads);
|
|
19
|
+
private container;
|
|
20
|
+
/** 锚点落在哪个象限(冻结行/列内的钉住,其余随滚动) */
|
|
21
|
+
private quadrantOf;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
/** 重建该表全部叠加层(先销毁再挂载),末尾定位一次 */
|
|
24
|
+
build(sheet: SheetModel, renderer: CanvasRenderer, view: ViewState): Promise<void>;
|
|
25
|
+
/** 按当前视图(滚动/缩放)重新定位四象限容器与各叠加层 */
|
|
26
|
+
position(sheet: SheetModel, renderer: CanvasRenderer, view: ViewState): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExcelPlugin, OverlayContext } from '../plugin';
|
|
2
|
+
export declare class PluginOverlayHost {
|
|
3
|
+
private container;
|
|
4
|
+
constructor(container: HTMLElement);
|
|
5
|
+
/** 重渲所有插件的 overlay:依次调 overlay(ctx),把返回的 DOM 节点替换进容器。 */
|
|
6
|
+
render(plugins: readonly ExcelPlugin[], ctx: OverlayContext): void;
|
|
7
|
+
dispose(): void;
|
|
8
|
+
}
|
package/dist/core.d.ts
ADDED