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,27 @@
|
|
|
1
|
+
import { CellModel, WorkbookModel } from '../model/types';
|
|
2
|
+
import { CellValue } from '../model/data-access';
|
|
3
|
+
/** 一个被引擎判定为"值变了"的格(含算出的新值)。sheet = 0-based 工作表索引。 */
|
|
4
|
+
export interface DirtyCell {
|
|
5
|
+
sheet: number;
|
|
6
|
+
row: number;
|
|
7
|
+
col: number;
|
|
8
|
+
value: CellValue;
|
|
9
|
+
}
|
|
10
|
+
export interface FormulaEngine {
|
|
11
|
+
/** 用整个工作簿(全表,供跨表引用)初始化引擎。 */
|
|
12
|
+
setSheets(wb: WorkbookModel): void;
|
|
13
|
+
/** 设一个格的内容(公式串 '=...' 或字面值或 null),返回所有受影响格(含依赖级联)。 */
|
|
14
|
+
setCell(sheet: number, row: number, col: number, content: string | number | boolean | null): DirtyCell[];
|
|
15
|
+
/** 读一个格的当前计算值。 */
|
|
16
|
+
getValue(sheet: number, row: number, col: number): CellValue;
|
|
17
|
+
/** 释放引擎资源。 */
|
|
18
|
+
destroy(): void;
|
|
19
|
+
}
|
|
20
|
+
/** 引擎工厂:异步(默认适配器懒 import hyperformula);用方可注入。 */
|
|
21
|
+
export type FormulaEngineFactory = () => Promise<FormulaEngine>;
|
|
22
|
+
/**
|
|
23
|
+
* 取一个格喂给引擎的内容:公式格 → 公式文本(A1 串);值格 → 字面值;空/日期 → 见下。
|
|
24
|
+
* 日期暂以 null 入引擎(v1 不支持公式引用日期格运算,避免类型不匹配;后续可换 Excel 序列号)。
|
|
25
|
+
*/
|
|
26
|
+
export declare function cellContentForEngine(cell: CellModel | null): string | number | boolean | null;
|
|
27
|
+
export type { CellValue };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WorkbookModel } from '../model/types';
|
|
2
|
+
import { DirtyCell, FormulaEngine } from './engine';
|
|
3
|
+
import { CellPos } from '../edit/commands';
|
|
4
|
+
/** 把 editedCells 同步进引擎,收集所有受影响格(含跨表依赖),**不写模型**。 */
|
|
5
|
+
export declare function collectDirty(engine: FormulaEngine, wb: WorkbookModel, activeSheet: number, editedCells: CellPos[]): DirtyCell[];
|
|
6
|
+
/** 把脏格的计算值写回各自模型表(只改 raw)。 */
|
|
7
|
+
export declare function writeDirty(wb: WorkbookModel, dirty: DirtyCell[]): void;
|
|
8
|
+
/** 活动表上、由级联产生(非直接编辑)的脏格 —— 供逐格发 cell-change。 */
|
|
9
|
+
export declare function dependentsOnSheet(dirty: DirtyCell[], activeSheet: number, editedCells: CellPos[]): CellPos[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { WorkbookModel } from '../model/types';
|
|
2
|
+
import { StructOp } from '../model/structure';
|
|
3
|
+
export type ShiftAxis = 'row' | 'col';
|
|
4
|
+
export interface ShiftSpec {
|
|
5
|
+
axis: ShiftAxis;
|
|
6
|
+
/** 0-based 模型索引:插入/删除发生的位置 */
|
|
7
|
+
at: number;
|
|
8
|
+
count: number;
|
|
9
|
+
mode: 'insert' | 'delete';
|
|
10
|
+
/** 结构操作发生在哪张表(名);仅指向它的引用才重写 */
|
|
11
|
+
targetSheet: string;
|
|
12
|
+
/** 该公式所在表(名);无 `Sheet!` 限定的引用归属它 */
|
|
13
|
+
formulaSheet: string;
|
|
14
|
+
}
|
|
15
|
+
/** 重写一条公式串里所有指向 targetSheet 的引用以适配增删行列。前导 `=` 原样保留。 */
|
|
16
|
+
export declare function shiftFormulaRefs(formula: string, spec: ShiftSpec): string;
|
|
17
|
+
/**
|
|
18
|
+
* 增删行列后,重写**全簿**所有公式格里指向 targetSheet 的引用(含跨表 `Sheet!A1`)。
|
|
19
|
+
* 就地改 cell.formula;撤销由结构命令的整簿快照负责。
|
|
20
|
+
*/
|
|
21
|
+
export declare function rewriteWorkbookFormulas(wb: WorkbookModel, targetSheetIdx: number, op: StructOp, at: number, count: number): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 框架无关 core 入口(供 'ooxml-excel-editor/core' 及 Vue / React 壳复用)。
|
|
3
|
+
* 这里只暴露引擎 + 解析 + 数据 + 类型,零框架依赖 —— Vue/React 各自的壳在上层包。
|
|
4
|
+
*/
|
|
5
|
+
export { parseWorkbook } from './parser';
|
|
6
|
+
export { loadArrayBuffer } from './loader';
|
|
7
|
+
export type { ExcelSource } from './loader';
|
|
8
|
+
export { detectFormat, finalizeImages, friendlyError, revokeImages } from './finalize';
|
|
9
|
+
export type { ParseProgress } from './progress';
|
|
10
|
+
export { cellDisplayText, getCell, getCellValue, getCellStyle, getCellText, getSheetData, getRangeData, sheetToJSON, getWorkbookJSON, } from './model/data-access';
|
|
11
|
+
export type { CellValue, ReadOptions, SheetToJSONOptions } from './model/data-access';
|
|
12
|
+
export { cellKey } from './model/types';
|
|
13
|
+
export type { WorkbookModel, SheetModel, CellModel, CellStyle, MergeRange, ConditionalRule, ChartSpec, ImageAnchor, ShapeSpec, Sparkline, CssColor, TransformModelFn, CellStyleFn, CellStyleOverride, } from './model/types';
|
|
14
|
+
export { CanvasRenderer } from './render/canvas-renderer';
|
|
15
|
+
export type { ViewState, RendererOptions } from './render/canvas-renderer';
|
|
16
|
+
export { ViewerController } from './viewer/controller';
|
|
17
|
+
export type { Cell, TooltipState, FindState, FilterPopupState, ViewerControllerEls, ViewerControllerHooks, } from './viewer/controller';
|
|
18
|
+
export { OverlayManager } from './viewer/overlay-manager';
|
|
19
|
+
export type { OverlayQuads } from './viewer/overlay-manager';
|
|
20
|
+
export { PluginOverlayHost } from './viewer/plugin-overlay';
|
|
21
|
+
export { resolveEditable } from './edit/permissions';
|
|
22
|
+
export type { EditConfig, EditPermission } from './edit/types';
|
|
23
|
+
export { EditController } from './edit/edit-controller';
|
|
24
|
+
export type { EditControllerHost, EditEventName, EditSource, CellChangePayload, DimChangePayload, DirtyChangePayload, ImageChangePayload, StructChangePayload, } from './edit/edit-controller';
|
|
25
|
+
export { isDimCommand, isImageCommand, isStructCommand } from './edit/commands';
|
|
26
|
+
export type { EditCommand, CellPos, DimAxis } from './edit/commands';
|
|
27
|
+
export { insertRows, deleteRows, insertCols, deleteCols, captureStructure, restoreStructure, deleteIntersectsMerge, } from './model/structure';
|
|
28
|
+
export type { StructOp, StructSnapshot } from './model/structure';
|
|
29
|
+
export { toCsv, toWorkbookJson } from './export/data-export';
|
|
30
|
+
export { workbookToXlsxBlob } from './export/xlsx-writer';
|
|
31
|
+
export type { XlsxExportOptions } from './export/xlsx-writer';
|
|
32
|
+
export { buildCellSnapshot, cloneCell } from './model/snapshot';
|
|
33
|
+
export type { CellSnapshot } from './model/snapshot';
|
|
34
|
+
export { setCellValue, clearCell, setRangeValues, restoreCell, internStyle, setColumnWidth, setRowHeight, restoreDimension, applyStyleOverride, mergeStyleOverride, addImage, removeImage, setImageRect, cloneImageAnchor, } from './model/mutations';
|
|
35
|
+
export { cloneWorkbook, restoreWorkbookInto } from './model/clone';
|
|
36
|
+
export { cellContentForEngine } from './formula/engine';
|
|
37
|
+
export type { FormulaEngine, FormulaEngineFactory, DirtyCell } from './formula/engine';
|
|
38
|
+
export { defaultFormulaEngineFactory } from './formula/hyperformula-adapter';
|
|
39
|
+
export { shiftFormulaRefs, rewriteWorkbookFormulas } from './formula/refs';
|
|
40
|
+
export type { ShiftSpec, ShiftAxis } from './formula/refs';
|
|
41
|
+
export { CellEditorHost } from './edit/editor-host';
|
|
42
|
+
export type { CellEditorContext, CellEditorFactory, EditorResolver, EditorCommitValue } from './edit/editor-context';
|
|
43
|
+
export { definePlugin } from './plugin';
|
|
44
|
+
export type { ExcelPlugin, ExcelPluginContext, OverlayContext, OverlayNode, PluginEvent, Rect, ToolbarItem, ViewerApi, } from './plugin';
|
|
45
|
+
export { GridMetrics, colIndexToLetters } from './layout/grid-metrics';
|
|
46
|
+
export { formatValue } from './format/number-format';
|
|
47
|
+
export { DEFAULT_THEME, mergeTheme } from './render/theme';
|
|
48
|
+
export type { ViewerTheme } from './render/theme';
|
|
49
|
+
export { WorkbookExporter } from './export/exporter';
|
|
50
|
+
export type { ExporterHost } from './export/exporter';
|
|
51
|
+
export { canvasToBlob, canvasToDataURL, downloadBlob } from './export/raster';
|
|
52
|
+
export type { ExportTarget, RenderExportOptions, ImageExportOptions, PdfExportOptions, PrintOptions, PageSetup, PageFormat, Orientation, Margins, PdfPageContext, BeforeRenderPage, } from './export/types';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SheetModel } from '../model/types';
|
|
2
|
+
import { GridMetrics } from './grid-metrics';
|
|
3
|
+
export interface FreezeGeometry {
|
|
4
|
+
frozenRows: number;
|
|
5
|
+
frozenCols: number;
|
|
6
|
+
/** 冻结列总宽 px(网格坐标) */
|
|
7
|
+
frozenWidth: number;
|
|
8
|
+
/** 冻结行总高 px */
|
|
9
|
+
frozenHeight: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function computeFreeze(sheet: SheetModel, metrics: GridMetrics): FreezeGeometry;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SheetModel } from '../model/types';
|
|
2
|
+
export declare class GridMetrics {
|
|
3
|
+
private sheet;
|
|
4
|
+
readonly cols: number;
|
|
5
|
+
readonly rows: number;
|
|
6
|
+
/** 行表头(显示行号)宽度 px */
|
|
7
|
+
readonly rowHeaderWidth: number;
|
|
8
|
+
/** 列表头(显示列字母)高度 px */
|
|
9
|
+
readonly colHeaderHeight: number;
|
|
10
|
+
private colLefts;
|
|
11
|
+
private rowTops;
|
|
12
|
+
private colWidths;
|
|
13
|
+
private rowHeights;
|
|
14
|
+
/** 当前缩放比例(几何与字体同步按它缩放,保证缩放后排版一致) */
|
|
15
|
+
readonly zoom: number;
|
|
16
|
+
constructor(sheet: SheetModel, zoom?: number);
|
|
17
|
+
colWidth(c: number): number;
|
|
18
|
+
rowHeight(r: number): number;
|
|
19
|
+
private get dcw();
|
|
20
|
+
private get drh();
|
|
21
|
+
/** 第 c 列左边缘(网格坐标,不含表头)。超出数据范围按默认列宽外推(模拟 Excel 无限网格)。 */
|
|
22
|
+
colLeft(c: number): number;
|
|
23
|
+
rowTop(r: number): number;
|
|
24
|
+
get totalWidth(): number;
|
|
25
|
+
get totalHeight(): number;
|
|
26
|
+
/** 给定网格 x 坐标,返回所在列。超出数据范围按默认列宽外推。 */
|
|
27
|
+
colAt(x: number): number;
|
|
28
|
+
rowAt(y: number): number;
|
|
29
|
+
/** 数据单元格的可视区列区间(end 限制在数据范围内,避免画空 cell) */
|
|
30
|
+
visibleColRange(scrollX: number, viewW: number): [number, number];
|
|
31
|
+
visibleRowRange(scrollY: number, viewH: number): [number, number];
|
|
32
|
+
/** 网格线/表头的可视区列区间(可超出数据范围,铺满视口,模拟 Excel) */
|
|
33
|
+
gridColRange(scrollX: number, viewW: number): [number, number];
|
|
34
|
+
gridRowRange(scrollY: number, viewH: number): [number, number];
|
|
35
|
+
}
|
|
36
|
+
/** 0-based 列号 → Excel 列字母(A, B, ..., Z, AA, ...) */
|
|
37
|
+
export declare function colIndexToLetters(index: number): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MergeRange, SheetModel } from '../model/types';
|
|
2
|
+
export declare class MergeIndex {
|
|
3
|
+
/** key `${row}:${col}` → 该 cell 所属的合并区(任意成员都能查到) */
|
|
4
|
+
private map;
|
|
5
|
+
/** 锚点(左上角) key 集合 */
|
|
6
|
+
private anchors;
|
|
7
|
+
constructor(sheet: SheetModel);
|
|
8
|
+
/** 该 cell 所在的合并区(没有返回 undefined) */
|
|
9
|
+
rangeOf(row: number, col: number): MergeRange | undefined;
|
|
10
|
+
/** 是否合并区锚点(左上角,渲染内容的那个) */
|
|
11
|
+
isAnchor(row: number, col: number): boolean;
|
|
12
|
+
/** 是否被合并覆盖但不是锚点(渲染时跳过内容) */
|
|
13
|
+
isCovered(row: number, col: number): boolean;
|
|
14
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** OOXML 单位换算常量与函数。 */
|
|
2
|
+
/** 默认字体(Calibri 11)的最大数字宽度,单位 px。Excel 列宽换算的基准。 */
|
|
3
|
+
export declare const DEFAULT_MDW = 7;
|
|
4
|
+
/** 屏幕 DPI / 印刷 DPI */
|
|
5
|
+
export declare const PX_PER_POINT: number;
|
|
6
|
+
/** 1 px = 9525 EMU (914400 EMU/inch ÷ 96 px/inch) */
|
|
7
|
+
export declare const EMU_PER_PX = 9525;
|
|
8
|
+
export declare const DEFAULT_COL_WIDTH_CHARS = 8.43;
|
|
9
|
+
export declare const DEFAULT_ROW_HEIGHT_PT = 15;
|
|
10
|
+
/**
|
|
11
|
+
* Excel 列宽(字符数) → 像素。
|
|
12
|
+
* px = Truncate(width * MDW + 0.5) + 5
|
|
13
|
+
* 末尾 +5 是单元格内边距(左右各 2px + 1px 网格线)。这是 Excel 实际渲染宽度,
|
|
14
|
+
* 早期只用 Truncate(width*MDW) 会每列偏窄 5px(默认 8.43 → 64px 才对)。
|
|
15
|
+
*/
|
|
16
|
+
export declare function colWidthToPx(chars: number, mdw?: number): number;
|
|
17
|
+
/** 行高(pt) → 像素 */
|
|
18
|
+
export declare function rowHeightToPx(pt: number): number;
|
|
19
|
+
export declare function emuToPx(emu: number): number;
|
|
20
|
+
export declare function pxToEmu(px: number): number;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { GridMetrics } from './grid-metrics';
|
|
2
|
+
import { FreezeGeometry } from './freeze';
|
|
3
|
+
export interface Pane {
|
|
4
|
+
/** 屏幕坐标裁剪区(含表头偏移之后) */
|
|
5
|
+
clipX: number;
|
|
6
|
+
clipY: number;
|
|
7
|
+
clipW: number;
|
|
8
|
+
clipH: number;
|
|
9
|
+
/** 该 pane 绘制内容时减去的滚动量(冻结区为 0) */
|
|
10
|
+
offsetX: number;
|
|
11
|
+
offsetY: number;
|
|
12
|
+
/** 行列区间 [startCol,endCol] / [startRow,endRow] */
|
|
13
|
+
colStart: number;
|
|
14
|
+
colEnd: number;
|
|
15
|
+
rowStart: number;
|
|
16
|
+
rowEnd: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ViewportLayout {
|
|
19
|
+
panes: Pane[];
|
|
20
|
+
rowHeaderWidth: number;
|
|
21
|
+
colHeaderHeight: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @param scrollX 可滚动区横向滚动量
|
|
25
|
+
* @param scrollY 可滚动区纵向滚动量
|
|
26
|
+
* @param viewW 画布 css 宽
|
|
27
|
+
* @param viewH 画布 css 高
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeViewport(metrics: GridMetrics, freeze: FreezeGeometry, scrollX: number, scrollY: number, viewW: number, viewH: number): ViewportLayout;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** 把多种输入归一化成 ArrayBuffer,供解析层使用。可选 onProgress 报字节读取进度。 */
|
|
2
|
+
export type ExcelSource = File | Blob | ArrayBuffer | Uint8Array | string;
|
|
3
|
+
/** 读取进度回调: loaded/total 字节(total 为 0 表示未知) */
|
|
4
|
+
export type ReadProgressFn = (loaded: number, total: number) => void;
|
|
5
|
+
export declare function loadArrayBuffer(src: ExcelSource, onProgress?: ReadProgressFn): Promise<ArrayBuffer>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WorkbookModel } from './types';
|
|
2
|
+
/** 深克隆整个工作簿(供 editable 时懒捕获 baseline)。 */
|
|
3
|
+
export declare function cloneWorkbook(wb: WorkbookModel): WorkbookModel;
|
|
4
|
+
/**
|
|
5
|
+
* 把 baseline(snap)的内容就地还原进 live(不换 live / live.sheets / 各 sheet 的对象身份)。
|
|
6
|
+
* 每次都对 snap 取一份新克隆,故 baseline 自身保持原始、可重复还原。
|
|
7
|
+
* 约定:editing 期间不增删 sheet,故按 index 对齐;多出的 live sheet 不动。
|
|
8
|
+
*/
|
|
9
|
+
export declare function restoreWorkbookInto(live: WorkbookModel, snap: WorkbookModel): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CellModel, CellStyle, MergeRange, SheetModel, WorkbookModel } from './types';
|
|
2
|
+
export type CellValue = number | string | boolean | Date | null;
|
|
3
|
+
export interface ReadOptions {
|
|
4
|
+
/** true(默认)=格式化显示文本;false=原始值 */
|
|
5
|
+
format?: boolean;
|
|
6
|
+
/** 1904 日期系统(组件 ref 方法会自动带上;独立调用时从 workbook.date1904 取) */
|
|
7
|
+
date1904?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** 单元格显示文本(套数字/日期格式;富文本拼接)。纯函数,渲染器与数据 API 共用。 */
|
|
10
|
+
export declare function cellDisplayText(cell: CellModel | undefined, style: CellStyle | undefined, date1904: boolean): string;
|
|
11
|
+
/** 取单元格模型(Map 之上的便捷封装) */
|
|
12
|
+
export declare function getCell(sheet: SheetModel, row: number, col: number): CellModel | undefined;
|
|
13
|
+
/** 取单元格原始值(number/boolean/Date/string/null) */
|
|
14
|
+
export declare function getCellValue(sheet: SheetModel, row: number, col: number): CellValue;
|
|
15
|
+
/** 取单元格解析后的样式(经 styleId);无则 undefined */
|
|
16
|
+
export declare function getCellStyle(sheet: SheetModel, row: number, col: number): CellStyle | undefined;
|
|
17
|
+
/** 取单元格格式化显示文本 */
|
|
18
|
+
export declare function getCellText(sheet: SheetModel, row: number, col: number, date1904?: boolean): string;
|
|
19
|
+
/** 整表 → 稠密二维数组(dimension.rows × dimension.cols)。空格为 ''(文本)/ null(值)。 */
|
|
20
|
+
export declare function getSheetData(sheet: SheetModel, opts?: ReadOptions): CellValue[][];
|
|
21
|
+
/** 区域 → 二维数组(行×列,0-based 闭区间) */
|
|
22
|
+
export declare function getRangeData(sheet: SheetModel, range: MergeRange, opts?: ReadOptions): CellValue[][];
|
|
23
|
+
export interface SheetToJSONOptions extends ReadOptions {
|
|
24
|
+
/** 表头所在行(0-based,默认 0);数据从其下一行起 */
|
|
25
|
+
headerRow?: number;
|
|
26
|
+
}
|
|
27
|
+
/** 整表 → 对象数组(首行作 key)。空表头回退列字母;整行皆空则跳过。 */
|
|
28
|
+
export declare function sheetToJSON(sheet: SheetModel, opts?: SheetToJSONOptions): Record<string, CellValue>[];
|
|
29
|
+
/** 全簿 → { 表名: 对象数组 }(可见表;自动用 workbook.date1904) */
|
|
30
|
+
export declare function getWorkbookJSON(workbook: WorkbookModel, opts?: SheetToJSONOptions): Record<string, Record<string, CellValue>[]>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { CellModel, CellStyle, CellStyleOverride, ColumnInfo, ImageAnchor, MergeRange, RowInfo, SheetModel } from './types';
|
|
2
|
+
import { CellValue } from './data-access';
|
|
3
|
+
/** 设单元格值。返回旧 CellModel(克隆,供 undo);新值为空则删除该格。 */
|
|
4
|
+
export declare function setCellValue(sheet: SheetModel, row: number, col: number, value: CellValue): void;
|
|
5
|
+
/** 清空单元格(删除该格,保留 dimension)。 */
|
|
6
|
+
export declare function clearCell(sheet: SheetModel, row: number, col: number): void;
|
|
7
|
+
/** 区域批量设值(2D,左上对齐 range.top/left)。 */
|
|
8
|
+
export declare function setRangeValues(sheet: SheetModel, range: MergeRange, values: CellValue[][]): void;
|
|
9
|
+
/**
|
|
10
|
+
* 写回公式引擎算出的结果(只改 raw,保留 formula/type/styleId/rich)。
|
|
11
|
+
* 公式格:raw = 计算值(显示用 raw);被公式引用的值格:不变(raw 已是其值)。空格跳过。
|
|
12
|
+
*/
|
|
13
|
+
export declare function setCellComputed(sheet: SheetModel, row: number, col: number, value: CellValue): void;
|
|
14
|
+
/** 直接写回/删除一个格的底层 CellModel(命令逆向用:精确还原前态)。 */
|
|
15
|
+
export declare function restoreCell(sheet: SheetModel, row: number, col: number, cell: CellModel | null): void;
|
|
16
|
+
/** 设列宽(px,非缩放存储);保留 hidden。 */
|
|
17
|
+
export declare function setColumnWidth(sheet: SheetModel, col: number, width: number): void;
|
|
18
|
+
/** 设行高(px,非缩放存储);保留 hidden。 */
|
|
19
|
+
export declare function setRowHeight(sheet: SheetModel, row: number, height: number): void;
|
|
20
|
+
/** 浅克隆 ImageAnchor(共享不可变的 bytes/src,省内存;命令逆向 / 拖拽起始态用)。 */
|
|
21
|
+
export declare function cloneImageAnchor(a: ImageAnchor): ImageAnchor;
|
|
22
|
+
/** 加一张图(index 缺省追加到末尾),返回插入位置。 */
|
|
23
|
+
export declare function addImage(sheet: SheetModel, anchor: ImageAnchor, index?: number): number;
|
|
24
|
+
/** 删一张图(调用方负责为 undo 捕获前态)。 */
|
|
25
|
+
export declare function removeImage(sheet: SheetModel, index: number): void;
|
|
26
|
+
/**
|
|
27
|
+
* 设图片的内容矩形(zoom 后像素,content 坐标)→ 规整为原点相对 oneCellAnchor。
|
|
28
|
+
* 像素↔EMU:left_px = emuToPx(colOffEmu)*zoom ⇒ colOffEmu = pxToEmu(left/zoom)。不依赖列/行几何。
|
|
29
|
+
*/
|
|
30
|
+
export declare function setImageRect(sheet: SheetModel, index: number, rect: {
|
|
31
|
+
left: number;
|
|
32
|
+
top: number;
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
}, zoom: number): void;
|
|
36
|
+
/** 直接写回/删除一个列/行的维度信息(命令逆向用:精确还原前态;null=删 Map 项回落默认宽高)。 */
|
|
37
|
+
export declare function restoreDimension(sheet: SheetModel, axis: 'col' | 'row', index: number, info: ColumnInfo | RowInfo | null): void;
|
|
38
|
+
/** 样式去重入表,返回 styleId(E5 样式编辑用;深比较已存在则复用)。 */
|
|
39
|
+
export declare function internStyle(sheet: SheetModel, style: CellStyle): number;
|
|
40
|
+
/** 合并样式覆盖到完整样式: font/fill/borders 浅合并,其余字段覆盖(单一真相源,渲染与编辑共用)。 */
|
|
41
|
+
export declare function mergeStyleOverride(base: CellStyle, over: CellStyleOverride): CellStyle;
|
|
42
|
+
/**
|
|
43
|
+
* 给一个格套样式覆盖(E5):取基样式 → 合并 → intern → 改 styleId。
|
|
44
|
+
* 空格(不在 Map)→ 以默认样式为基,新建一个 type='empty' 的格承载 styleId(像 Excel 给空格上色)。
|
|
45
|
+
*/
|
|
46
|
+
export declare function applyStyleOverride(sheet: SheetModel, row: number, col: number, patch: CellStyleOverride): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CellModel, CellStyle, SheetModel } from './types';
|
|
2
|
+
import { CellValue } from './data-access';
|
|
3
|
+
export interface CellSnapshot {
|
|
4
|
+
row: number;
|
|
5
|
+
col: number;
|
|
6
|
+
cell: CellModel | null;
|
|
7
|
+
style: CellStyle | undefined;
|
|
8
|
+
raw: CellValue;
|
|
9
|
+
computed: CellValue;
|
|
10
|
+
text: string;
|
|
11
|
+
}
|
|
12
|
+
/** 深克隆 CellModel(raw 的 Date / rich 数组都拷,避免前后快照共享引用) */
|
|
13
|
+
export declare function cloneCell(c: CellModel): CellModel;
|
|
14
|
+
export declare function buildCellSnapshot(sheet: SheetModel, row: number, col: number, date1904: boolean): CellSnapshot;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CellModel, ColumnInfo, ImageAnchor, MergeRange, RowInfo, SheetModel } from './types';
|
|
2
|
+
export type StructOp = 'insert-rows' | 'delete-rows' | 'insert-cols' | 'delete-cols';
|
|
3
|
+
/** 整张表结构状态快照(供撤销整体还原) */
|
|
4
|
+
export interface StructSnapshot {
|
|
5
|
+
cells: Map<string, CellModel>;
|
|
6
|
+
merges: MergeRange[];
|
|
7
|
+
rows: Map<number, RowInfo>;
|
|
8
|
+
columns: Map<number, ColumnInfo>;
|
|
9
|
+
images: ImageAnchor[];
|
|
10
|
+
dimension: {
|
|
11
|
+
rows: number;
|
|
12
|
+
cols: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** 拍快照(深克隆;images 浅克隆共享 bytes)。 */
|
|
16
|
+
export declare function captureStructure(sheet: SheetModel): StructSnapshot;
|
|
17
|
+
/** 把快照就地还原进 sheet(替换其集合引用,保 sheet 对象身份;再克隆一份保快照可重复用)。 */
|
|
18
|
+
export declare function restoreStructure(sheet: SheetModel, snap: StructSnapshot): void;
|
|
19
|
+
export declare function insertRows(sheet: SheetModel, at: number, count: number): void;
|
|
20
|
+
export declare function deleteRows(sheet: SheetModel, at: number, count: number): void;
|
|
21
|
+
export declare function insertCols(sheet: SheetModel, at: number, count: number): void;
|
|
22
|
+
export declare function deleteCols(sheet: SheetModel, at: number, count: number): void;
|
|
23
|
+
/** 应用一个结构操作(分发)。 */
|
|
24
|
+
export declare function applyStructOp(sheet: SheetModel, op: StructOp, at: number, count: number): void;
|
|
25
|
+
/** 删除段是否与任一合并区相交(controller 据此给"会丢合并"警告,仿 sortColumn 守卫)。 */
|
|
26
|
+
export declare function deleteIntersectsMerge(sheet: SheetModel, op: 'delete-rows' | 'delete-cols', at: number, count: number): boolean;
|