@k-table/sheet-canvas 0.0.1 → 0.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/dist/index.cjs +1 -0
- package/dist/index.d.cts +1651 -0
- package/dist/index.d.ts +1651 -0
- package/dist/index.js +1 -0
- package/package.json +50 -9
- package/README.md +0 -5
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,1651 @@
|
|
|
1
|
+
import * as _k_table_sheet_core from '@k-table/sheet-core';
|
|
2
|
+
import { TextMeasurer, EmbedBoxPt, EmbedAnchorRect, WorkbookEmbedDef, ChartEmbedDef, SelectionRect, CellBindingMeta, FieldDataCtx, WorkbookScripts, EmbedInstanceState, GridLayoutMode, TemplateWorkbookState, ExcelImportIntermediateV1, ExcelImportOptions, EmbedPrintContext, AssetEmbedDef } from '@k-table/sheet-core';
|
|
3
|
+
export { FillExtension, computeFillPreviewSelection, detectFillExtension, lockFillAxis } from '@k-table/sheet-core';
|
|
4
|
+
import * as _k_table_sheet_core_sheet_template_model from '@k-table/sheet-core/sheet-template-model';
|
|
5
|
+
import { SheetTemplateState, BaseTemplateCellBinding, TextRun, CellStyle, TextRunStyle, CellData, MergeRange, BorderStyle, BorderLinePattern, TextAlign, PageSettings } from '@k-table/sheet-core/sheet-template-model';
|
|
6
|
+
import * as react from 'react';
|
|
7
|
+
import { RefObject, ReactNode } from 'react';
|
|
8
|
+
import * as exceljs from 'exceljs';
|
|
9
|
+
import { jsPDF } from 'jspdf';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 浏览器 Canvas 2D 文本测量适配器(实现 core 的 TextMeasurer 端口)。
|
|
13
|
+
* core 的换行/shrink 纯算法通过注入本适配器完成实际像素测量。
|
|
14
|
+
*/
|
|
15
|
+
declare function ctxTextMeasurer(ctx: CanvasRenderingContext2D): TextMeasurer;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 模板引擎外围 UI(工具栏/公式栏/页签/Shadow 内衬等,**不含**画布像素绘制与单元格色值域)。
|
|
19
|
+
* 随根 ConfigProvider、Showcase 明暗与 token 变化;`fallback` 仅补兼容。
|
|
20
|
+
* 全站自建布局还可使用 `.kt-page-design-token-root` 上的 `--kt-design-*` 别名(见 `antd-mimic-arco.css`)。
|
|
21
|
+
*/
|
|
22
|
+
declare const sheetChrome: {
|
|
23
|
+
readonly bg: "var(--ant-color-bg-container, #ffffff)";
|
|
24
|
+
readonly bgElevated: "var(--ant-color-bg-elevated, #ffffff)";
|
|
25
|
+
readonly bgLayout: "var(--ant-color-bg-layout, #f5f5f5)";
|
|
26
|
+
/** 与公式栏、次级条带 */
|
|
27
|
+
readonly bgSubtle: "var(--ant-color-fill-quaternary, #fafafa)";
|
|
28
|
+
readonly border: "var(--ant-color-border, #d9d9d9)";
|
|
29
|
+
readonly text: "var(--ant-color-text, rgba(0,0,0,0.88))";
|
|
30
|
+
readonly textSecondary: "var(--ant-color-text-secondary, rgba(0,0,0,0.65))";
|
|
31
|
+
readonly textTertiary: "var(--ant-color-text-tertiary, rgba(0,0,0,0.45))";
|
|
32
|
+
/** 表格外围滚动区(与画布区相邻的“衬垫”色,非格内白底) */
|
|
33
|
+
readonly fillScroll: "var(--ant-color-fill-tertiary, #e8e8e8)";
|
|
34
|
+
/** 浮层阴影,明暗下均可用 */
|
|
35
|
+
readonly shadowPopover: "0 3px 12px rgba(0,0,0,0.12)";
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 画布像素绘制色板。
|
|
40
|
+
* 默认是纸面 WYSIWYG 浅色;宿主可通过 paint 入参覆盖铬层(标尺 / 选区),
|
|
41
|
+
* 数据格应保持浅色纸,不跟全站暗色。
|
|
42
|
+
*/
|
|
43
|
+
type SheetPaintPalette = {
|
|
44
|
+
headerBg: string;
|
|
45
|
+
headerGrid: string;
|
|
46
|
+
headerText: string;
|
|
47
|
+
headerHint: string;
|
|
48
|
+
headerSelBg: string;
|
|
49
|
+
dataBg: string;
|
|
50
|
+
dataGrid: string;
|
|
51
|
+
lockedBg: string;
|
|
52
|
+
selFill: string;
|
|
53
|
+
selStroke: string;
|
|
54
|
+
activeOutline: string;
|
|
55
|
+
activeCellBg: string;
|
|
56
|
+
handleStroke: string;
|
|
57
|
+
guideStroke: string;
|
|
58
|
+
};
|
|
59
|
+
declare const DEFAULT_SHEET_PAINT_PALETTE: SheetPaintPalette;
|
|
60
|
+
declare function resolveSheetPaintPalette(over?: Partial<SheetPaintPalette>): SheetPaintPalette;
|
|
61
|
+
declare const SHEET_GRID_LINE_HEADER: string;
|
|
62
|
+
declare const SHEET_GRID_LINE_DATA: string;
|
|
63
|
+
declare const SHEET_HEADER_BG: string;
|
|
64
|
+
declare const SHEET_HEADER_SEL_BG: string;
|
|
65
|
+
declare const SHEET_DATA_BG: string;
|
|
66
|
+
/** 实例白名单外锁定格,与拼接虚化带数据区一致 */
|
|
67
|
+
declare const SHEET_INSTANCE_FILL_LOCKED_BG: string;
|
|
68
|
+
declare const SHEET_SEL_FILL: string;
|
|
69
|
+
declare const SHEET_SEL_STROKE: string;
|
|
70
|
+
/** 活动格内圈,与选区外框同系蓝色 */
|
|
71
|
+
declare const SHEET_ACTIVE_OUTLINE: string;
|
|
72
|
+
declare const SHEET_ACTIVE_CELL_BG: string;
|
|
73
|
+
/** 行号/列标选中强调线宽(px),与网格同粗避免双线观感 */
|
|
74
|
+
declare const SHEET_HEADER_SEL_ACCENT_PX = 1;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Shadow DOM 内最小样式,减轻 Tailwind/Antd 对 input/canvas 的影响。
|
|
78
|
+
* 文本与衬垫色用 token 变量,随主题切换;**画布格线绘制**在 TS 中仍为固定浅色(纸面语义)。
|
|
79
|
+
* `.sheet-editor` 保持白底/深字,与单元格 WYSIWYG 一致,不随全站暗色改为黑底。
|
|
80
|
+
*/
|
|
81
|
+
declare const SHEET_SHADOW_STYLES: string;
|
|
82
|
+
|
|
83
|
+
/** 嵌入相对单元格边框的内边距(屏显 px,约 1.5pt) */
|
|
84
|
+
declare const EMBED_CELL_INSET_CSS_PX = 2;
|
|
85
|
+
/** 贴图 box 相对锚点格左上角的默认内边距(pt) */
|
|
86
|
+
declare const EMBED_CELL_INSET_PT = 2;
|
|
87
|
+
type EmbedOverlayBox = {
|
|
88
|
+
left: number;
|
|
89
|
+
top: number;
|
|
90
|
+
width: number;
|
|
91
|
+
height: number;
|
|
92
|
+
};
|
|
93
|
+
declare function insetOverlayBox(box: EmbedOverlayBox, insetPx?: number): EmbedOverlayBox;
|
|
94
|
+
/** 锚区矩形 → overlay 像素盒(与 geomSheet / cellToOffset 一致) */
|
|
95
|
+
declare function chartSpanOverlayBox(layoutSheet: SheetTemplateState, origin: {
|
|
96
|
+
left: number;
|
|
97
|
+
top: number;
|
|
98
|
+
}, r1: number, c1: number, r2: number, c2: number, viewZoom: number): EmbedOverlayBox;
|
|
99
|
+
/** 单格锚点 + pt box → overlay 像素盒(含内边距) */
|
|
100
|
+
declare function assetBoxOverlayBox(origin: {
|
|
101
|
+
left: number;
|
|
102
|
+
top: number;
|
|
103
|
+
}, box: EmbedBoxPt): EmbedOverlayBox;
|
|
104
|
+
/** 打印/栅格:锚区矩形像素尺寸(含内边距) */
|
|
105
|
+
declare function chartSpanPrintRect(sheet: SheetTemplateState, r1: number, c1: number, r2: number, c2: number): {
|
|
106
|
+
x: number;
|
|
107
|
+
y: number;
|
|
108
|
+
width: number;
|
|
109
|
+
height: number;
|
|
110
|
+
} | null;
|
|
111
|
+
declare function assetBoxPrintRect(sheet: SheetTemplateState, r: number, c: number, box: EmbedBoxPt): {
|
|
112
|
+
x: number;
|
|
113
|
+
y: number;
|
|
114
|
+
width: number;
|
|
115
|
+
height: number;
|
|
116
|
+
} | null;
|
|
117
|
+
|
|
118
|
+
type ResolvedEmbedRect = {
|
|
119
|
+
source: "embedAnchor" | "fallback";
|
|
120
|
+
x: number;
|
|
121
|
+
y: number;
|
|
122
|
+
width: number;
|
|
123
|
+
height: number;
|
|
124
|
+
};
|
|
125
|
+
/** 扫描 sheet 上 embedAnchor 绑定,收集同一 embedId 的格并集 */
|
|
126
|
+
declare function collectEmbedAnchorRect(sheet: SheetTemplateState, embedId: string, sheetId: string): EmbedAnchorRect | null;
|
|
127
|
+
declare function resolveChartLayoutRect(sheet: SheetTemplateState, chart: ChartEmbedDef): ResolvedEmbedRect | null;
|
|
128
|
+
declare function resolveChartPrintRect(sheet: SheetTemplateState, chart: ChartEmbedDef): {
|
|
129
|
+
x: number;
|
|
130
|
+
y: number;
|
|
131
|
+
width: number;
|
|
132
|
+
height: number;
|
|
133
|
+
} | null;
|
|
134
|
+
declare function listEmbedAnchorBindings(sheet: SheetTemplateState, embedId: string): Array<{
|
|
135
|
+
r: number;
|
|
136
|
+
c: number;
|
|
137
|
+
role?: BaseTemplateCellBinding["embedRole"];
|
|
138
|
+
}>;
|
|
139
|
+
declare function embedDisplayLabel(e: WorkbookEmbedDef): string;
|
|
140
|
+
|
|
141
|
+
/** 嵌入 overlay 布局端口:由宿主(SheetCanvasInner)注入坐标,canvas 组件不依赖 React Context。 */
|
|
142
|
+
type EmbedCellOffset = {
|
|
143
|
+
left: number;
|
|
144
|
+
top: number;
|
|
145
|
+
};
|
|
146
|
+
type EmbedOverlayLayoutPort = {
|
|
147
|
+
/** 锚点格左上相对画布 overlay 层的 CSS 像素坐标(已含 zoom / scroll) */
|
|
148
|
+
cellToOffset: (r: number, c: number) => EmbedCellOffset | null;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
declare function joinRuns(runs: TextRun[]): string;
|
|
152
|
+
declare function mergeRunStyle(a: TextRunStyle | undefined, b: TextRunStyle | undefined): TextRunStyle | undefined;
|
|
153
|
+
/** 合并相邻且样式相同的段 */
|
|
154
|
+
declare function normalizeRuns(runs: TextRun[]): TextRun[];
|
|
155
|
+
/** 将 runs 拆成多行(按 \\n),用于画布逐行绘制 */
|
|
156
|
+
declare function splitRunsIntoLines(runs: TextRun[]): TextRun[][];
|
|
157
|
+
/**
|
|
158
|
+
* 在已有「按 \\n 拆好的行」基础上,按可视宽度再折行(用于 wrapText)。
|
|
159
|
+
*/
|
|
160
|
+
declare function wrapRunsLinesToMaxWidth(lines: TextRun[][], maxContentWidth: number, measureRunWidth: (run: TextRun) => number): TextRun[][];
|
|
161
|
+
/** 用于 contenteditable 与 Excel HTML 导出 */
|
|
162
|
+
declare function runsToEditableHtml(runs: TextRun[]): string;
|
|
163
|
+
/** 从单元格根节点解析富文本(Excel 常含 sup/sub/b/span;相邻块级子元素之间补换行) */
|
|
164
|
+
declare function runsFromCellContentRoot(root: Element): TextRun[];
|
|
165
|
+
declare function editableHtmlToRuns(html: string): TextRun[];
|
|
166
|
+
declare function hasMeaningfulRuns(runs: TextRun[] | undefined): boolean;
|
|
167
|
+
/** 从 CellData 得到绘制用 runs(含旧版整格上下标;分段与整格默认样式合并) */
|
|
168
|
+
declare function getDisplayRuns(data: CellData | undefined): TextRun[];
|
|
169
|
+
/**
|
|
170
|
+
* 画布/导出用的整格字号基准(pt),用于 `baseRefPx` 与 `measureRun` 中 `runRefPx * fontPx / baseRefPx`。
|
|
171
|
+
* 若 `style.fontSize` 未写但合并后的 runs 里已有字号(常见于仅段落样式、仅框线、或历史 JSON),
|
|
172
|
+
* 仍用默认 10pt 作 base 会把大于默认的字按比例压小。
|
|
173
|
+
*/
|
|
174
|
+
declare function effectiveDefaultFontPtForPaint(cellStyle: CellStyle | undefined, displayRuns: TextRun[]): number;
|
|
175
|
+
declare function cellDataFromEdit(valuePlain: string, runs: TextRun[], baseStyle: CellStyle | undefined): CellData;
|
|
176
|
+
/** 保存时:若 runs 只有分段样式,去掉 style 中整格 script */
|
|
177
|
+
declare function finalizeCellDataForSave(data: CellData): CellData;
|
|
178
|
+
declare function mergeScriptIntoRuns(runs: TextRun[], patch: Partial<Pick<CellStyle, 'superscript' | 'subscript'>>): TextRun[];
|
|
179
|
+
/**
|
|
180
|
+
* 对 [start,end) 内每个字符合并样式;patch 中值为 `undefined` 表示清除该键(与 CellStyle 约定一致)。
|
|
181
|
+
* 上/下标互斥:若 patch 将某一侧设为 true,会清除另一侧。
|
|
182
|
+
*/
|
|
183
|
+
declare function applyTextRunStylePatchToSubstring(runs: TextRun[], start: number, end: number, patch: Partial<TextRunStyle>): TextRun[];
|
|
184
|
+
declare function applyScriptToRunSubstring(runs: TextRun[], start: number, end: number, patch: Partial<Pick<CellStyle, 'superscript' | 'subscript'>>): TextRun[];
|
|
185
|
+
declare function normalizeCellDataValue(data: CellData): CellData;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* 画布渲染用合并区索引(函数式,MergeRange 版)。
|
|
189
|
+
* 注意与 @k-table/sheet-core 的 class MergeIndex(MergeRect 版)语义/API 不同,各自服务不同调用方。
|
|
190
|
+
*/
|
|
191
|
+
declare function normalizeMerge(m: MergeRange): MergeRange;
|
|
192
|
+
declare function mergesOverlap(a: MergeRange, b: MergeRange): boolean;
|
|
193
|
+
interface MergeIndex {
|
|
194
|
+
master: Map<string, {
|
|
195
|
+
mr: number;
|
|
196
|
+
mc: number;
|
|
197
|
+
}>;
|
|
198
|
+
masterRect: Map<string, MergeRange>;
|
|
199
|
+
}
|
|
200
|
+
declare function buildMergeIndex(merges: MergeRange[] | null | undefined): MergeIndex;
|
|
201
|
+
declare function getMaster(sidx: MergeIndex, r: number, c: number): {
|
|
202
|
+
mr: number;
|
|
203
|
+
mc: number;
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* 选区(已规范化坐标)与某条合并记录矩形完全一致,用于工具栏在「整框选合并块」时提供「取消合并」。
|
|
207
|
+
*/
|
|
208
|
+
declare function selectionBoundsMatchEntireMerge(merges: MergeRange[] | null | undefined, r1: number, c1: number, r2: number, c2: number): boolean;
|
|
209
|
+
|
|
210
|
+
declare function setCell(sheet: SheetTemplateState, r: number, c: number, data: CellData): SheetTemplateState;
|
|
211
|
+
declare function expandMergeSelectionRect(merges: MergeRange[], sel: SelectionRect): SelectionRect;
|
|
212
|
+
type ApplyMergeSelectionOptions = {
|
|
213
|
+
expandOverlapping?: boolean;
|
|
214
|
+
};
|
|
215
|
+
declare function applyMergeSelection(sheet: SheetTemplateState, sel: SelectionRect, options?: ApplyMergeSelectionOptions): SheetTemplateState;
|
|
216
|
+
declare function insertRow(sheet: SheetTemplateState, at: number): SheetTemplateState;
|
|
217
|
+
declare function insertCol(sheet: SheetTemplateState, at: number): SheetTemplateState;
|
|
218
|
+
declare function ensureMinDimensions(sheet: SheetTemplateState, lastRowIndex: number, lastColIndex: number): SheetTemplateState;
|
|
219
|
+
|
|
220
|
+
type FillPattern = {
|
|
221
|
+
cells: {
|
|
222
|
+
value: string;
|
|
223
|
+
style?: CellStyle;
|
|
224
|
+
runs?: TextRun[];
|
|
225
|
+
}[][];
|
|
226
|
+
/** 相对选区左上角的 0-based 合并矩形(与网格下标一致) */
|
|
227
|
+
merges: MergeRange[];
|
|
228
|
+
};
|
|
229
|
+
/** 从选区提取填充图案(与复制到剪贴板的网格语义一致) */
|
|
230
|
+
declare function extractFillPattern(sheet: SheetTemplateState, mergeIdx: MergeIndex, sel: SelectionRect): FillPattern | null;
|
|
231
|
+
/** 实例录入填充白名单 Port(kt-web shim 注入 table-system 判定与修约) */
|
|
232
|
+
type InstanceFillGuard = {
|
|
233
|
+
sheetId: string;
|
|
234
|
+
sheet: SheetTemplateState;
|
|
235
|
+
isCellFillable: (mr: number, mc: number, mergeIdx: MergeIndex, sheet: SheetTemplateState) => boolean;
|
|
236
|
+
roundPlain: (plain: string, mr: number, mc: number) => string;
|
|
237
|
+
};
|
|
238
|
+
type ApplyFillOptions = {
|
|
239
|
+
/** 强制复制填充,不做序列(对应 Excel Ctrl+拖拽) */
|
|
240
|
+
forceCopy?: boolean;
|
|
241
|
+
/** 实例录入:不写合并/样式、不扩表、仅 instanceFillable 主格改纯文本 */
|
|
242
|
+
instanceFillGuard?: InstanceFillGuard;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* 将选区从 source 扩展到 target 的填充(target 须为 source 的单向延伸矩形)。
|
|
246
|
+
*/
|
|
247
|
+
declare function applyFillToSheet(sheet: SheetTemplateState, sourceSel: SelectionRect, targetSel: SelectionRect, options?: ApplyFillOptions): SheetTemplateState;
|
|
248
|
+
/**
|
|
249
|
+
* 实例录入:在 computeFillPreviewSelection 基础上收缩延伸步数,使延伸带内凡将被写入的格均在白名单内且不越界。
|
|
250
|
+
*/
|
|
251
|
+
declare function computeFillPreviewSelectionInstance(sheet: SheetTemplateState, sourceSel: SelectionRect, axis: 'row' | 'col', hitR: number, hitC: number, guard: InstanceFillGuard, forceCopy?: boolean): SelectionRect;
|
|
252
|
+
|
|
253
|
+
/** 应用内粘贴优先读此 MIME,可还原值与样式 */
|
|
254
|
+
declare const SHEET_CLIPBOARD_MIME = "application/x-tuodong-sheet+json";
|
|
255
|
+
type SheetClipboardFragmentV1 = {
|
|
256
|
+
v: 1;
|
|
257
|
+
cells: {
|
|
258
|
+
value: string;
|
|
259
|
+
style?: CellStyle;
|
|
260
|
+
runs?: TextRun[];
|
|
261
|
+
}[][];
|
|
262
|
+
/** 相对 cells 矩阵左上 (0,0) 的合并区(与选区复制范围一致) */
|
|
263
|
+
merges?: MergeRange[];
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* 稠密网格(0 起坐标)+ 相对 merges → 逻辑行(每行仅主格文本,合并块占一格)。
|
|
267
|
+
*/
|
|
268
|
+
declare function denseGridToLogicalPlainGrid(dense: {
|
|
269
|
+
value: string;
|
|
270
|
+
style?: CellStyle;
|
|
271
|
+
runs?: TextRun[];
|
|
272
|
+
}[][], merges: MergeRange[] | null | undefined): string[][];
|
|
273
|
+
/** 选区 → TSV + HTML 表格 + 应用内 JSON(含样式) */
|
|
274
|
+
declare function selectionToClipboardPayload(sheet: SheetTemplateState, mergeIdx: MergeIndex, sel: SelectionRect): {
|
|
275
|
+
tsv: string;
|
|
276
|
+
html: string;
|
|
277
|
+
appJson: string;
|
|
278
|
+
};
|
|
279
|
+
/**
|
|
280
|
+
* 通过 Clipboard API 写入选区(右键菜单等无原生 copy 事件时使用)。
|
|
281
|
+
* 依次尝试:完整 MIME(含应用内 JSON)→ 仅 plain+html → 仅纯文本。
|
|
282
|
+
*/
|
|
283
|
+
declare function writeSheetClipboardPayload(p: {
|
|
284
|
+
tsv: string;
|
|
285
|
+
html: string;
|
|
286
|
+
appJson: string;
|
|
287
|
+
}): Promise<boolean>;
|
|
288
|
+
/**
|
|
289
|
+
* 将 `clipboard.read()` 得到的条目解析为与原生 `paste` 事件一致的 plain/html/appJson。
|
|
290
|
+
*/
|
|
291
|
+
declare function clipboardItemsToPastePayload(items: ClipboardItem[]): Promise<{
|
|
292
|
+
plain: string;
|
|
293
|
+
html: string;
|
|
294
|
+
appJson: string;
|
|
295
|
+
}>;
|
|
296
|
+
/**
|
|
297
|
+
* 读取系统剪贴板(右键粘贴等)。优先 `read()` 多 MIME,失败则 `readText`。
|
|
298
|
+
*/
|
|
299
|
+
declare function readClipboardForSheetPaste(): Promise<{
|
|
300
|
+
plain: string;
|
|
301
|
+
html: string;
|
|
302
|
+
appJson: string;
|
|
303
|
+
}>;
|
|
304
|
+
declare function selectionToTsv(sheet: SheetTemplateState, mergeIdx: MergeIndex, sel: SelectionRect): string;
|
|
305
|
+
/** 解析 TSV 为二维数组 */
|
|
306
|
+
declare function parseTsvGrid(tsv: string): string[][];
|
|
307
|
+
/** 从 Excel 等复制的 HTML 表格转为 TSV(text/plain 不可用时兜底) */
|
|
308
|
+
declare function htmlTableToTsv(html: string): string;
|
|
309
|
+
declare function splitTsvLine(line: string): string[];
|
|
310
|
+
/** 将富文本网格写入表(1-based 数据坐标);不处理 merges,由调用方再 applyMergeSelection。
|
|
311
|
+
* 粘贴不扩展行列——超出当前网格的部分截断。 */
|
|
312
|
+
declare function applyRichGridToSheet(sheet: SheetTemplateState, startR: number, startC: number, grid: {
|
|
313
|
+
value: string;
|
|
314
|
+
style?: CellStyle;
|
|
315
|
+
runs?: TextRun[];
|
|
316
|
+
}[][]): SheetTemplateState;
|
|
317
|
+
/** 从 HTML 表格解析单元格文本与内联样式(含本应用导出的表格) */
|
|
318
|
+
declare function htmlTableToRichGrid(html: string): {
|
|
319
|
+
value: string;
|
|
320
|
+
style?: CellStyle;
|
|
321
|
+
runs?: TextRun[];
|
|
322
|
+
}[][] | null;
|
|
323
|
+
/**
|
|
324
|
+
* 解析含 colspan/rowspan 的 HTML 表(如 Excel 剪贴板),返回稠密网格与局部合并区。
|
|
325
|
+
* 网格坐标为 0 起始,粘贴时平移到 startR/startC。
|
|
326
|
+
*/
|
|
327
|
+
declare function htmlTableToRichGridWithSpans(html: string): {
|
|
328
|
+
grid: {
|
|
329
|
+
value: string;
|
|
330
|
+
style?: CellStyle;
|
|
331
|
+
runs?: TextRun[];
|
|
332
|
+
}[][];
|
|
333
|
+
merges: MergeRange[];
|
|
334
|
+
} | null;
|
|
335
|
+
/**
|
|
336
|
+
* 粘贴:优先应用内 JSON(值+样式)→ HTML 表格 → 纯文本 TSV
|
|
337
|
+
*/
|
|
338
|
+
declare function pasteClipboardIntoSheet(sheet: SheetTemplateState, startR: number, startC: number, plain: string, html: string, appJson: string): SheetTemplateState;
|
|
339
|
+
declare function pasteTsvAt(sheet: SheetTemplateState, startR: number, startC: number, tsv: string): SheetTemplateState;
|
|
340
|
+
/** 实例录入粘贴白名单 Port(kt-web shim 注入 table-system 判定与修约) */
|
|
341
|
+
type InstancePasteGuard = {
|
|
342
|
+
isCellFillable: (mr: number, mc: number, mergeIdx: MergeIndex, sheet: SheetTemplateState) => boolean;
|
|
343
|
+
roundPlain: (plain: string, mr: number, mc: number) => string;
|
|
344
|
+
};
|
|
345
|
+
/**
|
|
346
|
+
* 实例录入:仅写入纯文本;忽略剪贴板样式;不扩表;跳过非 instanceFillable 格。
|
|
347
|
+
* 源:JSON/HTML WithSpans 用 merges 压成逻辑列;纯 TSV 每列一项。目标:**一律**按合并主格步进(与 Excel 同时给 plain+html 时仍以 plain 为准解析列,避免丢列)。
|
|
348
|
+
*/
|
|
349
|
+
declare function pasteClipboardInstanceValuesOnly(sheet: SheetTemplateState, startR: number, startC: number, plain: string, html: string, appJson: string, guard: InstancePasteGuard): SheetTemplateState;
|
|
350
|
+
|
|
351
|
+
/** #rgb / #rrggbb / rgb() / rgba() → #rrggbb */
|
|
352
|
+
declare function normalizeCssColorToHex(input: string): string | undefined;
|
|
353
|
+
/**
|
|
354
|
+
* 从 CSS 声明串解析为 CellStyle(兼容 Excel / Chrome / Office 剪贴板 HTML)
|
|
355
|
+
*/
|
|
356
|
+
declare function parseSpreadsheetInlineCss(css: string): CellStyle;
|
|
357
|
+
/** 合并单元格样式:后写覆盖先写,override 中为 undefined 的键不覆盖 base */
|
|
358
|
+
declare function mergeCellStylesLoose(base: CellStyle, override: CellStyle): CellStyle;
|
|
359
|
+
/**
|
|
360
|
+
* 从文档内联 `<style>` 提取 `.类名 { 声明 }`(Excel 剪贴板 HTML 常把对齐/框线写在类里)
|
|
361
|
+
*/
|
|
362
|
+
declare function extractClassStyleMapFromDocument(doc: Document): Map<string, string>;
|
|
363
|
+
type PasteCellStyleOptions = {
|
|
364
|
+
/** 由 extractClassStyleMapFromDocument 得到,与 td 上 class 对应 */
|
|
365
|
+
classStyleMap?: Map<string, string>;
|
|
366
|
+
};
|
|
367
|
+
/** Excel 常把对齐写在 align / valign 属性上 */
|
|
368
|
+
declare function applyTdAlignAttrs(el: Element, out: CellStyle): void;
|
|
369
|
+
/**
|
|
370
|
+
* 从粘贴的 td 解析:单元格框线/底纹/对齐 + 分段上下标等(Excel HTML)。
|
|
371
|
+
* `runs` 仅在存在分段样式或多段时返回,否则仅用 `style` 表示整格样式。
|
|
372
|
+
*/
|
|
373
|
+
declare function pasteCellStyleAndRuns(td: Element, opts?: PasteCellStyleOptions): {
|
|
374
|
+
style: CellStyle | undefined;
|
|
375
|
+
runs: TextRun[] | undefined;
|
|
376
|
+
plain: string;
|
|
377
|
+
};
|
|
378
|
+
/** 合并 td 上 style + 子元素 b/strong/i/em 的常见粗斜体 */
|
|
379
|
+
declare function cellStyleFromTableCell(el: Element): CellStyle | undefined;
|
|
380
|
+
|
|
381
|
+
declare function sheetTotalSize(sheet: SheetTemplateState): {
|
|
382
|
+
width: number;
|
|
383
|
+
height: number;
|
|
384
|
+
};
|
|
385
|
+
/** 拼接虚化带:scrollY 为整画布滚动;band 内 sheet 的可见行范围(band 顶在世界坐标 yOffset) */
|
|
386
|
+
declare function visibleRowRangeInBand(sheet: SheetTemplateState, scrollY: number, viewportH: number, yOffset: number): {
|
|
387
|
+
start: number;
|
|
388
|
+
end: number;
|
|
389
|
+
};
|
|
390
|
+
declare function getCellRect(sheet: SheetTemplateState, r: number, c: number): {
|
|
391
|
+
x: number;
|
|
392
|
+
y: number;
|
|
393
|
+
w: number;
|
|
394
|
+
h: number;
|
|
395
|
+
};
|
|
396
|
+
declare function getMergedPixelRect(sheet: SheetTemplateState, sidx: MergeIndex, r: number, c: number): {
|
|
397
|
+
x: number;
|
|
398
|
+
y: number;
|
|
399
|
+
w: number;
|
|
400
|
+
h: number;
|
|
401
|
+
};
|
|
402
|
+
/** 选区像素包围盒:遍历格内坐标,按合并主格取像素矩形并做并集,避免合并块与选区蓝框错位 */
|
|
403
|
+
declare function getSelectionPixelBounds(sheet: SheetTemplateState, sidx: MergeIndex, sel: SelectionRect): {
|
|
404
|
+
x: number;
|
|
405
|
+
y: number;
|
|
406
|
+
w: number;
|
|
407
|
+
h: number;
|
|
408
|
+
};
|
|
409
|
+
/** 将画布内坐标(含滚动偏移前为 sheet 坐标)转为行列 */
|
|
410
|
+
declare function hitTestToCell(sheet: SheetTemplateState, sheetX: number, sheetY: number): {
|
|
411
|
+
r: number;
|
|
412
|
+
c: number;
|
|
413
|
+
} | null;
|
|
414
|
+
declare function columnDividerAtX(sheet: SheetTemplateState, sheetX: number): number | null;
|
|
415
|
+
declare function rowDividerAtY(sheet: SheetTemplateState, sheetY: number): number | null;
|
|
416
|
+
/** 列宽拖拽:仅当光标落在列标行(索引第 0 行)内时返回列边界索引,避免在数据区竖线拖拽误调列宽 */
|
|
417
|
+
declare function columnDividerAtXInHeaderRow(sheet: SheetTemplateState, sheetX: number, sheetY: number): number | null;
|
|
418
|
+
/** 行高拖拽:仅当光标落在行号列(索引第 0 列)内时返回行边界索引,避免在数据区横线拖拽误调行高 */
|
|
419
|
+
declare function rowDividerAtYInHeaderCol(sheet: SheetTemplateState, sheetX: number, sheetY: number): number | null;
|
|
420
|
+
declare function visibleRowRange(sheet: SheetTemplateState, scrollY: number, viewportH: number): {
|
|
421
|
+
start: number;
|
|
422
|
+
end: number;
|
|
423
|
+
};
|
|
424
|
+
declare function visibleColRange(sheet: SheetTemplateState, scrollX: number, viewportW: number): {
|
|
425
|
+
start: number;
|
|
426
|
+
end: number;
|
|
427
|
+
};
|
|
428
|
+
declare function isDataCell(r: number, c: number): boolean;
|
|
429
|
+
declare function isHeaderCorner(r: number, c: number): boolean;
|
|
430
|
+
declare function isColumnHeaderRow(r: number, c: number): boolean;
|
|
431
|
+
declare function isRowHeaderCol(r: number, c: number): boolean;
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* 单像素网格线:每个格子只画「右、下」两边,首行/首列补「顶、左」,
|
|
435
|
+
* 避免相邻两格各 strokeRect 全框导致公共边被画两次、视觉上变粗。
|
|
436
|
+
*
|
|
437
|
+
* 四边统一为单元格矩形 [vx, vy, vx+w, vy+h] 的**内侧网格线**:
|
|
438
|
+
* 竖线 x = vx−0.5 / vx+w−0.5,横线 y = vy−0.5 / vy+h−0.5(与 Excel 像素对齐习惯一致)。
|
|
439
|
+
*/
|
|
440
|
+
declare function strokeUnmergedCellGrid(ctx: CanvasRenderingContext2D, vx: number, vy: number, w: number, h: number, opts: {
|
|
441
|
+
drawTop: boolean;
|
|
442
|
+
drawLeft: boolean;
|
|
443
|
+
}): void;
|
|
444
|
+
/** 合并矩形是否为多格(仅主格键存在矩形且跨越多个格) */
|
|
445
|
+
declare function getMergeRect(sidx: MergeIndex, mr: number, mc: number): MergeRange | undefined;
|
|
446
|
+
/** 行号列标区:右+下+(c===0 时左)+(r===0 时顶),与全角格分离避免叠线 */
|
|
447
|
+
declare function strokeHeaderCellGrid(ctx: CanvasRenderingContext2D, vx: number, vy: number, w: number, h: number, r: number, c: number): void;
|
|
448
|
+
|
|
449
|
+
declare function borderStrokeWidth(style: BorderStyle | undefined): number;
|
|
450
|
+
/** 与 {@link borderStrokeWidth} 最粗线宽一致;若增粗类型须同步改此值 */
|
|
451
|
+
declare const MAX_BORDER_STROKE_WIDTH_PX = 3;
|
|
452
|
+
/**
|
|
453
|
+
* 画布 clip 相对视口向外扩的像素:粗线 stroke 以路径为中心外扩约 width/2,须留在裁剪区内;
|
|
454
|
+
* 与 SheetCanvasInner 中区/虚化带、已用区导出 padding 共用。
|
|
455
|
+
*/
|
|
456
|
+
declare function getGridClipBleedPx(): number;
|
|
457
|
+
type BorderPatternPick = Pick<CellStyle, "borderLinePattern" | "borderTopPattern" | "borderRightPattern" | "borderBottomPattern" | "borderLeftPattern">;
|
|
458
|
+
/** 打印裁剪已用区时传入,与 getUsedDataBounds 一致;最外一圈强制按本格样式画边 */
|
|
459
|
+
type ExportBoundsRowsCols = {
|
|
460
|
+
r1: number;
|
|
461
|
+
c1: number;
|
|
462
|
+
r2: number;
|
|
463
|
+
c2: number;
|
|
464
|
+
};
|
|
465
|
+
/**
|
|
466
|
+
* 在合并/单元格矩形上绘制四边;与相邻格去重,避免两边各画一条导致叠粗。
|
|
467
|
+
*/
|
|
468
|
+
declare function drawCellBorders(ctx: CanvasRenderingContext2D, sheet: SheetTemplateState, mergeIdx: MergeIndex, mr: number, mc: number, vx: number, vy: number, vw: number, vh: number, bt?: BorderStyle, br?: BorderStyle, bb?: BorderStyle, bl?: BorderStyle, borderColor?: string, linePattern?: BorderLinePattern, exportBounds?: ExportBoundsRowsCols, clipOriginSheet?: {
|
|
469
|
+
x: number;
|
|
470
|
+
y: number;
|
|
471
|
+
}, patternStyle?: BorderPatternPick, perSideColors?: {
|
|
472
|
+
top?: string;
|
|
473
|
+
right?: string;
|
|
474
|
+
bottom?: string;
|
|
475
|
+
left?: string;
|
|
476
|
+
}): void;
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* 数据区合并主格:背景、富文本、边框(与 SheetCanvasInner 主路径一致,供虚化带等复用)。
|
|
480
|
+
* 实例填写的「设计占位剥离」由宿主经 resolvePlainText 注入(core 不含 host 绑定语义)。
|
|
481
|
+
*/
|
|
482
|
+
|
|
483
|
+
declare function paintSheetDataCellContent(ctx: CanvasRenderingContext2D, sheet: SheetTemplateState, mergeIdx: MergeIndex, mr: number, mc: number, bx: number, by: number, baseTemplateUseDisplayText?: boolean, hideBoundMainTextWhenSampleOff?: boolean, highlightUnknownBinding?: boolean, underlayColor?: string, instanceFillPaint?: boolean, instanceFillDisplayPlain?: string,
|
|
484
|
+
/** 宿主注入:从 CellData 解析实例展示主文(剥离设计占位);缺省仅取 value。 */
|
|
485
|
+
resolvePlainText?: (cd: CellData | undefined | null) => string): void;
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* 画左上角公式/脚本占位角标。
|
|
489
|
+
* @param logicalR/logicalC 与 tableSystem.cellMeta 键一致的工作表行/列
|
|
490
|
+
* @param cellF 格内 `f` 字段(网格公式如 =A1+B1),回退源
|
|
491
|
+
*/
|
|
492
|
+
declare function paintDesignFormulaOverlayForDataCell(ctx: CanvasRenderingContext2D, bx: number, by: number, boxW: number, boxH: number, metaSheetId: string, logicalR: number, logicalC: number, tableSystemCellMeta: Record<string, unknown> | null, cellF?: string | null): void;
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* 设计态:格内绑定 code / 备注叠画;限制在单元格矩形内,过长省略号截断。
|
|
496
|
+
* host 绑定语义(读 cellMeta 绑定、格式化绑定行/角标码)经 deps 注入,core/canvas 不含 host 字段串规则。
|
|
497
|
+
*/
|
|
498
|
+
|
|
499
|
+
/** 宿主注入:绑定叠画所需的 host 语义。 */
|
|
500
|
+
interface BindingOverlayDeps {
|
|
501
|
+
getBindingMetaForKey: (meta: Record<string, unknown>, ck: string) => CellBindingMeta | null;
|
|
502
|
+
formatBindingLine: (b: BaseTemplateCellBinding) => string;
|
|
503
|
+
formatCodeForOverlayFromMeta: (bm: CellBindingMeta | null) => string;
|
|
504
|
+
}
|
|
505
|
+
declare function paintDesignBindingOverlayForDataCell(ctx: CanvasRenderingContext2D, bx: number, by: number, boxW: number, boxH: number, metaSheetId: string, logicalR: number, logicalC: number, tableSystemCellMeta: Record<string, unknown> | null, cellBinding?: BaseTemplateCellBinding | null, textAlign?: TextAlign, mainLayerUsesBindingDisplayText?: boolean, unknownBinding?: boolean,
|
|
506
|
+
/** 宿主注入的 host 绑定语义;缺省则仅用 cellBinding.key 兜底。 */
|
|
507
|
+
deps?: BindingOverlayDeps): void;
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* 拼接虚化带:仅用于顶/底预览绘制(不参与编辑逻辑),样式与主画布数据区一致。
|
|
511
|
+
*/
|
|
512
|
+
|
|
513
|
+
type PaintVirtualBandBindingOverlay = {
|
|
514
|
+
/** 基础表首张 sheetId,与 base `tableSystem.cellMeta` 键一致 */
|
|
515
|
+
baseSheetId: string;
|
|
516
|
+
/** 与 `sliceWorkbookV3RowRange` 一致:数据区首行对应基础表行号 */
|
|
517
|
+
sourceRowStartInclusive: number;
|
|
518
|
+
tableSystemCellMeta: Record<string, unknown> | null;
|
|
519
|
+
/** 宿主注入的绑定叠画 host 语义(缺省则仅用 cellBinding.key 兜底) */
|
|
520
|
+
deps?: BindingOverlayDeps;
|
|
521
|
+
};
|
|
522
|
+
type PaintVirtualBandOptions = {
|
|
523
|
+
scrollBandWorldY0: number;
|
|
524
|
+
designBindingOverlay?: boolean;
|
|
525
|
+
baseTemplateUseDisplayText?: boolean;
|
|
526
|
+
hideBoundMainTextWhenSampleOff?: boolean;
|
|
527
|
+
bindingOverlay?: PaintVirtualBandBindingOverlay | null;
|
|
528
|
+
};
|
|
529
|
+
declare function paintVirtualSheetBand(ctx: CanvasRenderingContext2D, sheet: SheetTemplateState, sx: number, sy: number, vw: number, vh: number, opts: PaintVirtualBandOptions): void;
|
|
530
|
+
declare function virtualBandWorldHeight(sheet: SheetTemplateState | null | undefined): number;
|
|
531
|
+
|
|
532
|
+
/** 是否视为「占用打印区域」:有文本,或有背景/框线,或显式格式。 */
|
|
533
|
+
declare function isCellUsedForPrintBounds(data: CellData | undefined): boolean;
|
|
534
|
+
/**
|
|
535
|
+
* 数据区 (r,c>=1) 中包含占用格的最小矩形(按合并块整体计入)。全表无占用返回 null。
|
|
536
|
+
*/
|
|
537
|
+
declare function getUsedDataBounds(sheet: SheetTemplateState, mergeIdx: MergeIndex): {
|
|
538
|
+
r1: number;
|
|
539
|
+
c1: number;
|
|
540
|
+
r2: number;
|
|
541
|
+
c2: number;
|
|
542
|
+
} | null;
|
|
543
|
+
/** 已用区在表坐标中的像素包围盒;无占用时返回单格 (1,1) 的矩形 */
|
|
544
|
+
declare function getUsedExportPixelRect(sheet: SheetTemplateState, bounds: {
|
|
545
|
+
r1: number;
|
|
546
|
+
c1: number;
|
|
547
|
+
r2: number;
|
|
548
|
+
c2: number;
|
|
549
|
+
}): {
|
|
550
|
+
x: number;
|
|
551
|
+
y: number;
|
|
552
|
+
width: number;
|
|
553
|
+
height: number;
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
type SheetExportSizeOptions = {
|
|
557
|
+
includeHeaders: boolean;
|
|
558
|
+
/** 仅包含有内容或框线等占用格的最小矩形(打印预览用) */
|
|
559
|
+
clipToUsedRange?: boolean;
|
|
560
|
+
mergeIdx?: MergeIndex;
|
|
561
|
+
};
|
|
562
|
+
type SheetExportOptions = {
|
|
563
|
+
/** 含行号列标;false 时仅数据区 */
|
|
564
|
+
includeHeaders: boolean;
|
|
565
|
+
/**
|
|
566
|
+
* 是否绘制默认淡色网格线。打印预览为 false,仅保留单元格样式里的框线。
|
|
567
|
+
* 默认 true(与编辑器一致的完整网格)。
|
|
568
|
+
*/
|
|
569
|
+
drawDefaultGrid?: boolean;
|
|
570
|
+
/**
|
|
571
|
+
* 已用区裁剪导出时传入(与 getUsedDataBounds 一致),框线在最外一圈按本格绘制,避免邻格去重缺失边线。
|
|
572
|
+
*/
|
|
573
|
+
exportBounds?: ExportBoundsRowsCols;
|
|
574
|
+
/** 与 translate 偏移一致,供顶/左边对齐到可画区像素 */
|
|
575
|
+
clipOriginSheet?: {
|
|
576
|
+
x: number;
|
|
577
|
+
y: number;
|
|
578
|
+
};
|
|
579
|
+
/**
|
|
580
|
+
* true:不绘制单元格 style.bgColor(打印/PDF 去底色;数据区仍为白底)。
|
|
581
|
+
* 默认 false,与编辑/屏幕导出一致。
|
|
582
|
+
*/
|
|
583
|
+
omitCellBackground?: boolean;
|
|
584
|
+
};
|
|
585
|
+
declare function getSheetExportSize(sheet: SheetTemplateState, opts: SheetExportSizeOptions): {
|
|
586
|
+
width: number;
|
|
587
|
+
height: number;
|
|
588
|
+
};
|
|
589
|
+
/**
|
|
590
|
+
* 在已设置尺寸的逻辑坐标系中绘制(1 单元格 = 1 像素与编辑器一致)。
|
|
591
|
+
* 若 `includeHeaders === false`,请先 `ctx.translate(-getCellRect(sheet,1,1).x, -getCellRect(sheet,1,1).y)`。
|
|
592
|
+
*/
|
|
593
|
+
declare function renderSheetExport(ctx: CanvasRenderingContext2D, sheet: SheetTemplateState, mergeIdx: MergeIndex, options: SheetExportOptions): void;
|
|
594
|
+
type RasterizeSheetExportOptions = SheetExportOptions & {
|
|
595
|
+
/** 设备像素比,打印建议 2 */
|
|
596
|
+
deviceScale?: number;
|
|
597
|
+
/**
|
|
598
|
+
* true:画布仅为「有内容/框线等」占用格的最小包围盒(不含行列索引区)。
|
|
599
|
+
* 打印预览默认应开启。
|
|
600
|
+
*/
|
|
601
|
+
clipToUsedRange?: boolean;
|
|
602
|
+
};
|
|
603
|
+
/** 打印/导出 PDF 的默认:无索引、无默认网格线、裁剪已用区域 */
|
|
604
|
+
declare const PRINT_EXPORT_PRESET: Pick<RasterizeSheetExportOptions, 'includeHeaders' | 'drawDefaultGrid' | 'clipToUsedRange'>;
|
|
605
|
+
/** 离屏 Canvas,逻辑尺寸见 logicalWidth/Height(css 像素) */
|
|
606
|
+
declare function rasterizeSheetExportToCanvas(sheet: SheetTemplateState, mergeIdx: MergeIndex, options: RasterizeSheetExportOptions): {
|
|
607
|
+
canvas: HTMLCanvasElement;
|
|
608
|
+
logicalWidth: number;
|
|
609
|
+
logicalHeight: number;
|
|
610
|
+
deviceScale: number;
|
|
611
|
+
};
|
|
612
|
+
/**
|
|
613
|
+
* 导出整张表为 PNG DataURL(逻辑坐标 × deviceScale)。
|
|
614
|
+
*/
|
|
615
|
+
declare function rasterizeSheetExport(sheet: SheetTemplateState, mergeIdx: MergeIndex, options: RasterizeSheetExportOptions): {
|
|
616
|
+
dataUrl: string;
|
|
617
|
+
width: number;
|
|
618
|
+
height: number;
|
|
619
|
+
logicalWidth: number;
|
|
620
|
+
logicalHeight: number;
|
|
621
|
+
};
|
|
622
|
+
/** 从整表 canvas 按逻辑像素矩形切片(用于多页实际大小) */
|
|
623
|
+
declare function sliceExportCanvasToDataUrls(source: HTMLCanvasElement, logicalRects: {
|
|
624
|
+
x: number;
|
|
625
|
+
y: number;
|
|
626
|
+
w: number;
|
|
627
|
+
h: number;
|
|
628
|
+
}[], deviceScale: number): string[];
|
|
629
|
+
|
|
630
|
+
type SheetScrollPort = {
|
|
631
|
+
isUnified: boolean;
|
|
632
|
+
/** 命中/坐标换算用的内层 `.sheet-scroll` */
|
|
633
|
+
hitEl: HTMLDivElement | null;
|
|
634
|
+
getScrollXY(zoom: number): {
|
|
635
|
+
sx: number;
|
|
636
|
+
sy: number;
|
|
637
|
+
};
|
|
638
|
+
getScrollLeftTop(): {
|
|
639
|
+
sl: number;
|
|
640
|
+
st: number;
|
|
641
|
+
};
|
|
642
|
+
setScrollLeftTop(sl: number, st: number): void;
|
|
643
|
+
getViewport(): {
|
|
644
|
+
vw: number;
|
|
645
|
+
vh: number;
|
|
646
|
+
scrollWidth: number;
|
|
647
|
+
scrollHeight: number;
|
|
648
|
+
};
|
|
649
|
+
};
|
|
650
|
+
declare function createSheetScrollPort(input: {
|
|
651
|
+
scrollRef: RefObject<HTMLDivElement | null>;
|
|
652
|
+
wrapRef: RefObject<HTMLElement | null>;
|
|
653
|
+
unifiedScroll: boolean;
|
|
654
|
+
unifiedScrollRef: RefObject<HTMLDivElement | null> | null;
|
|
655
|
+
}): SheetScrollPort;
|
|
656
|
+
|
|
657
|
+
/**
|
|
658
|
+
* 单元格 contenteditable 内「纯文本」偏移与 DOM Range 边界互转。
|
|
659
|
+
* 须与 cellRichText editableHtmlToRuns / joinRuns 的拼接长度一致。
|
|
660
|
+
*/
|
|
661
|
+
declare function getSelectionForEditableRoot(root: HTMLElement): Selection | null;
|
|
662
|
+
declare function plainLengthToBoundary(root: HTMLElement, container: Node, offset: number): number;
|
|
663
|
+
declare function getPlainOffsetsFromSelection(root: HTMLElement): {
|
|
664
|
+
start: number;
|
|
665
|
+
end: number;
|
|
666
|
+
} | null;
|
|
667
|
+
declare function boundaryAtPlainIndex(root: HTMLElement, index: number): {
|
|
668
|
+
node: Node;
|
|
669
|
+
offset: number;
|
|
670
|
+
};
|
|
671
|
+
declare function setPlainTextSelection(root: HTMLElement, start: number, end: number): void;
|
|
672
|
+
|
|
673
|
+
/** 填充柄热点尺寸(px) */
|
|
674
|
+
declare const FILL_HANDLE_PX = 6;
|
|
675
|
+
/** 选区矩形是否恰好覆盖某一合并主格整块(含未合并单格) */
|
|
676
|
+
declare function selectionMatchesMergeMaster(mergeIdx: MergeIndex, selection: SelectionRect, mr: number, mc: number): boolean;
|
|
677
|
+
/** 正在编辑且选区覆盖整块合并主格时,不显示/不响应填充柄 */
|
|
678
|
+
declare function fillHandleBlockedByEdit(editing: {
|
|
679
|
+
r: number;
|
|
680
|
+
c: number;
|
|
681
|
+
} | null, mergeIdx: MergeIndex, activeCell: {
|
|
682
|
+
r: number;
|
|
683
|
+
c: number;
|
|
684
|
+
}, selection: SelectionRect): boolean;
|
|
685
|
+
/** 命中测试:sheet 坐标是否落在选区右下角填充柄热区 */
|
|
686
|
+
declare function hitTestFillHandle(sheet: SheetTemplateState, mergeIdx: MergeIndex, selection: SelectionRect, sheetX: number, sheetY: number, handlePx?: number, pad?: number): boolean;
|
|
687
|
+
|
|
688
|
+
type SelectionHeaderHighlight = {
|
|
689
|
+
selR1: number;
|
|
690
|
+
selR2: number;
|
|
691
|
+
selC1: number;
|
|
692
|
+
selC2: number;
|
|
693
|
+
isFullRowSelection: boolean;
|
|
694
|
+
isFullColumnSelection: boolean;
|
|
695
|
+
highlightColumnHeaders: boolean;
|
|
696
|
+
highlightRowHeaders: boolean;
|
|
697
|
+
};
|
|
698
|
+
/** 选区铺满整行/整列时,行号列标高亮策略(与 Excel 一致) */
|
|
699
|
+
declare function selectionHeaderHighlightFlags(sel: SelectionRect, maxDataR: number, maxDataC: number): SelectionHeaderHighlight;
|
|
700
|
+
type SelectionEditChromeFlags = {
|
|
701
|
+
hideSelStrokeForEdit: boolean;
|
|
702
|
+
hideActiveStrokeForEdit: boolean;
|
|
703
|
+
hideFillHandleForEdit: boolean;
|
|
704
|
+
};
|
|
705
|
+
/**
|
|
706
|
+
* 内联编辑与活动格重合时的选区/活动格外框与填充柄隐藏策略。
|
|
707
|
+
* selPx / activeBox 须为已减 scroll 的视口坐标(与 paint 内 rx/ax 同系)。
|
|
708
|
+
*/
|
|
709
|
+
declare function selectionEditChromeFlags(editing: {
|
|
710
|
+
r: number;
|
|
711
|
+
c: number;
|
|
712
|
+
} | null, activeR: number, activeC: number, selPx: {
|
|
713
|
+
x: number;
|
|
714
|
+
y: number;
|
|
715
|
+
w: number;
|
|
716
|
+
h: number;
|
|
717
|
+
}, activeBox: {
|
|
718
|
+
x: number;
|
|
719
|
+
y: number;
|
|
720
|
+
w: number;
|
|
721
|
+
h: number;
|
|
722
|
+
}): SelectionEditChromeFlags;
|
|
723
|
+
type InstanceSelectionChromeState = {
|
|
724
|
+
instanceLockedFullMergeSelection: boolean;
|
|
725
|
+
instanceEmptyLockedHideChrome: boolean;
|
|
726
|
+
activeLockedInInstance: boolean;
|
|
727
|
+
};
|
|
728
|
+
/** 实例白名单模式下选区/活动格 chrome 底色与描边策略 */
|
|
729
|
+
declare function instanceSelectionChromeState(input: {
|
|
730
|
+
instanceFillWhitelist: boolean;
|
|
731
|
+
metaSheetId: string;
|
|
732
|
+
sheet: _k_table_sheet_core_sheet_template_model.SheetTemplateState;
|
|
733
|
+
mergeIdx: MergeIndex;
|
|
734
|
+
selection: SelectionRect;
|
|
735
|
+
selMr: number;
|
|
736
|
+
selMc: number;
|
|
737
|
+
selAnchoredInData: boolean;
|
|
738
|
+
activeMr: number;
|
|
739
|
+
activeMc: number;
|
|
740
|
+
selectionMatchesMergeMaster: (mergeIdx: MergeIndex, sel: SelectionRect, mr: number, mc: number) => boolean;
|
|
741
|
+
isInstanceCellFillable: (mr: number, mc: number) => boolean;
|
|
742
|
+
isDataCellTextuallyEmpty: (sheet: _k_table_sheet_core_sheet_template_model.SheetTemplateState, mr: number, mc: number) => boolean;
|
|
743
|
+
}): InstanceSelectionChromeState;
|
|
744
|
+
|
|
745
|
+
/** 画布视图缩放钳制(与 SheetCanvasInner / sheetScrollPort 一致) */
|
|
746
|
+
declare function clampSheetViewZoom(zoom: number): number;
|
|
747
|
+
|
|
748
|
+
/** 把选区两角限制在数据区内并规范为矩形(勿用 min(r1,r2,max) 同时赋给 r1/r2) */
|
|
749
|
+
declare function clampSelection(rowCount: number, colCount: number, r1: number, c1: number, r2: number, c2: number): SelectionRect;
|
|
750
|
+
/** 整行/整列选区时矩形极大,滚入视口会把条拖到底/最右;保持当前滚动位置 */
|
|
751
|
+
declare function shouldSkipScrollRevealForSelection(selection: SelectionRect, maxDataR: number, maxDataC: number): boolean;
|
|
752
|
+
|
|
753
|
+
/** 客户端坐标 → 表世界坐标(含拼接顶区偏移的 sheetYFull) */
|
|
754
|
+
declare function clientToSheetCoords(input: {
|
|
755
|
+
clientX: number;
|
|
756
|
+
clientY: number;
|
|
757
|
+
scrollBoundingRect: {
|
|
758
|
+
left: number;
|
|
759
|
+
top: number;
|
|
760
|
+
};
|
|
761
|
+
scrollSx: number;
|
|
762
|
+
scrollSy: number;
|
|
763
|
+
viewZoom: number;
|
|
764
|
+
midBandTopH: number;
|
|
765
|
+
}): {
|
|
766
|
+
sheetX: number;
|
|
767
|
+
sheetY: number;
|
|
768
|
+
sheetYFull: number;
|
|
769
|
+
};
|
|
770
|
+
|
|
771
|
+
type ScrollRevealInput = {
|
|
772
|
+
selectionPixelRect: {
|
|
773
|
+
x: number;
|
|
774
|
+
y: number;
|
|
775
|
+
w: number;
|
|
776
|
+
h: number;
|
|
777
|
+
};
|
|
778
|
+
viewZoom: number;
|
|
779
|
+
viewportWidth: number;
|
|
780
|
+
viewportHeight: number;
|
|
781
|
+
scrollLeft: number;
|
|
782
|
+
scrollTop: number;
|
|
783
|
+
scrollWidth: number;
|
|
784
|
+
scrollHeight: number;
|
|
785
|
+
midBandTopH: number;
|
|
786
|
+
/** 拼接统一滚动时外层块 offsetTop * zoom */
|
|
787
|
+
unifiedScrollBlockTop?: number;
|
|
788
|
+
pad?: number;
|
|
789
|
+
};
|
|
790
|
+
/** 选区/活动格变化时计算应滚动到的 left/top(像素,已 floor) */
|
|
791
|
+
declare function computeScrollToRevealSelection(input: ScrollRevealInput): {
|
|
792
|
+
scrollLeft: number;
|
|
793
|
+
scrollTop: number;
|
|
794
|
+
changed: boolean;
|
|
795
|
+
};
|
|
796
|
+
|
|
797
|
+
/** 数据区主格:无可见文本/公式(实例白名单下用于「空锁定格」不显示选中外框) */
|
|
798
|
+
declare function isDataCellTextuallyEmpty(sheet: SheetTemplateState, mr: number, mc: number): boolean;
|
|
799
|
+
|
|
800
|
+
type SheetCanvasViewport = {
|
|
801
|
+
viewZoom: number;
|
|
802
|
+
cssWidth: number;
|
|
803
|
+
cssHeight: number;
|
|
804
|
+
worldWidth: number;
|
|
805
|
+
worldHeight: number;
|
|
806
|
+
devicePixelRatio: number;
|
|
807
|
+
};
|
|
808
|
+
/** 配置 canvas 元素尺寸与 2D 变换,返回视口世界坐标尺寸 */
|
|
809
|
+
declare function setupSheetCanvasElement(input: {
|
|
810
|
+
canvas: HTMLCanvasElement;
|
|
811
|
+
viewZoom: number;
|
|
812
|
+
unifiedScroll: boolean;
|
|
813
|
+
totalWidth: number;
|
|
814
|
+
totalHeight: number;
|
|
815
|
+
wrapClientWidth: number;
|
|
816
|
+
wrapClientHeight: number;
|
|
817
|
+
devicePixelRatio?: number;
|
|
818
|
+
}): SheetCanvasViewport;
|
|
819
|
+
|
|
820
|
+
/**
|
|
821
|
+
* SheetCanvasInner 绘制帧的宿主注入端口(实例白名单 / 设计态绑定 / dict 展示等)。
|
|
822
|
+
* kt-web shim 组装真实实现;canvas 包内不含 zustand/table-system/antd 依赖。
|
|
823
|
+
*/
|
|
824
|
+
type SheetCanvasPaintPort = {
|
|
825
|
+
/** 实例白名单:格是否可填(锁定格灰底、不叠选区色) */
|
|
826
|
+
isInstanceCellFillable: (mr: number, mc: number) => boolean;
|
|
827
|
+
/** 设计态:绑定字段是否未知(红色高亮) */
|
|
828
|
+
isUnknownBindingForCell?: (cell: CellData | undefined) => boolean;
|
|
829
|
+
/** 实例格 dict 格式化展示文案 */
|
|
830
|
+
getInstanceFillDisplayPlain?: (mr: number, mc: number) => string | undefined;
|
|
831
|
+
/** 实例明文解析(剥离设计占位) */
|
|
832
|
+
resolveInstancePlainText?: (data: CellData | null | undefined) => string;
|
|
833
|
+
/** 设计态只读样式灰底 */
|
|
834
|
+
getDesignReadonlyUnderlay?: (mr: number, mc: number) => string | undefined;
|
|
835
|
+
};
|
|
836
|
+
/** 无实例/设计宿主语义时的默认端口(全部格可填、无绑定高亮) */
|
|
837
|
+
declare const DEFAULT_SHEET_CANVAS_PAINT_PORT: SheetCanvasPaintPort;
|
|
838
|
+
|
|
839
|
+
type PrintLayoutMode = 'fitOnePage' | 'actualSize';
|
|
840
|
+
type BuildPrintDocumentOptions = {
|
|
841
|
+
sheet: SheetTemplateState;
|
|
842
|
+
mergeIdx: MergeIndex;
|
|
843
|
+
page: PageSettings;
|
|
844
|
+
layoutMode: PrintLayoutMode;
|
|
845
|
+
deviceScale?: number;
|
|
846
|
+
/** 为 true 时在 body 加灰底,仅屏幕预览用 */
|
|
847
|
+
screenPreviewChrome?: boolean;
|
|
848
|
+
omitCellBackground?: boolean;
|
|
849
|
+
sliceSheetFactory?: (sliceIndex: number, sliceCount: number) => SheetTemplateState;
|
|
850
|
+
};
|
|
851
|
+
type BuildPrintWorkbookItem = {
|
|
852
|
+
sheet: SheetTemplateState;
|
|
853
|
+
mergeIdx: MergeIndex;
|
|
854
|
+
page: PageSettings;
|
|
855
|
+
sliceSheetFactory?: (sliceIndex: number, sliceCount: number) => SheetTemplateState;
|
|
856
|
+
};
|
|
857
|
+
type BuildPrintWorkbookDocumentOptions = {
|
|
858
|
+
items: BuildPrintWorkbookItem[];
|
|
859
|
+
layoutMode: PrintLayoutMode;
|
|
860
|
+
deviceScale?: number;
|
|
861
|
+
screenPreviewChrome?: boolean;
|
|
862
|
+
omitCellBackground?: boolean;
|
|
863
|
+
};
|
|
864
|
+
/** 判断多表是否共用同一 `@page`(纸张+边距);不一致时浏览器单次打印不可靠,应导出 PDF 或按 Tab 分表打印。 */
|
|
865
|
+
declare function pageSettingsPrintKey(p: PageSettings): string;
|
|
866
|
+
/**
|
|
867
|
+
* 生成可打印的完整 HTML(含 @page)。与 Canvas 导出同源。
|
|
868
|
+
*/
|
|
869
|
+
declare function buildPrintDocument(opts: BuildPrintDocumentOptions): {
|
|
870
|
+
html: string;
|
|
871
|
+
pageCount: number;
|
|
872
|
+
};
|
|
873
|
+
/**
|
|
874
|
+
* 多工作表单一 HTML:仅当各表 `page` 一致时合法(同一 `@page`)。
|
|
875
|
+
*/
|
|
876
|
+
declare function buildPrintWorkbookDocument(opts: BuildPrintWorkbookDocumentOptions): {
|
|
877
|
+
html: string;
|
|
878
|
+
pageCount: number;
|
|
879
|
+
uniformPage: boolean;
|
|
880
|
+
};
|
|
881
|
+
|
|
882
|
+
/** SheetCanvasInner 窗口级拖拽状态(pointer 捕获在 window) */
|
|
883
|
+
type SheetDragState = {
|
|
884
|
+
mode: "select";
|
|
885
|
+
anchor: {
|
|
886
|
+
r: number;
|
|
887
|
+
c: number;
|
|
888
|
+
};
|
|
889
|
+
extend: boolean;
|
|
890
|
+
} | {
|
|
891
|
+
mode: "selectColHeader";
|
|
892
|
+
anchorC: number;
|
|
893
|
+
} | {
|
|
894
|
+
mode: "selectRowHeader";
|
|
895
|
+
anchorR: number;
|
|
896
|
+
} | {
|
|
897
|
+
mode: "col";
|
|
898
|
+
col: number;
|
|
899
|
+
startW: number;
|
|
900
|
+
startX: number;
|
|
901
|
+
} | {
|
|
902
|
+
mode: "row";
|
|
903
|
+
row: number;
|
|
904
|
+
startH: number;
|
|
905
|
+
startY: number;
|
|
906
|
+
} | {
|
|
907
|
+
mode: "fill";
|
|
908
|
+
sourceSel: SelectionRect;
|
|
909
|
+
axis: "row" | "col" | null;
|
|
910
|
+
startSheetX: number;
|
|
911
|
+
startSheetY: number;
|
|
912
|
+
forceCopy: boolean;
|
|
913
|
+
};
|
|
914
|
+
type SheetDragGuide = {
|
|
915
|
+
kind: "col";
|
|
916
|
+
lineX: number;
|
|
917
|
+
} | {
|
|
918
|
+
kind: "row";
|
|
919
|
+
lineY: number;
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
/**
|
|
923
|
+
* SheetCanvasInner 主绘制帧(纯 Canvas 2D,无 React)。
|
|
924
|
+
* 宿主经 SheetCanvasPaintPort 注入实例白名单 / 设计态绑定 / dict 展示语义。
|
|
925
|
+
*/
|
|
926
|
+
|
|
927
|
+
type PaintSheetCanvasFrameInput = {
|
|
928
|
+
ctx: CanvasRenderingContext2D;
|
|
929
|
+
viewport: SheetCanvasViewport;
|
|
930
|
+
scrollSx: number;
|
|
931
|
+
scrollSy: number;
|
|
932
|
+
sheet: SheetTemplateState;
|
|
933
|
+
geomSheet: SheetTemplateState;
|
|
934
|
+
mergeIdx: MergeIndex;
|
|
935
|
+
selection: SelectionRect;
|
|
936
|
+
activeCell: {
|
|
937
|
+
r: number;
|
|
938
|
+
c: number;
|
|
939
|
+
};
|
|
940
|
+
editing: {
|
|
941
|
+
r: number;
|
|
942
|
+
c: number;
|
|
943
|
+
} | null;
|
|
944
|
+
showCellGridLines: boolean;
|
|
945
|
+
instanceFillWhitelist: boolean;
|
|
946
|
+
metaSheetId: string;
|
|
947
|
+
designBindingOverlay: boolean;
|
|
948
|
+
designReadonlyStyle: boolean;
|
|
949
|
+
useBindingDisplayText: boolean;
|
|
950
|
+
hideBoundMainTextWhenSampleOff: boolean;
|
|
951
|
+
showPrintPageBreaks: boolean;
|
|
952
|
+
showPrintableAreaOutline: boolean;
|
|
953
|
+
printableAreaHeightExtraDeductionPx: number;
|
|
954
|
+
printBreakLayoutMode: PrintLayoutMode;
|
|
955
|
+
virtualTopSheet: SheetTemplateState | null;
|
|
956
|
+
virtualBottomSheet: SheetTemplateState | null;
|
|
957
|
+
spliceVirtualTopBinding: PaintVirtualBandBindingOverlay | null;
|
|
958
|
+
spliceVirtualBottomBinding: PaintVirtualBandBindingOverlay | null;
|
|
959
|
+
headerDragGuide: SheetDragGuide | null;
|
|
960
|
+
resizeGuide: SheetDragGuide | null;
|
|
961
|
+
fillDragPreview: SelectionRect | null;
|
|
962
|
+
port: SheetCanvasPaintPort;
|
|
963
|
+
tableSystemCellMeta: Record<string, unknown> | null;
|
|
964
|
+
/** 标尺 / 选区覆盖;不传则用默认浅色纸色板 */
|
|
965
|
+
palette?: Partial<SheetPaintPalette>;
|
|
966
|
+
};
|
|
967
|
+
declare function paintSheetCanvasFrame(input: PaintSheetCanvasFrameInput): void;
|
|
968
|
+
|
|
969
|
+
/** 指针落在拼接虚化顶区(不参与中区编辑) */
|
|
970
|
+
declare function isPointerInVirtualTopBand(sheetYFull: number, midBandTopH: number): boolean;
|
|
971
|
+
/** 指针落在拼接虚化底区 */
|
|
972
|
+
declare function isPointerInVirtualBottomBand(sheetYFull: number, midBandTopH: number, midBandHeight: number): boolean;
|
|
973
|
+
/** 顶/底虚化带激活时,中区外的 pointer 应忽略(选区/填充/改尺寸) */
|
|
974
|
+
declare function shouldIgnorePointerOutsideMidBand(input: {
|
|
975
|
+
sheetYFull: number;
|
|
976
|
+
midBandTopH: number;
|
|
977
|
+
midBandHeight: number;
|
|
978
|
+
virtualTopActive: boolean;
|
|
979
|
+
virtualBottomActive: boolean;
|
|
980
|
+
}): boolean;
|
|
981
|
+
|
|
982
|
+
/**
|
|
983
|
+
* 填充柄拖拽:根据位移与命中格相对源选区位置锁定 row/col 轴。
|
|
984
|
+
* 与 SheetCanvasInner 原逻辑一致(轻微水平抖动不误锁 col)。
|
|
985
|
+
*/
|
|
986
|
+
declare function resolveFillDragAxis(input: {
|
|
987
|
+
ddr: number;
|
|
988
|
+
ddc: number;
|
|
989
|
+
hitR: number;
|
|
990
|
+
hitC: number;
|
|
991
|
+
sourceSel: SelectionRect;
|
|
992
|
+
}): "row" | "col" | null;
|
|
993
|
+
|
|
994
|
+
/** 框选拖拽:列标/行号扩选时把命中格规范到数据区对角 */
|
|
995
|
+
declare function normalizeSelectDragHit(hit: {
|
|
996
|
+
r: number;
|
|
997
|
+
c: number;
|
|
998
|
+
}, rowCount: number, colCount: number): {
|
|
999
|
+
r: number;
|
|
1000
|
+
c: number;
|
|
1001
|
+
} | null;
|
|
1002
|
+
/** 列标拖选:命中列索引钳制到数据列 */
|
|
1003
|
+
declare function clampColumnHeaderDragEnd(hitC: number, maxC: number): number | null;
|
|
1004
|
+
/** 行号拖选:命中行索引钳制到数据行 */
|
|
1005
|
+
declare function clampRowHeaderDragEnd(hitR: number, maxR: number): number | null;
|
|
1006
|
+
/** 列宽/行高拖拽后的新尺寸(世界 px,已钳制最小值) */
|
|
1007
|
+
declare function computeResizedColWidth(startW: number, dxScreen: number, viewZoom: number): number;
|
|
1008
|
+
declare function computeResizedRowHeight(row: number, startH: number, dyScreen: number, viewZoom: number): number;
|
|
1009
|
+
|
|
1010
|
+
type SheetPointerCursorInput = {
|
|
1011
|
+
drag: SheetDragState | null;
|
|
1012
|
+
sheetX: number;
|
|
1013
|
+
sheetY: number;
|
|
1014
|
+
sheetYFull: number;
|
|
1015
|
+
geomSheet: SheetTemplateState;
|
|
1016
|
+
midBandTopH: number;
|
|
1017
|
+
virtualTopActive: boolean;
|
|
1018
|
+
virtualBottomActive: boolean;
|
|
1019
|
+
readOnly: boolean;
|
|
1020
|
+
formatPainterArmed: boolean;
|
|
1021
|
+
selection: SelectionRect;
|
|
1022
|
+
mergeIdx: MergeIndex;
|
|
1023
|
+
editing: {
|
|
1024
|
+
r: number;
|
|
1025
|
+
c: number;
|
|
1026
|
+
} | null;
|
|
1027
|
+
activeCell: {
|
|
1028
|
+
r: number;
|
|
1029
|
+
c: number;
|
|
1030
|
+
};
|
|
1031
|
+
};
|
|
1032
|
+
/** 表头/数据区 pointer 悬停时应显示的 CSS cursor(空串表示 default) */
|
|
1033
|
+
declare function resolveSheetPointerCursor(input: SheetPointerCursorInput): string;
|
|
1034
|
+
|
|
1035
|
+
type SheetDragMoveInput = {
|
|
1036
|
+
drag: SheetDragState;
|
|
1037
|
+
clientX: number;
|
|
1038
|
+
clientY: number;
|
|
1039
|
+
sheet: SheetTemplateState;
|
|
1040
|
+
mergeIdx: MergeIndex;
|
|
1041
|
+
viewZoom: number;
|
|
1042
|
+
scrollSx: number;
|
|
1043
|
+
scrollSy: number;
|
|
1044
|
+
midBandTopH: number;
|
|
1045
|
+
virtualTopActive: boolean;
|
|
1046
|
+
virtualBottomActive: boolean;
|
|
1047
|
+
clientToSheet: (clientX: number, clientY: number) => {
|
|
1048
|
+
sheetX: number;
|
|
1049
|
+
sheetY: number;
|
|
1050
|
+
sheetYFull: number;
|
|
1051
|
+
};
|
|
1052
|
+
/** 宿主注入:实例白名单填充预览(缺省用 core computeFillPreviewSelection) */
|
|
1053
|
+
computeFillPreview?: (sourceSel: SelectionRect, axis: "row" | "col", hitR: number, hitC: number) => SelectionRect;
|
|
1054
|
+
/** 宿主注入:拖选合并扩展 */
|
|
1055
|
+
expandMergeSelection: (merges: SheetTemplateState["merges"], raw: SelectionRect) => SelectionRect;
|
|
1056
|
+
setColWidth: (sheet: SheetTemplateState, col: number, width: number) => SheetTemplateState;
|
|
1057
|
+
setRowHeight: (sheet: SheetTemplateState, row: number, height: number) => SheetTemplateState;
|
|
1058
|
+
};
|
|
1059
|
+
type SheetDragMoveOutcome = {
|
|
1060
|
+
sheet?: SheetTemplateState;
|
|
1061
|
+
selection?: SelectionRect;
|
|
1062
|
+
resizeGuide?: SheetDragGuide | null;
|
|
1063
|
+
headerGuide?: SheetDragGuide | null;
|
|
1064
|
+
fillPreview?: SelectionRect | null;
|
|
1065
|
+
/** 填充柄首次锁轴后写回 drag */
|
|
1066
|
+
fillAxis?: "row" | "col";
|
|
1067
|
+
paint: boolean;
|
|
1068
|
+
};
|
|
1069
|
+
declare function processSheetDragMove(input: SheetDragMoveInput): SheetDragMoveOutcome | null;
|
|
1070
|
+
|
|
1071
|
+
type SheetDragEndInput = {
|
|
1072
|
+
drag: SheetDragState | null;
|
|
1073
|
+
fillPreview: SelectionRect | null;
|
|
1074
|
+
sheet: SheetTemplateState;
|
|
1075
|
+
selection: SelectionRect;
|
|
1076
|
+
formatPainterArmed: boolean;
|
|
1077
|
+
applyFillToSheet: (sheet: SheetTemplateState, sourceSel: SelectionRect, targetSel: SelectionRect, opts: {
|
|
1078
|
+
forceCopy: boolean;
|
|
1079
|
+
}) => SheetTemplateState;
|
|
1080
|
+
};
|
|
1081
|
+
type SheetDragEndOutcome = {
|
|
1082
|
+
sheet?: SheetTemplateState;
|
|
1083
|
+
selection?: SelectionRect;
|
|
1084
|
+
activeCell?: {
|
|
1085
|
+
r: number;
|
|
1086
|
+
c: number;
|
|
1087
|
+
};
|
|
1088
|
+
applyFormatPainter?: boolean;
|
|
1089
|
+
clearGuides: boolean;
|
|
1090
|
+
paint: boolean;
|
|
1091
|
+
};
|
|
1092
|
+
declare function processSheetDragEnd(input: SheetDragEndInput): SheetDragEndOutcome;
|
|
1093
|
+
|
|
1094
|
+
type SheetWindowDragListeners = {
|
|
1095
|
+
move: (e: Event) => void;
|
|
1096
|
+
up: () => void;
|
|
1097
|
+
moveEvent: "pointermove" | "mousemove";
|
|
1098
|
+
};
|
|
1099
|
+
declare function preferredWindowDragMoveEvent(): "pointermove" | "mousemove";
|
|
1100
|
+
/** 在 window 捕获阶段挂载拖拽监听(拖出画布仍能收到 move/up) */
|
|
1101
|
+
declare function attachSheetWindowDragListeners(prev: SheetWindowDragListeners | null, next: SheetWindowDragListeners): void;
|
|
1102
|
+
declare function detachSheetWindowDragListeners(L: SheetWindowDragListeners): void;
|
|
1103
|
+
declare function createSheetWindowDragHandlers(onMove: (e: Event) => void, onUp: () => void): SheetWindowDragListeners;
|
|
1104
|
+
|
|
1105
|
+
/** 单点正在编辑的同一格时保留内联编辑层焦点 */
|
|
1106
|
+
declare function shouldKeepInlineEditFocus(input: {
|
|
1107
|
+
editing: {
|
|
1108
|
+
r: number;
|
|
1109
|
+
c: number;
|
|
1110
|
+
} | null;
|
|
1111
|
+
geomSheet: SheetTemplateState;
|
|
1112
|
+
mergeIdx: MergeIndex;
|
|
1113
|
+
sheetX: number;
|
|
1114
|
+
sheetY: number;
|
|
1115
|
+
}): boolean;
|
|
1116
|
+
/** 列宽拖拽分隔线:可拖则返回列索引,否则 null */
|
|
1117
|
+
declare function resolveColResizeDivider(geomSheet: SheetTemplateState, sheetX: number, sheetY: number, colCount: number, columnLayoutLocked: boolean): number | null;
|
|
1118
|
+
/** 行高拖拽分隔线 */
|
|
1119
|
+
declare function resolveRowResizeDivider(geomSheet: SheetTemplateState, sheetX: number, sheetY: number, rowCount: number, rowLayoutLocked: boolean): number | null;
|
|
1120
|
+
declare function isFillHandlePointerDown(input: {
|
|
1121
|
+
readOnly: boolean;
|
|
1122
|
+
geomSheet: SheetTemplateState;
|
|
1123
|
+
mergeIdx: MergeIndex;
|
|
1124
|
+
selection: SelectionRect;
|
|
1125
|
+
activeCell: {
|
|
1126
|
+
r: number;
|
|
1127
|
+
c: number;
|
|
1128
|
+
};
|
|
1129
|
+
editing: {
|
|
1130
|
+
r: number;
|
|
1131
|
+
c: number;
|
|
1132
|
+
} | null;
|
|
1133
|
+
sheetX: number;
|
|
1134
|
+
sheetY: number;
|
|
1135
|
+
}): boolean;
|
|
1136
|
+
declare function buildFillDragState(selection: SelectionRect, sheet: SheetTemplateState, sheetX: number, sheetY: number, forceCopy: boolean): SheetDragState;
|
|
1137
|
+
/** 公式拾取:字段模式优先绑定行,否则 A1 */
|
|
1138
|
+
declare function resolveFormulaPickerRefText(input: {
|
|
1139
|
+
kind: "field" | "grid";
|
|
1140
|
+
mr: number;
|
|
1141
|
+
mc: number;
|
|
1142
|
+
bindingLine?: string;
|
|
1143
|
+
}): string;
|
|
1144
|
+
declare function computeSelectAllCornerSelection(rowCount: number, colCount: number): {
|
|
1145
|
+
selection: SelectionRect;
|
|
1146
|
+
activeCell: {
|
|
1147
|
+
r: number;
|
|
1148
|
+
c: number;
|
|
1149
|
+
};
|
|
1150
|
+
};
|
|
1151
|
+
declare function computeColumnHeaderPointerSelection(input: {
|
|
1152
|
+
hitC: number;
|
|
1153
|
+
shiftKey: boolean;
|
|
1154
|
+
activeCol: number;
|
|
1155
|
+
rowCount: number;
|
|
1156
|
+
colCount: number;
|
|
1157
|
+
}): {
|
|
1158
|
+
selection: SelectionRect;
|
|
1159
|
+
activeCell: {
|
|
1160
|
+
r: number;
|
|
1161
|
+
c: number;
|
|
1162
|
+
};
|
|
1163
|
+
};
|
|
1164
|
+
declare function computeRowHeaderPointerSelection(input: {
|
|
1165
|
+
hitR: number;
|
|
1166
|
+
shiftKey: boolean;
|
|
1167
|
+
activeRow: number;
|
|
1168
|
+
rowCount: number;
|
|
1169
|
+
colCount: number;
|
|
1170
|
+
}): {
|
|
1171
|
+
selection: SelectionRect;
|
|
1172
|
+
activeCell: {
|
|
1173
|
+
r: number;
|
|
1174
|
+
c: number;
|
|
1175
|
+
};
|
|
1176
|
+
};
|
|
1177
|
+
declare function computeDataCellPointerSelection(input: {
|
|
1178
|
+
mr: number;
|
|
1179
|
+
mc: number;
|
|
1180
|
+
hitR: number;
|
|
1181
|
+
hitC: number;
|
|
1182
|
+
shiftKey: boolean;
|
|
1183
|
+
activeR: number;
|
|
1184
|
+
activeC: number;
|
|
1185
|
+
rowCount: number;
|
|
1186
|
+
colCount: number;
|
|
1187
|
+
mergeIdx: MergeIndex;
|
|
1188
|
+
merges: SheetTemplateState["merges"];
|
|
1189
|
+
expandMergeSelection: (merges: SheetTemplateState["merges"], raw: SelectionRect) => SelectionRect;
|
|
1190
|
+
}): {
|
|
1191
|
+
selection: SelectionRect;
|
|
1192
|
+
activeCell?: {
|
|
1193
|
+
r: number;
|
|
1194
|
+
c: number;
|
|
1195
|
+
};
|
|
1196
|
+
selectDrag: SheetDragState;
|
|
1197
|
+
};
|
|
1198
|
+
/** 右键菜单:表头命中时映射到活动格行/列 */
|
|
1199
|
+
declare function resolveContextMenuCell(input: {
|
|
1200
|
+
hitR: number;
|
|
1201
|
+
hitC: number;
|
|
1202
|
+
activeR: number;
|
|
1203
|
+
activeC: number;
|
|
1204
|
+
}): {
|
|
1205
|
+
row: number;
|
|
1206
|
+
col: number;
|
|
1207
|
+
};
|
|
1208
|
+
type SheetPointerDownInput = {
|
|
1209
|
+
pointerType: string;
|
|
1210
|
+
button: number;
|
|
1211
|
+
shiftKey: boolean;
|
|
1212
|
+
ctrlKey: boolean;
|
|
1213
|
+
clientX: number;
|
|
1214
|
+
sheetX: number;
|
|
1215
|
+
sheetY: number;
|
|
1216
|
+
sheetYFull: number;
|
|
1217
|
+
readOnly: boolean;
|
|
1218
|
+
columnLayoutLocked: boolean;
|
|
1219
|
+
rowLayoutLocked: boolean;
|
|
1220
|
+
instanceFillWhitelist: boolean;
|
|
1221
|
+
geomSheet: SheetTemplateState;
|
|
1222
|
+
sheet: SheetTemplateState;
|
|
1223
|
+
mergeIdx: MergeIndex;
|
|
1224
|
+
selection: SelectionRect;
|
|
1225
|
+
activeCell: {
|
|
1226
|
+
r: number;
|
|
1227
|
+
c: number;
|
|
1228
|
+
};
|
|
1229
|
+
editing: {
|
|
1230
|
+
r: number;
|
|
1231
|
+
c: number;
|
|
1232
|
+
} | null;
|
|
1233
|
+
midBandTopH: number;
|
|
1234
|
+
virtualTopActive: boolean;
|
|
1235
|
+
virtualBottomActive: boolean;
|
|
1236
|
+
formulaPickerArmed: boolean;
|
|
1237
|
+
formulaPickerKind: "field" | "grid";
|
|
1238
|
+
bindingLineForPicker?: string;
|
|
1239
|
+
expandMergeSelection: (merges: SheetTemplateState["merges"], raw: SelectionRect) => SelectionRect;
|
|
1240
|
+
/** 实例格是否可填(辅助录入触发判定) */
|
|
1241
|
+
isCellFillable?: (mr: number, mc: number) => boolean;
|
|
1242
|
+
instanceFillInputMode?: "native" | "assistedTouch" | "assistedPointer" | string;
|
|
1243
|
+
};
|
|
1244
|
+
type SheetPointerDownResult = {
|
|
1245
|
+
action: "ignore";
|
|
1246
|
+
} | {
|
|
1247
|
+
action: "formula";
|
|
1248
|
+
refText: string;
|
|
1249
|
+
} | {
|
|
1250
|
+
action: "focus";
|
|
1251
|
+
keepInlineFocus: boolean;
|
|
1252
|
+
} | {
|
|
1253
|
+
action: "resizeCol";
|
|
1254
|
+
col: number;
|
|
1255
|
+
} | {
|
|
1256
|
+
action: "resizeRow";
|
|
1257
|
+
row: number;
|
|
1258
|
+
} | {
|
|
1259
|
+
action: "fill";
|
|
1260
|
+
drag: SheetDragState;
|
|
1261
|
+
} | {
|
|
1262
|
+
action: "noHit";
|
|
1263
|
+
} | {
|
|
1264
|
+
action: "corner";
|
|
1265
|
+
selection: SelectionRect;
|
|
1266
|
+
activeCell: {
|
|
1267
|
+
r: number;
|
|
1268
|
+
c: number;
|
|
1269
|
+
};
|
|
1270
|
+
} | {
|
|
1271
|
+
action: "colHeader";
|
|
1272
|
+
selection: SelectionRect;
|
|
1273
|
+
activeCell: {
|
|
1274
|
+
r: number;
|
|
1275
|
+
c: number;
|
|
1276
|
+
};
|
|
1277
|
+
startColHeaderDrag: boolean;
|
|
1278
|
+
} | {
|
|
1279
|
+
action: "rowHeader";
|
|
1280
|
+
selection: SelectionRect;
|
|
1281
|
+
activeCell: {
|
|
1282
|
+
r: number;
|
|
1283
|
+
c: number;
|
|
1284
|
+
};
|
|
1285
|
+
startRowHeaderDrag: boolean;
|
|
1286
|
+
} | {
|
|
1287
|
+
action: "dataCell";
|
|
1288
|
+
mr: number;
|
|
1289
|
+
mc: number;
|
|
1290
|
+
selection: SelectionRect;
|
|
1291
|
+
activeCell?: {
|
|
1292
|
+
r: number;
|
|
1293
|
+
c: number;
|
|
1294
|
+
};
|
|
1295
|
+
startSelectDrag: boolean;
|
|
1296
|
+
endEditIfOtherCell: boolean;
|
|
1297
|
+
openAssistedTouch?: boolean;
|
|
1298
|
+
openAssistedPointer?: boolean;
|
|
1299
|
+
};
|
|
1300
|
+
declare function processSheetPointerDown(input: SheetPointerDownInput): SheetPointerDownResult;
|
|
1301
|
+
|
|
1302
|
+
/** 宿主注入:图片/图表/二维码栅格化依赖(避免 canvas 包直接耦合文件 API 与 echarts) */
|
|
1303
|
+
type PaintEmbedsDeps = {
|
|
1304
|
+
resolveEmbedImageSrc: (fileId: string | undefined) => Promise<string | null>;
|
|
1305
|
+
rasterizeChartEmbedToDataUrl: (def: ChartEmbedDef, fieldData: FieldDataCtx, widthPx: number, heightPx: number, runtime?: unknown, scripts?: WorkbookScripts | null) => Promise<string | null>;
|
|
1306
|
+
qrToDataUrl: (payload: string, opts: {
|
|
1307
|
+
errorCorrectionLevel?: "L" | "M" | "Q" | "H";
|
|
1308
|
+
margin: number;
|
|
1309
|
+
width: number;
|
|
1310
|
+
}) => Promise<string>;
|
|
1311
|
+
};
|
|
1312
|
+
type PaintEmbedsOptions = PaintEmbedsDeps & {
|
|
1313
|
+
sheetId: string;
|
|
1314
|
+
embeds: WorkbookEmbedDef[];
|
|
1315
|
+
embedStates?: Record<string, EmbedInstanceState>;
|
|
1316
|
+
qrPayloadBySlot?: Record<string, string>;
|
|
1317
|
+
/** 图表 live 渲染数据源(打印不走 UI cache) */
|
|
1318
|
+
fieldData?: FieldDataCtx;
|
|
1319
|
+
scripts?: WorkbookScripts | null;
|
|
1320
|
+
/** 与 rasterize 相同的 translate 偏移 */
|
|
1321
|
+
offsetX?: number;
|
|
1322
|
+
offsetY?: number;
|
|
1323
|
+
};
|
|
1324
|
+
/** 在已绘制的 sheet canvas 上叠画 embed(asset + chart) */
|
|
1325
|
+
declare function paintEmbedsToCanvas(ctx: CanvasRenderingContext2D, sheet: SheetTemplateState, _mergeIdx: MergeIndex, opts: PaintEmbedsOptions): Promise<void>;
|
|
1326
|
+
|
|
1327
|
+
/**
|
|
1328
|
+
* 在表像素坐标系中返回「每页」矩形(与打印切片逻辑一致),供编辑画布叠画分页虚线。
|
|
1329
|
+
* - 整表一页:已用区外包络一块
|
|
1330
|
+
* - 实际大小:按可印区逻辑像素切片多块
|
|
1331
|
+
*/
|
|
1332
|
+
declare function getPrintPageOverlayRects(sheet: SheetTemplateState, mergeIdx: MergeIndex, page: PageSettings, layoutMode: PrintLayoutMode): {
|
|
1333
|
+
x: number;
|
|
1334
|
+
y: number;
|
|
1335
|
+
w: number;
|
|
1336
|
+
h: number;
|
|
1337
|
+
}[];
|
|
1338
|
+
|
|
1339
|
+
/** 将单 Sheet 状态写入 ExcelJS Worksheet */
|
|
1340
|
+
declare function writeSheetToWorksheet(ws: exceljs.Worksheet, sheet: SheetTemplateState): Promise<void>;
|
|
1341
|
+
/** 将表模板导出为 Excel(.xlsx),含合并、框线、字体、对齐、填充、行列尺寸(近似)。 */
|
|
1342
|
+
declare function sheetToExcelBuffer(sheet: SheetTemplateState): Promise<ArrayBuffer>;
|
|
1343
|
+
/** 多 Sheet 工作簿 → 单个 xlsx(每 sheet 一页,名称取自 TemplateSheetItem.name) */
|
|
1344
|
+
declare function workbookToExcelBuffer(workbook: _k_table_sheet_core.TemplateWorkbookState): Promise<ArrayBuffer>;
|
|
1345
|
+
declare function downloadExcelFile(filename: string, buffer: ArrayBuffer): void;
|
|
1346
|
+
declare function downloadSheetAsExcel(sheet: SheetTemplateState, baseName?: string): Promise<void>;
|
|
1347
|
+
|
|
1348
|
+
/**
|
|
1349
|
+
* 多 Sheet 工作簿 Excel 往返(布局层;不含 fieldRegistry / binding 语义)。
|
|
1350
|
+
*/
|
|
1351
|
+
|
|
1352
|
+
type XlsxToWorkbookLayoutOptions = {
|
|
1353
|
+
/** 按 worksheet 名映射到已有 sheet id(导入合并时用) */
|
|
1354
|
+
sheetIdByWorksheetName?: Record<string, string>;
|
|
1355
|
+
/** compact:报表/KTL;chrome:Canvas 模板编辑器 */
|
|
1356
|
+
gridMode?: GridLayoutMode;
|
|
1357
|
+
/** 目标纸张(报表导入应传模板 page,保证与预览/导出同一可印宽) */
|
|
1358
|
+
page?: PageSettings;
|
|
1359
|
+
fitToPrintable?: boolean;
|
|
1360
|
+
};
|
|
1361
|
+
/** xlsx → 仅含布局的 TemplateWorkbookState(sheet id 由 worksheet 名推导) */
|
|
1362
|
+
declare function xlsxToWorkbookLayout(buffer: ArrayBuffer, fileName?: string, options?: XlsxToWorkbookLayoutOptions): Promise<TemplateWorkbookState>;
|
|
1363
|
+
|
|
1364
|
+
declare function downloadWorkbookAsExcel(workbook: TemplateWorkbookState, baseName?: string): Promise<void>;
|
|
1365
|
+
|
|
1366
|
+
/**
|
|
1367
|
+
* Excel (.xlsx) 解析核心 — 使用 ExcelJS 读取工作簿,输出中间 JSON 格式。
|
|
1368
|
+
*/
|
|
1369
|
+
|
|
1370
|
+
/**
|
|
1371
|
+
* 解析 .xlsx 文件为中间 JSON 格式
|
|
1372
|
+
*/
|
|
1373
|
+
declare function parseExcelToIntermediate(file: File, options: ExcelImportOptions): Promise<ExcelImportIntermediateV1>;
|
|
1374
|
+
/** 从 ArrayBuffer 解析指定 Sheet 为中间格式 */
|
|
1375
|
+
declare function parseExcelBufferToIntermediate(buffer: ArrayBuffer, options: ExcelImportOptions, fileName?: string): Promise<ExcelImportIntermediateV1>;
|
|
1376
|
+
/** 解析 xlsx 全部 Sheet(多 Sheet 布局导入) */
|
|
1377
|
+
declare function parseExcelBufferAllSheets(buffer: ArrayBuffer, fileName?: string): Promise<ExcelImportIntermediateV1[]>;
|
|
1378
|
+
declare function getExcelSheetList(file: File): Promise<{
|
|
1379
|
+
index: number;
|
|
1380
|
+
name: string;
|
|
1381
|
+
}[]>;
|
|
1382
|
+
|
|
1383
|
+
/**
|
|
1384
|
+
* 将中间 JSON 还原为引擎 SheetTemplateState。
|
|
1385
|
+
* - chrome(默认):row/col 0 为索引 gutter,供 Canvas 模板编辑器
|
|
1386
|
+
* - compact:KTL/报表,无 gutter,尺寸与 @colWidths 一致
|
|
1387
|
+
*/
|
|
1388
|
+
type IntermediateToSheetOptions = {
|
|
1389
|
+
gridMode?: GridLayoutMode;
|
|
1390
|
+
/** 目标纸张;报表导入应传入模板 sheet.page */
|
|
1391
|
+
page?: PageSettings;
|
|
1392
|
+
/** 列总宽超出可印宽时等比缩小(默认 true) */
|
|
1393
|
+
fitToPrintable?: boolean;
|
|
1394
|
+
};
|
|
1395
|
+
declare function intermediateToSheetState(json: ExcelImportIntermediateV1, options?: IntermediateToSheetOptions): SheetTemplateState;
|
|
1396
|
+
|
|
1397
|
+
/** 悬浮输入面板跟随模式 */
|
|
1398
|
+
type PanelFollowMode = "topSide" | "bottomSide" | "leftSide" | "rightSide" | "fixed";
|
|
1399
|
+
declare const PANEL_FOLLOW_MODE_DEFAULT: PanelFollowMode;
|
|
1400
|
+
declare function isPanelFollowMode(v: string | null | undefined): v is PanelFollowMode;
|
|
1401
|
+
declare function loadPanelFollowMode(): PanelFollowMode;
|
|
1402
|
+
declare function savePanelFollowMode(mode: PanelFollowMode): void;
|
|
1403
|
+
declare const PANEL_FOLLOW_MODE_OPTIONS: {
|
|
1404
|
+
key: PanelFollowMode;
|
|
1405
|
+
label: string;
|
|
1406
|
+
}[];
|
|
1407
|
+
|
|
1408
|
+
declare const FLOATING_PANEL_GAP = 4;
|
|
1409
|
+
declare const FLOATING_PANEL_DEFAULT_W = 240;
|
|
1410
|
+
declare const FLOATING_PANEL_TEXT_H = 120;
|
|
1411
|
+
declare const CALENDAR_PANEL_APPROX_H = 320;
|
|
1412
|
+
type ViewportPoint = {
|
|
1413
|
+
left: number;
|
|
1414
|
+
top: number;
|
|
1415
|
+
};
|
|
1416
|
+
type ViewportRect = {
|
|
1417
|
+
left: number;
|
|
1418
|
+
top: number;
|
|
1419
|
+
width: number;
|
|
1420
|
+
height: number;
|
|
1421
|
+
};
|
|
1422
|
+
declare function clampFloatingPanelPos(pos: ViewportPoint, panelW: number, panelH: number, viewport?: {
|
|
1423
|
+
width: number;
|
|
1424
|
+
height: number;
|
|
1425
|
+
}): ViewportPoint;
|
|
1426
|
+
/** overlay 盒 + 容器 viewport rect → fixed 定位用的 viewport 坐标 */
|
|
1427
|
+
declare function overlayBoxToViewportRect(box: EmbedOverlayBox, containerRect: DOMRect | null | undefined): ViewportRect;
|
|
1428
|
+
declare function computeFloatingPanelFollowPos(followMode: PanelFollowMode, cellRect: ViewportRect | null, currentPos: ViewportPoint, panelW: number, panelH: number, gap?: number): ViewportPoint;
|
|
1429
|
+
/** 日期/日历弹出层:优先下方,空间不足时翻转到上方 */
|
|
1430
|
+
declare function computeDatePopupPos(anchorRect: Pick<DOMRect, "left" | "top" | "bottom">, panelApproxH?: number, gap?: number, viewportH?: number): ViewportPoint;
|
|
1431
|
+
/** 单元格 A1 风格标签(0-based r,c,与 sheet 引擎一致) */
|
|
1432
|
+
declare function cellEditorA1Label(r: number, c: number): string;
|
|
1433
|
+
|
|
1434
|
+
type RasterizeSheetWithEmbedsOptions = RasterizeSheetExportOptions & PaintEmbedsDeps & {
|
|
1435
|
+
sheetId: string;
|
|
1436
|
+
embeds?: WorkbookEmbedDef[];
|
|
1437
|
+
embedStates?: Record<string, EmbedInstanceState>;
|
|
1438
|
+
qrPayloadBySlot?: Record<string, string>;
|
|
1439
|
+
fieldData?: FieldDataCtx;
|
|
1440
|
+
scripts?: WorkbookScripts | null;
|
|
1441
|
+
};
|
|
1442
|
+
declare function rasterizeSheetWithEmbeds(sheet: SheetTemplateState, mergeIdx: MergeIndex, opts: RasterizeSheetWithEmbedsOptions): Promise<{
|
|
1443
|
+
canvas: HTMLCanvasElement;
|
|
1444
|
+
logicalWidth: number;
|
|
1445
|
+
logicalHeight: number;
|
|
1446
|
+
deviceScale: number;
|
|
1447
|
+
}>;
|
|
1448
|
+
|
|
1449
|
+
type SheetPdfRasterOptions = PaintEmbedsDeps & {
|
|
1450
|
+
layoutMode: PrintLayoutMode;
|
|
1451
|
+
deviceScale?: number;
|
|
1452
|
+
omitCellBackground?: boolean;
|
|
1453
|
+
sliceSheetFactory?: (sliceIndex: number, sliceCount: number) => SheetTemplateState;
|
|
1454
|
+
sheetId?: string;
|
|
1455
|
+
embedPrintContext?: EmbedPrintContext;
|
|
1456
|
+
};
|
|
1457
|
+
declare function appendSheetToPdfAsync(pdf: jsPDF | null, sheet: SheetTemplateState, mergeIdx: MergeIndex, page: PageSettings, options: SheetPdfRasterOptions): Promise<jsPDF>;
|
|
1458
|
+
/** 同步路径不含 embed 叠画(与 kt-web 历史行为一致)。 */
|
|
1459
|
+
declare function appendSheetToPdf(pdf: jsPDF | null, sheet: SheetTemplateState, mergeIdx: MergeIndex, page: PageSettings, options: Omit<SheetPdfRasterOptions, keyof PaintEmbedsDeps>): jsPDF;
|
|
1460
|
+
declare function sheetToPdfBlob(sheet: SheetTemplateState, mergeIdx: MergeIndex, page: PageSettings, options: Omit<SheetPdfRasterOptions, keyof PaintEmbedsDeps>): Blob;
|
|
1461
|
+
declare function sheetToPdfBlobAsync(sheet: SheetTemplateState, mergeIdx: MergeIndex, page: PageSettings, options: SheetPdfRasterOptions): Promise<Blob>;
|
|
1462
|
+
type WorkbookPdfSheetSlice = {
|
|
1463
|
+
sheet: SheetTemplateState;
|
|
1464
|
+
mergeIdx: MergeIndex;
|
|
1465
|
+
page: PageSettings;
|
|
1466
|
+
layoutMode: PrintLayoutMode;
|
|
1467
|
+
sliceSheetFactory?: (sliceIndex: number, sliceCount: number) => SheetTemplateState;
|
|
1468
|
+
sheetId?: string;
|
|
1469
|
+
};
|
|
1470
|
+
declare function workbookToPdfBlobAsync(slices: WorkbookPdfSheetSlice[], options: Pick<SheetPdfRasterOptions, "deviceScale" | "omitCellBackground" | "embedPrintContext"> & PaintEmbedsDeps): Promise<Blob>;
|
|
1471
|
+
type WorkbookPdfSheetSliceSync = {
|
|
1472
|
+
sheet: SheetTemplateState;
|
|
1473
|
+
mergeIdx: MergeIndex;
|
|
1474
|
+
page: PageSettings;
|
|
1475
|
+
layoutMode: PrintLayoutMode;
|
|
1476
|
+
sliceSheetFactory?: (sliceIndex: number, sliceCount: number) => SheetTemplateState;
|
|
1477
|
+
};
|
|
1478
|
+
declare function workbookToPdfBlob(slices: WorkbookPdfSheetSlice[], options: {
|
|
1479
|
+
deviceScale?: number;
|
|
1480
|
+
omitCellBackground?: boolean;
|
|
1481
|
+
}): Blob;
|
|
1482
|
+
|
|
1483
|
+
type BuildPrintDocumentAsyncOptions = BuildPrintDocumentOptions & PaintEmbedsDeps & {
|
|
1484
|
+
sheetId: string;
|
|
1485
|
+
embedPrintContext?: EmbedPrintContext;
|
|
1486
|
+
};
|
|
1487
|
+
type BuildPrintWorkbookDocumentAsyncOptions = BuildPrintWorkbookDocumentOptions & PaintEmbedsDeps & {
|
|
1488
|
+
embedPrintContext?: EmbedPrintContext;
|
|
1489
|
+
defaultSheetId?: string;
|
|
1490
|
+
};
|
|
1491
|
+
declare function buildPrintDocumentAsync(opts: BuildPrintDocumentAsyncOptions): Promise<{
|
|
1492
|
+
html: string;
|
|
1493
|
+
pageCount: number;
|
|
1494
|
+
}>;
|
|
1495
|
+
type BuildPrintWorkbookItemWithSheetId = BuildPrintWorkbookItem & {
|
|
1496
|
+
sheetId?: string;
|
|
1497
|
+
};
|
|
1498
|
+
declare function buildPrintWorkbookDocumentAsync(opts: BuildPrintWorkbookDocumentAsyncOptions): Promise<{
|
|
1499
|
+
html: string;
|
|
1500
|
+
pageCount: number;
|
|
1501
|
+
uniformPage: boolean;
|
|
1502
|
+
}>;
|
|
1503
|
+
|
|
1504
|
+
/**
|
|
1505
|
+
* 轻量只读条带(消费级):给定已解析 sheet,渲染行区间的表格预览(HTML 表格,非 canvas)。
|
|
1506
|
+
* 无 hooks / 无浏览器 API,可在 RSC / LIMS / TAM 直接复用;解析 workbookJson 由宿主完成。
|
|
1507
|
+
*/
|
|
1508
|
+
type Props = {
|
|
1509
|
+
sheet: SheetTemplateState | null;
|
|
1510
|
+
title: string;
|
|
1511
|
+
rowStart: number;
|
|
1512
|
+
rowEnd: number;
|
|
1513
|
+
className?: string;
|
|
1514
|
+
/** 是否显示 Excel 式列标与行号 */
|
|
1515
|
+
showRulers?: boolean;
|
|
1516
|
+
};
|
|
1517
|
+
declare function StaticWorkbookSlicePreview({ sheet: sh, title, rowStart, rowEnd, className, showRulers }: Props): react.JSX.Element;
|
|
1518
|
+
|
|
1519
|
+
type QrToDataUrlFn = (payload: string, opts: {
|
|
1520
|
+
errorCorrectionLevel?: "L" | "M" | "Q" | "H";
|
|
1521
|
+
margin: number;
|
|
1522
|
+
width: number;
|
|
1523
|
+
color?: {
|
|
1524
|
+
dark?: string;
|
|
1525
|
+
light?: string;
|
|
1526
|
+
};
|
|
1527
|
+
}) => Promise<string>;
|
|
1528
|
+
type QrEmbedSlotProps = {
|
|
1529
|
+
def: AssetEmbedDef;
|
|
1530
|
+
state?: EmbedInstanceState;
|
|
1531
|
+
payload?: string;
|
|
1532
|
+
readOnly?: boolean;
|
|
1533
|
+
layout: EmbedOverlayLayoutPort;
|
|
1534
|
+
qrToDataUrl: QrToDataUrlFn;
|
|
1535
|
+
};
|
|
1536
|
+
/** QR 槽位:按 payload 渲染二维码图片 */
|
|
1537
|
+
declare function QrEmbedSlot({ def, state, payload, readOnly, layout, qrToDataUrl }: QrEmbedSlotProps): react.JSX.Element | null;
|
|
1538
|
+
|
|
1539
|
+
type AssetEmbedHostDeps = {
|
|
1540
|
+
resolveEmbedImageSrc: (fileId: string | undefined) => Promise<string | null>;
|
|
1541
|
+
registerEmbedFileObject: (file: File) => Promise<{
|
|
1542
|
+
fileId: string;
|
|
1543
|
+
previewUrl: string;
|
|
1544
|
+
}>;
|
|
1545
|
+
};
|
|
1546
|
+
type AssetEmbedHostProps = AssetEmbedHostDeps & {
|
|
1547
|
+
def: AssetEmbedDef;
|
|
1548
|
+
state?: EmbedInstanceState;
|
|
1549
|
+
readOnly?: boolean;
|
|
1550
|
+
layout: EmbedOverlayLayoutPort;
|
|
1551
|
+
onUpload?: (slotId: string, fileId: string) => void;
|
|
1552
|
+
onClear?: (slotId: string) => void;
|
|
1553
|
+
};
|
|
1554
|
+
/** 签章/图片槽:实例态可点击上传 */
|
|
1555
|
+
declare function AssetEmbedHost({ def, state, readOnly, layout, resolveEmbedImageSrc, registerEmbedFileObject, onUpload, onClear, }: AssetEmbedHostProps): react.JSX.Element | null;
|
|
1556
|
+
|
|
1557
|
+
/** ECharts 实例最小接口(canvas 不直接依赖 echarts 包) */
|
|
1558
|
+
type ChartEchartsInstance = {
|
|
1559
|
+
setOption: (option: unknown, notMerge?: boolean) => void;
|
|
1560
|
+
resize: (opts: {
|
|
1561
|
+
width: number;
|
|
1562
|
+
height: number;
|
|
1563
|
+
}) => void;
|
|
1564
|
+
dispose: () => void;
|
|
1565
|
+
};
|
|
1566
|
+
/** 宿主注入:ECharts 初始化与 option 构建 */
|
|
1567
|
+
type ChartEchartsPort = {
|
|
1568
|
+
init: (el: HTMLElement) => ChartEchartsInstance;
|
|
1569
|
+
buildOption: (def: _k_table_sheet_core.ChartEmbedDef, seriesData: unknown) => unknown;
|
|
1570
|
+
ensureModules: (option: unknown, def: _k_table_sheet_core.ChartEmbedDef) => void;
|
|
1571
|
+
getOptionEvalError: (def: _k_table_sheet_core.ChartEmbedDef, seriesData: unknown) => string | null;
|
|
1572
|
+
};
|
|
1573
|
+
type ChartEmbedHostProps = {
|
|
1574
|
+
def: _k_table_sheet_core.ChartEmbedDef;
|
|
1575
|
+
state?: _k_table_sheet_core.EmbedInstanceState;
|
|
1576
|
+
layout: EmbedOverlayBox | null;
|
|
1577
|
+
/** scroll/zoom 变化时递增,触发 resize */
|
|
1578
|
+
layoutTick?: number;
|
|
1579
|
+
resolveSeriesData: () => unknown | null;
|
|
1580
|
+
echartsPort: ChartEchartsPort;
|
|
1581
|
+
resolveEmbedImageSrc: (fileId: string | undefined) => Promise<string | null>;
|
|
1582
|
+
/** 计算完成后刷新图表(实例态) */
|
|
1583
|
+
onComputeDone?: (handler: () => void) => () => void;
|
|
1584
|
+
};
|
|
1585
|
+
|
|
1586
|
+
/** 图表嵌入 host:ECharts 渲染由宿主注入 ChartEchartsPort */
|
|
1587
|
+
declare function ChartEmbedHost({ def, state, layout, layoutTick, resolveSeriesData, echartsPort, resolveEmbedImageSrc, onComputeDone, }: ChartEmbedHostProps): react.JSX.Element | null;
|
|
1588
|
+
|
|
1589
|
+
type SheetEmbedOverlayProps = {
|
|
1590
|
+
assets: AssetEmbedDef[];
|
|
1591
|
+
charts: ChartEmbedDef[];
|
|
1592
|
+
layout: EmbedOverlayLayoutPort;
|
|
1593
|
+
/** 由宿主渲染 ChartEmbedHost(避免 canvas 内循环依赖 workbook store) */
|
|
1594
|
+
renderChart: (def: ChartEmbedDef) => ReactNode;
|
|
1595
|
+
};
|
|
1596
|
+
/** 嵌入层 DOM:设计态 asset 虚线框 + chart(由 renderChart 注入) */
|
|
1597
|
+
declare function SheetEmbedOverlay({ assets, charts, layout, renderChart }: SheetEmbedOverlayProps): react.JSX.Element;
|
|
1598
|
+
|
|
1599
|
+
type InstanceAssetLayerProps = {
|
|
1600
|
+
assets: AssetEmbedDef[];
|
|
1601
|
+
charts: ChartEmbedDef[];
|
|
1602
|
+
embedStates?: Record<string, EmbedInstanceState>;
|
|
1603
|
+
qrPayloads: Record<string, string>;
|
|
1604
|
+
readOnly?: boolean;
|
|
1605
|
+
showCharts?: boolean;
|
|
1606
|
+
renderChart: (def: ChartEmbedDef, state?: EmbedInstanceState) => ReactNode;
|
|
1607
|
+
renderQr: (def: AssetEmbedDef, state?: EmbedInstanceState, payload?: string) => ReactNode;
|
|
1608
|
+
renderAsset: (def: AssetEmbedDef, state?: EmbedInstanceState) => ReactNode;
|
|
1609
|
+
};
|
|
1610
|
+
/** 实例态嵌入层:按 asset/chart 列表渲染,具体 host 由宿主 inject render* 回调 */
|
|
1611
|
+
declare function InstanceAssetLayer({ assets, charts, embedStates, qrPayloads, showCharts, renderChart, renderQr, renderAsset, }: InstanceAssetLayerProps): react.JSX.Element;
|
|
1612
|
+
type InstanceEmbedLayerMode = "design" | "instance";
|
|
1613
|
+
type InstanceEmbedLayerProps = {
|
|
1614
|
+
mode: InstanceEmbedLayerMode;
|
|
1615
|
+
/** 设计态 overlay(宿主注入 SheetEmbedOverlay shim) */
|
|
1616
|
+
designOverlay: ReactNode;
|
|
1617
|
+
/** 实例态 asset/chart 层 */
|
|
1618
|
+
instanceLayer: ReactNode;
|
|
1619
|
+
};
|
|
1620
|
+
/** 实例/设计态嵌入层入口(mode 切换) */
|
|
1621
|
+
declare function InstanceEmbedLayer({ mode, designOverlay, instanceLayer }: InstanceEmbedLayerProps): ReactNode;
|
|
1622
|
+
|
|
1623
|
+
/**
|
|
1624
|
+
* 名称框 A1 地址格式化/解析(网格 1-based:A1 对应 r=1,c=1)。
|
|
1625
|
+
* 与 @k-table/sheet-core 的 formula/coords A1(0-based、异常抛错)语义不同,故置于画布 UI 层。
|
|
1626
|
+
*/
|
|
1627
|
+
/** 数据区单元格地址,如 A1、B2(r,c 为 0-based 网格坐标,且 r>=1,c>=1) */
|
|
1628
|
+
declare function formatA1(r: number, c: number): string;
|
|
1629
|
+
/** 名称框展示:单格 A1;多格 A1:B2(与 Excel 一致) */
|
|
1630
|
+
declare function formatSelectionA1(sel: SelectionRect): string;
|
|
1631
|
+
declare function parseA1(s: string): {
|
|
1632
|
+
r: number;
|
|
1633
|
+
c: number;
|
|
1634
|
+
} | null;
|
|
1635
|
+
/** 名称框跳转:支持 A1 或 A1:B2 / A1:A8 等矩形选区 */
|
|
1636
|
+
declare function parseA1OrRangeToSelection(s: string): SelectionRect | null;
|
|
1637
|
+
declare function parseGridRcAddress(s: string): {
|
|
1638
|
+
r: number;
|
|
1639
|
+
c: number;
|
|
1640
|
+
} | null;
|
|
1641
|
+
|
|
1642
|
+
/**
|
|
1643
|
+
* @k-table/sheet-canvas — kt 表格画布/渲染层(增量抽包,M3)。
|
|
1644
|
+
*
|
|
1645
|
+
* 职责:Canvas 2D 绘制适配、React 编辑器/实例组件、打印/PDF 叠层。
|
|
1646
|
+
* 依赖 @k-table/sheet-core(无头引擎)与 @k-table/sheet-host(契约);React/echarts/antd 为宿主 external。
|
|
1647
|
+
* 纯几何/模型/引擎逻辑属 core,本包只放"需要 DOM/React/Canvas"的部分。
|
|
1648
|
+
*/
|
|
1649
|
+
declare const SHEET_CANVAS_PACKAGE: "@k-table/sheet-canvas";
|
|
1650
|
+
|
|
1651
|
+
export { type ApplyFillOptions, type ApplyMergeSelectionOptions, AssetEmbedHost, type AssetEmbedHostDeps, type AssetEmbedHostProps, type BindingOverlayDeps, type BuildPrintDocumentAsyncOptions, type BuildPrintDocumentOptions, type BuildPrintWorkbookDocumentAsyncOptions, type BuildPrintWorkbookDocumentOptions, type BuildPrintWorkbookItem, type BuildPrintWorkbookItemWithSheetId, CALENDAR_PANEL_APPROX_H, type ChartEchartsInstance, type ChartEchartsPort, ChartEmbedHost, type ChartEmbedHostProps as ChartEmbedHostCoreProps, DEFAULT_SHEET_CANVAS_PAINT_PORT, DEFAULT_SHEET_PAINT_PALETTE, EMBED_CELL_INSET_CSS_PX, EMBED_CELL_INSET_PT, type EmbedCellOffset, type EmbedOverlayBox, type EmbedOverlayLayoutPort, type ExportBoundsRowsCols, FILL_HANDLE_PX, FLOATING_PANEL_DEFAULT_W, FLOATING_PANEL_GAP, FLOATING_PANEL_TEXT_H, type FillPattern, InstanceAssetLayer, type InstanceAssetLayerProps, InstanceEmbedLayer, type InstanceEmbedLayerMode, type InstanceEmbedLayerProps, type InstanceFillGuard, type InstancePasteGuard, type InstanceSelectionChromeState, MAX_BORDER_STROKE_WIDTH_PX, type MergeIndex, PANEL_FOLLOW_MODE_DEFAULT, PANEL_FOLLOW_MODE_OPTIONS, PRINT_EXPORT_PRESET, type PaintEmbedsDeps, type PaintEmbedsOptions, type PaintSheetCanvasFrameInput, type PaintVirtualBandBindingOverlay, type PaintVirtualBandOptions, type PanelFollowMode, type PasteCellStyleOptions, type PrintLayoutMode, QrEmbedSlot, type QrEmbedSlotProps, type QrToDataUrlFn, type RasterizeSheetExportOptions, type RasterizeSheetWithEmbedsOptions, type ResolvedEmbedRect, SHEET_ACTIVE_CELL_BG, SHEET_ACTIVE_OUTLINE, SHEET_CANVAS_PACKAGE, SHEET_CLIPBOARD_MIME, SHEET_DATA_BG, SHEET_GRID_LINE_DATA, SHEET_GRID_LINE_HEADER, SHEET_HEADER_BG, SHEET_HEADER_SEL_ACCENT_PX, SHEET_HEADER_SEL_BG, SHEET_INSTANCE_FILL_LOCKED_BG, SHEET_SEL_FILL, SHEET_SEL_STROKE, SHEET_SHADOW_STYLES, type ScrollRevealInput, type SelectionEditChromeFlags, type SelectionHeaderHighlight, type SheetCanvasPaintPort, type SheetCanvasViewport, type SheetClipboardFragmentV1, type SheetDragEndInput, type SheetDragEndOutcome, type SheetDragGuide, type SheetDragMoveInput, type SheetDragMoveOutcome, type SheetDragState, SheetEmbedOverlay, type SheetEmbedOverlayProps, type SheetExportOptions, type SheetExportSizeOptions, type SheetPaintPalette, type SheetPdfRasterOptions, type SheetPointerCursorInput, type SheetPointerDownInput, type SheetPointerDownResult, type SheetScrollPort, type SheetWindowDragListeners, StaticWorkbookSlicePreview, type ViewportPoint, type ViewportRect, type WorkbookPdfSheetSlice, type WorkbookPdfSheetSliceSync, type XlsxToWorkbookLayoutOptions, appendSheetToPdf, appendSheetToPdfAsync, applyFillToSheet, applyMergeSelection, applyRichGridToSheet, applyScriptToRunSubstring, applyTdAlignAttrs, applyTextRunStylePatchToSubstring, assetBoxOverlayBox, assetBoxPrintRect, attachSheetWindowDragListeners, borderStrokeWidth, boundaryAtPlainIndex, buildFillDragState, buildMergeIndex, buildPrintDocument, buildPrintDocumentAsync, buildPrintWorkbookDocument, buildPrintWorkbookDocumentAsync, cellDataFromEdit, cellEditorA1Label, cellStyleFromTableCell, chartSpanOverlayBox, chartSpanPrintRect, clampColumnHeaderDragEnd, clampFloatingPanelPos, clampRowHeaderDragEnd, clampSelection, clampSheetViewZoom, clientToSheetCoords, clipboardItemsToPastePayload, collectEmbedAnchorRect, columnDividerAtX, columnDividerAtXInHeaderRow, computeColumnHeaderPointerSelection, computeDataCellPointerSelection, computeDatePopupPos, computeFillPreviewSelectionInstance, computeFloatingPanelFollowPos, computeResizedColWidth, computeResizedRowHeight, computeRowHeaderPointerSelection, computeScrollToRevealSelection, computeSelectAllCornerSelection, createSheetScrollPort, createSheetWindowDragHandlers, ctxTextMeasurer, denseGridToLogicalPlainGrid, detachSheetWindowDragListeners, downloadExcelFile, downloadSheetAsExcel, downloadWorkbookAsExcel, drawCellBorders, editableHtmlToRuns, effectiveDefaultFontPtForPaint, embedDisplayLabel, ensureMinDimensions, expandMergeSelectionRect, extractClassStyleMapFromDocument, extractFillPattern, fillHandleBlockedByEdit, finalizeCellDataForSave, formatA1, formatSelectionA1, getCellRect, getDisplayRuns, getExcelSheetList, getGridClipBleedPx, getMaster, getMergeRect, getMergedPixelRect, getPlainOffsetsFromSelection, getPrintPageOverlayRects, getSelectionForEditableRoot, getSelectionPixelBounds, getSheetExportSize, getUsedDataBounds, getUsedExportPixelRect, hasMeaningfulRuns, hitTestFillHandle, hitTestToCell, htmlTableToRichGrid, htmlTableToRichGridWithSpans, htmlTableToTsv, insertCol, insertRow, insetOverlayBox, instanceSelectionChromeState, intermediateToSheetState, isCellUsedForPrintBounds, isColumnHeaderRow, isDataCell, isDataCellTextuallyEmpty, isFillHandlePointerDown, isHeaderCorner, isPanelFollowMode, isPointerInVirtualBottomBand, isPointerInVirtualTopBand, isRowHeaderCol, joinRuns, listEmbedAnchorBindings, loadPanelFollowMode, mergeCellStylesLoose, mergeRunStyle, mergeScriptIntoRuns, mergesOverlap, normalizeCellDataValue, normalizeCssColorToHex, normalizeMerge, normalizeRuns, normalizeSelectDragHit, overlayBoxToViewportRect, pageSettingsPrintKey, paintDesignBindingOverlayForDataCell, paintDesignFormulaOverlayForDataCell, paintEmbedsToCanvas, paintSheetCanvasFrame, paintSheetDataCellContent, paintVirtualSheetBand, parseA1, parseA1OrRangeToSelection, parseExcelBufferAllSheets, parseExcelBufferToIntermediate, parseExcelToIntermediate, parseGridRcAddress, parseSpreadsheetInlineCss, parseTsvGrid, pasteCellStyleAndRuns, pasteClipboardInstanceValuesOnly, pasteClipboardIntoSheet, pasteTsvAt, plainLengthToBoundary, preferredWindowDragMoveEvent, processSheetDragEnd, processSheetDragMove, processSheetPointerDown, rasterizeSheetExport, rasterizeSheetExportToCanvas, rasterizeSheetWithEmbeds, readClipboardForSheetPaste, renderSheetExport, resolveChartLayoutRect, resolveChartPrintRect, resolveColResizeDivider, resolveContextMenuCell, resolveFillDragAxis, resolveFormulaPickerRefText, resolveRowResizeDivider, resolveSheetPaintPalette, resolveSheetPointerCursor, rowDividerAtY, rowDividerAtYInHeaderCol, runsFromCellContentRoot, runsToEditableHtml, savePanelFollowMode, selectionBoundsMatchEntireMerge, selectionEditChromeFlags, selectionHeaderHighlightFlags, selectionMatchesMergeMaster, selectionToClipboardPayload, selectionToTsv, setCell, setPlainTextSelection, setupSheetCanvasElement, sheetChrome, sheetToExcelBuffer, sheetToPdfBlob, sheetToPdfBlobAsync, sheetTotalSize, shouldIgnorePointerOutsideMidBand, shouldKeepInlineEditFocus, shouldSkipScrollRevealForSelection, sliceExportCanvasToDataUrls, splitRunsIntoLines, splitTsvLine, strokeHeaderCellGrid, strokeUnmergedCellGrid, virtualBandWorldHeight, visibleColRange, visibleRowRange, visibleRowRangeInBand, workbookToExcelBuffer, workbookToPdfBlob, workbookToPdfBlobAsync, wrapRunsLinesToMaxWidth, writeSheetClipboardPayload, writeSheetToWorksheet, xlsxToWorkbookLayout };
|