@visactor/vtable-sheet 1.20.0-alpha.3 → 1.20.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/README.md +173 -0
- package/cjs/components/vtable-sheet.d.ts +2 -0
- package/cjs/components/vtable-sheet.js +45 -13
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +1 -0
- package/cjs/core/WorkSheet.js +32 -7
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/event-manager.d.ts +7 -8
- package/cjs/event/event-manager.js +2 -11
- package/cjs/event/event-manager.js.map +1 -1
- package/cjs/formula/formula-autocomplete.js.map +1 -1
- package/cjs/formula/formula-editor.js.map +1 -1
- package/cjs/formula/formula-engine.d.ts +102 -0
- package/cjs/formula/formula-engine.js +1028 -0
- package/cjs/formula/formula-engine.js.map +1 -0
- package/cjs/formula/formula-helper.js +1 -1
- package/cjs/formula/formula-helper.js.map +1 -1
- package/cjs/formula/formula-range-selector.d.ts +5 -2
- package/cjs/formula/formula-range-selector.js +70 -15
- package/cjs/formula/formula-range-selector.js.map +1 -1
- package/cjs/formula/formula-ui-manager.js +7 -4
- package/cjs/formula/formula-ui-manager.js.map +1 -1
- package/cjs/formula/index.js +1 -2
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +19 -16
- package/cjs/managers/formula-manager.js +71 -183
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/tools/env.js.map +1 -1
- package/cjs/ts-types/event.d.ts +77 -68
- package/cjs/ts-types/event.js +6 -1
- package/cjs/ts-types/event.js.map +1 -1
- package/dist/vtable-sheet.js +73155 -109724
- package/dist/vtable-sheet.min.js +1 -853
- package/es/components/vtable-sheet.d.ts +2 -0
- package/es/components/vtable-sheet.js +46 -12
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +1 -0
- package/es/core/WorkSheet.js +32 -5
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/event-manager.d.ts +7 -8
- package/es/event/event-manager.js +2 -11
- package/es/event/event-manager.js.map +1 -1
- package/es/formula/formula-autocomplete.js.map +1 -1
- package/es/formula/formula-editor.js.map +1 -1
- package/es/formula/formula-engine.d.ts +102 -0
- package/es/formula/formula-engine.js +1020 -0
- package/es/formula/formula-engine.js.map +1 -0
- package/es/formula/formula-helper.js +1 -1
- package/es/formula/formula-helper.js.map +1 -1
- package/es/formula/formula-range-selector.d.ts +5 -2
- package/es/formula/formula-range-selector.js +70 -15
- package/es/formula/formula-range-selector.js.map +1 -1
- package/es/formula/formula-ui-manager.js +7 -4
- package/es/formula/formula-ui-manager.js.map +1 -1
- package/es/formula/index.js +1 -2
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +19 -16
- package/es/managers/formula-manager.js +72 -184
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.js.map +1 -1
- package/es/tools/env.js.map +1 -1
- package/es/ts-types/event.d.ts +77 -68
- package/es/ts-types/event.js +6 -1
- package/es/ts-types/event.js.map +1 -1
- package/package.json +6 -7
- package/cjs/test/formula-complete.test.d.ts +0 -1
- package/cjs/test/formula-complete.test.js +0 -42
- package/cjs/test/formula-complete.test.js.map +0 -1
- package/es/test/formula-complete.test.d.ts +0 -1
- package/es/test/formula-complete.test.js +0 -36
- package/es/test/formula-complete.test.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# VTable Sheet Component
|
|
2
|
+
|
|
3
|
+
VTable Sheet is a powerful Excel-like spreadsheet component based on VTable. It provides Excel-like features including multiple sheets, formulas, cell styling, and more.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Multiple sheet support
|
|
8
|
+
- Formula calculation using HyperFormula
|
|
9
|
+
- Cell formatting
|
|
10
|
+
- Cell merging
|
|
11
|
+
- Sheet operations (add, rename, delete)
|
|
12
|
+
- Formula bar with auto-completion
|
|
13
|
+
- And more...
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @visactor/vtable-sheet
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import VTableSheet from '@visactor/vtable-sheet';
|
|
25
|
+
|
|
26
|
+
// Create a new VTableSheet instance
|
|
27
|
+
const vtableSheet = new VTableSheet(container, {
|
|
28
|
+
sheets: [
|
|
29
|
+
{
|
|
30
|
+
sheetKey: 'sheet1',
|
|
31
|
+
sheetTitle: 'Sheet 1',
|
|
32
|
+
columnCount: 10,
|
|
33
|
+
rowCount: 20,
|
|
34
|
+
data: [],
|
|
35
|
+
active: true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
showFormulaBar: true,
|
|
39
|
+
showSheetTab: true
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
VTableSheet accepts the following configuration options:
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
interface IVTableSheetOptions {
|
|
49
|
+
/** Sheet list */
|
|
50
|
+
sheets: ISheetDefine[];
|
|
51
|
+
/** Whether to show toolbar */
|
|
52
|
+
showToolbar?: boolean;
|
|
53
|
+
/** Whether to show formula bar */
|
|
54
|
+
showFormulaBar?: boolean;
|
|
55
|
+
/** Whether to show sheet tab bar */
|
|
56
|
+
showSheetTab?: boolean;
|
|
57
|
+
/** Plugins */
|
|
58
|
+
VTablePluginModules?: {
|
|
59
|
+
module: any;
|
|
60
|
+
moduleOptions?: any;
|
|
61
|
+
disabled?: boolean;
|
|
62
|
+
}[];
|
|
63
|
+
/** Main menu */
|
|
64
|
+
mainMenu?: {
|
|
65
|
+
show?: boolean;
|
|
66
|
+
items?: MainMenuItem[];
|
|
67
|
+
};
|
|
68
|
+
/** Theme */
|
|
69
|
+
theme?: IThemeDefine;
|
|
70
|
+
/** Default row height */
|
|
71
|
+
defaultRowHeight?: number;
|
|
72
|
+
/** Default column width */
|
|
73
|
+
defaultColWidth?: number;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Working with Formulas
|
|
78
|
+
|
|
79
|
+
VTableSheet supports Excel-like formulas powered by [HyperFormula](https://github.com/handsontable/hyperformula).
|
|
80
|
+
|
|
81
|
+
### Formula Storage and Persistence
|
|
82
|
+
|
|
83
|
+
When saving the sheet configuration, formulas are automatically saved in the sheet definition.
|
|
84
|
+
This allows for persisting and loading formulas when the sheet is re-initialized.
|
|
85
|
+
|
|
86
|
+
The formula data is stored in the `formulas` property of each sheet definition as a map
|
|
87
|
+
of cell references (A1 notation) to formula strings:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
{
|
|
91
|
+
sheetKey: 'sheet1',
|
|
92
|
+
sheetTitle: 'Sheet 1',
|
|
93
|
+
// ... other sheet properties
|
|
94
|
+
formulas: {
|
|
95
|
+
'A1': '=SUM(B1:B5)',
|
|
96
|
+
'C1': '=AVERAGE(D1:D10)',
|
|
97
|
+
// ... more formulas
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Saving Sheet Configuration
|
|
103
|
+
|
|
104
|
+
To save the current state of all sheets including formulas:
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const config = vtableSheet.saveToConfig();
|
|
108
|
+
console.log(config);
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
This will produce a complete configuration object that can be used to recreate the sheet later.
|
|
112
|
+
|
|
113
|
+
### Loading Sheet with Formulas
|
|
114
|
+
|
|
115
|
+
When initializing VTableSheet with a saved configuration that includes formulas, the formulas
|
|
116
|
+
will be automatically loaded and evaluated:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
const savedConfig = {
|
|
120
|
+
sheets: [
|
|
121
|
+
{
|
|
122
|
+
sheetKey: 'sheet1',
|
|
123
|
+
sheetTitle: 'Sheet 1',
|
|
124
|
+
data: [["Value", 10], ["Value", 20]],
|
|
125
|
+
formulas: {
|
|
126
|
+
'C1': '=SUM(B1:B2)'
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const vtableSheet = new VTableSheet(container, savedConfig);
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## API Reference
|
|
136
|
+
|
|
137
|
+
### Methods
|
|
138
|
+
|
|
139
|
+
- `saveToConfig()`: Saves the current state of all sheets to a configuration object.
|
|
140
|
+
- `getActiveSheet()`: Gets the currently active worksheet.
|
|
141
|
+
- `activateSheet(sheetKey: string)`: Activates the specified sheet.
|
|
142
|
+
- `addSheet(sheet: ISheetDefine)`: Adds a new sheet.
|
|
143
|
+
- `removeSheet(sheetKey: string)`: Removes a sheet.
|
|
144
|
+
- And more...
|
|
145
|
+
|
|
146
|
+
## Example
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
// Create a VTableSheet with a formula
|
|
150
|
+
const vtableSheet = new VTableSheet(document.getElementById('container'), {
|
|
151
|
+
sheets: [
|
|
152
|
+
{
|
|
153
|
+
sheetKey: 'sheet1',
|
|
154
|
+
sheetTitle: 'Sheet 1',
|
|
155
|
+
columnCount: 5,
|
|
156
|
+
rowCount: 10,
|
|
157
|
+
data: [
|
|
158
|
+
["Item", "Value"],
|
|
159
|
+
["A", 10],
|
|
160
|
+
["B", 20],
|
|
161
|
+
["C", 30]
|
|
162
|
+
],
|
|
163
|
+
formulas: {
|
|
164
|
+
'B5': '=SUM(B2:B4)'
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// Later, save the state including any user-entered formulas
|
|
171
|
+
const savedState = vtableSheet.saveToConfig();
|
|
172
|
+
localStorage.setItem('spreadsheet-state', JSON.stringify(savedState));
|
|
173
|
+
```
|
|
@@ -45,6 +45,8 @@ export default class VTableSheet {
|
|
|
45
45
|
getSheet(sheetKey: string): ISheetDefine | null;
|
|
46
46
|
getAllSheets(): ISheetDefine[];
|
|
47
47
|
private createWorkSheetInstance;
|
|
48
|
+
private loadFormulas;
|
|
49
|
+
private parseCellKey;
|
|
48
50
|
private restoreFilterState;
|
|
49
51
|
private _addNewSheet;
|
|
50
52
|
private updateFormulaBar;
|
|
@@ -41,7 +41,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
41
41
|
value: !0
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"), event_manager_1 = require("../event/event-manager"), snackbar_1 = require("../tools/ui/snackbar"), tab_drag_manager_1 = __importDefault(require("../managers/tab-drag-manager")), tools_1 = require("../tools"), formula_autocomplete_1 = require("../formula/formula-autocomplete"), formula_editor_1 = require("../formula/formula-editor"), menu_manager_1 = require("../managers/menu-manager"), formula_ui_manager_1 = require("../formula/formula-ui-manager");
|
|
44
|
+
const formula_manager_1 = require("../managers/formula-manager"), sheet_manager_1 = __importDefault(require("../managers/sheet-manager")), WorkSheet_1 = require("../core/WorkSheet"), VTable = __importStar(require("@visactor/vtable")), table_plugins_1 = require("../core/table-plugins"), event_manager_1 = require("../event/event-manager"), snackbar_1 = require("../tools/ui/snackbar"), ts_types_1 = require("../ts-types"), tab_drag_manager_1 = __importDefault(require("../managers/tab-drag-manager")), tools_1 = require("../tools"), formula_autocomplete_1 = require("../formula/formula-autocomplete"), formula_editor_1 = require("../formula/formula-editor"), menu_manager_1 = require("../managers/menu-manager"), formula_ui_manager_1 = require("../formula/formula-ui-manager");
|
|
45
45
|
|
|
46
46
|
VTable.register.editor("formula", formula_editor_1.formulaEditor);
|
|
47
47
|
|
|
@@ -273,11 +273,13 @@ class VTableSheet {
|
|
|
273
273
|
})), this.workSheetInstances.has(sheetKey)) {
|
|
274
274
|
const instance = this.workSheetInstances.get(sheetKey);
|
|
275
275
|
instance.getElement().style.display = "block", this.activeWorkSheet = instance,
|
|
276
|
-
this.
|
|
276
|
+
this.formulaManager.setActiveSheet(sheetKey), this._activeSheetTab(), this.activeSheetMenuItem(),
|
|
277
|
+
this.restoreFilterState(instance, sheetDefine);
|
|
277
278
|
} else {
|
|
278
279
|
const instance = this.createWorkSheetInstance(sheetDefine);
|
|
279
280
|
this.workSheetInstances.set(sheetKey, instance), this.activeWorkSheet = instance,
|
|
280
|
-
this.
|
|
281
|
+
this.formulaManager.setActiveSheet(sheetKey), this.updateSheetTabs(), this.updateSheetMenu(),
|
|
282
|
+
this.restoreFilterState(instance, sheetDefine);
|
|
281
283
|
}
|
|
282
284
|
this.updateFormulaBar();
|
|
283
285
|
}
|
|
@@ -327,15 +329,43 @@ class VTableSheet {
|
|
|
327
329
|
customMergeCell: sheetDefine.cellMerge,
|
|
328
330
|
theme: (null === (_a = sheetDefine.theme) || void 0 === _a ? void 0 : _a.tableTheme) || (null === (_b = this.options.theme) || void 0 === _b ? void 0 : _b.tableTheme)
|
|
329
331
|
}));
|
|
330
|
-
sheet.on(
|
|
331
|
-
sheet.on(
|
|
332
|
-
sheet.on(
|
|
332
|
+
sheet.on(ts_types_1.WorkSheetEventType.CELL_CLICK, this.eventManager.handleCellClickBind),
|
|
333
|
+
sheet.on(ts_types_1.WorkSheetEventType.CELL_VALUE_CHANGED, this.eventManager.handleCellValueChangedBind),
|
|
334
|
+
sheet.on(ts_types_1.WorkSheetEventType.SELECTION_CHANGED, this.eventManager.handleSelectionChangedForRangeModeBind),
|
|
335
|
+
sheet.on(ts_types_1.WorkSheetEventType.SELECTION_END, this.eventManager.handleSelectionChangedForRangeModeBind);
|
|
333
336
|
try {
|
|
334
337
|
const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);
|
|
335
|
-
this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData);
|
|
338
|
+
this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData), sheetDefine.formulas && Object.keys(sheetDefine.formulas).length > 0 && this.loadFormulas(sheetDefine.sheetKey, sheetDefine.formulas);
|
|
336
339
|
} catch (error) {}
|
|
337
340
|
return sheet;
|
|
338
341
|
}
|
|
342
|
+
loadFormulas(sheetKey, formulas) {
|
|
343
|
+
if (formulas && 0 !== Object.keys(formulas).length) try {
|
|
344
|
+
const sortedFormulas = this.formulaManager.sortFormulasByDependency(sheetKey, formulas);
|
|
345
|
+
for (const [cellRef, formula] of sortedFormulas) {
|
|
346
|
+
const {row: row, col: col} = this.parseCellKey(cellRef);
|
|
347
|
+
this.formulaManager.setCellContent({
|
|
348
|
+
sheet: sheetKey,
|
|
349
|
+
row: row,
|
|
350
|
+
col: col
|
|
351
|
+
}, formula);
|
|
352
|
+
}
|
|
353
|
+
this.formulaManager.rebuildAndRecalculate();
|
|
354
|
+
} catch (error) {}
|
|
355
|
+
}
|
|
356
|
+
parseCellKey(cellKey) {
|
|
357
|
+
const match = cellKey.match(/^([A-Za-z]+)(\d+)$/);
|
|
358
|
+
if (!match) throw new Error(`Invalid cell reference: ${cellKey}`);
|
|
359
|
+
const [, colStr, rowStr] = match, row = parseInt(rowStr, 10) - 1;
|
|
360
|
+
let col = 0;
|
|
361
|
+
for (let i = 0; i < colStr.length; i++) {
|
|
362
|
+
col = 26 * col + (colStr.toUpperCase().charCodeAt(i) - 65);
|
|
363
|
+
}
|
|
364
|
+
return {
|
|
365
|
+
row: row,
|
|
366
|
+
col: col
|
|
367
|
+
};
|
|
368
|
+
}
|
|
339
369
|
restoreFilterState(sheet, sheetDefine) {
|
|
340
370
|
sheetDefine.filterState && setTimeout((() => {
|
|
341
371
|
if (sheet.tableInstance && sheet.tableInstance.pluginManager) {
|
|
@@ -376,7 +406,7 @@ class VTableSheet {
|
|
|
376
406
|
return this.sheetManager.getAllSheets().forEach((sheetDefine => {
|
|
377
407
|
const instance = this.workSheetInstances.get(sheetDefine.sheetKey);
|
|
378
408
|
if (instance) {
|
|
379
|
-
const data = instance.
|
|
409
|
+
const data = instance.getCopiedData(), columns = instance.getColumns().map((column => {
|
|
380
410
|
const rest = __rest(column, []);
|
|
381
411
|
return delete rest.field, rest;
|
|
382
412
|
})), lastTitleIndex = columns.reduce(((lastIndex, column, index) => column.title ? index : lastIndex), -1);
|
|
@@ -386,14 +416,15 @@ class VTableSheet {
|
|
|
386
416
|
let filterState = null;
|
|
387
417
|
const filterPlugin = instance.tableInstance.pluginManager.getPluginByName("Filter");
|
|
388
418
|
filterPlugin && (filterState = filterPlugin.getFilterState());
|
|
389
|
-
let sortState = instance.tableInstance.internalProps.sortState;
|
|
390
|
-
sortState = Array.isArray(sortState) ? sortState : [ sortState ]
|
|
391
|
-
|
|
419
|
+
let currentSortState, sortState = instance.tableInstance.internalProps.sortState;
|
|
420
|
+
sortState && (sortState = Array.isArray(sortState) ? sortState : [ sortState ],
|
|
421
|
+
currentSortState = sortState.map((item => Object.assign({
|
|
392
422
|
field: item.field,
|
|
393
423
|
order: item.order
|
|
394
424
|
}, null != item.orderFn && {
|
|
395
425
|
orderFn: item.orderFn
|
|
396
|
-
})));
|
|
426
|
+
}))));
|
|
427
|
+
const formulas = this.formulaManager.exportFormulas(sheetDefine.sheetKey);
|
|
397
428
|
sheets.push(Object.assign(Object.assign({}, sheetDefine), {
|
|
398
429
|
data: data,
|
|
399
430
|
columns: columns,
|
|
@@ -403,7 +434,8 @@ class VTableSheet {
|
|
|
403
434
|
frozenColCount: instance.tableInstance.frozenColCount,
|
|
404
435
|
active: sheetDefine.sheetKey === this.sheetManager.getActiveSheet().sheetKey,
|
|
405
436
|
filterState: filterState,
|
|
406
|
-
sortState: currentSortState
|
|
437
|
+
sortState: currentSortState,
|
|
438
|
+
formulas: Object.keys(formulas).length > 0 ? formulas : void 0
|
|
407
439
|
}));
|
|
408
440
|
} else sheets.push(sheetDefine);
|
|
409
441
|
})), Object.assign(Object.assign({}, this.options), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/vtable-sheet.ts"],"names":[],"mappings":"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","file":"vtable-sheet.js","sourcesContent":["import { FormulaManager } from '../managers/formula-manager';\nimport SheetManager from '../managers/sheet-manager';\nimport { WorkSheet } from '../core/WorkSheet';\nimport * as VTable from '@visactor/vtable';\nimport { getTablePlugins } from '../core/table-plugins';\nimport { EventManager } from '../event/event-manager';\nimport { showSnackbar } from '../tools/ui/snackbar';\nimport type { IVTableSheetOptions, ISheetDefine, CellValueChangedEvent } from '../ts-types';\nimport SheetTabDragManager from '../managers/tab-drag-manager';\nimport { checkTabTitle } from '../tools';\nimport { FormulaAutocomplete } from '../formula/formula-autocomplete';\nimport { formulaEditor } from '../formula/formula-editor';\nimport { CellHighlightManager } from '../formula/cell-highlight-manager';\nimport type { TYPES } from '@visactor/vtable';\nimport { MenuManager } from '../managers/menu-manager';\nimport { FormulaUIManager } from '../formula/formula-ui-manager';\n\n// 注册公式编辑器\nVTable.register.editor('formula', formulaEditor);\nexport default class VTableSheet {\n /** DOM容器 */\n private container: HTMLElement;\n /** 配置选项 */\n private options: IVTableSheetOptions;\n /** sheet管理器 */\n private sheetManager: SheetManager;\n /** 公式管理器 */\n formulaManager: FormulaManager;\n /** 事件管理器 */\n private eventManager: EventManager;\n\n /** 菜单管理 */\n private menuManager: MenuManager;\n /** 当前活动sheet实例 */\n private activeWorkSheet: WorkSheet | null = null;\n /** 所有sheet实例 */\n workSheetInstances: Map<string, WorkSheet> = new Map();\n /** 公式自动补全 */\n private formulaAutocomplete: FormulaAutocomplete | null = null;\n\n /** 公式UI管理器 */\n formulaUIManager: FormulaUIManager;\n\n /** UI组件 */\n private rootElement: HTMLElement;\n private formulaBarElement: HTMLElement | null = null;\n private sheetTabElement: HTMLElement | null = null;\n private mainMenuElement: HTMLElement | null = null;\n private contentElement: HTMLElement;\n\n // tab拖拽管理器\n private dragManager: SheetTabDragManager;\n\n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(container: HTMLElement, options: IVTableSheetOptions) {\n this.container = container;\n this.options = this.mergeDefaultOptions(options);\n\n // 创建管理器\n this.sheetManager = new SheetManager();\n this.formulaManager = new FormulaManager(this);\n this.eventManager = new EventManager(this);\n this.dragManager = new SheetTabDragManager(this);\n this.menuManager = new MenuManager(this);\n this.formulaUIManager = new FormulaUIManager(this);\n\n // 初始化UI\n this.initUI();\n\n // 初始化sheets\n this.initSheets();\n\n this.resize();\n }\n\n /**\n * 合并默认配置\n */\n private mergeDefaultOptions(options: IVTableSheetOptions): IVTableSheetOptions {\n return {\n showFormulaBar: true,\n showSheetTab: true,\n defaultRowHeight: 25,\n defaultColWidth: 100,\n ...options\n };\n }\n\n /**\n * 初始化公式自动补全\n */\n private initFormulaAutocomplete(): void {\n if (!this.formulaBarElement) {\n return;\n }\n\n const formulaInput = this.formulaUIManager.formulaInput;\n if (formulaInput) {\n this.formulaAutocomplete = new FormulaAutocomplete(this.rootElement, this);\n this.formulaAutocomplete.attachTo(formulaInput);\n }\n }\n\n /**\n * 初始化UI\n */\n private initUI(): void {\n // 创建根元素\n this.rootElement = document.createElement('div');\n this.rootElement.className = 'vtable-sheet-container';\n // this.rootElement.style.width = `${this.options.width}px`;\n // this.rootElement.style.height = `${this.options.height}px`;\n this.container.appendChild(this.rootElement);\n //创建顶部菜单和公式的容器\n const topContainer = document.createElement('div');\n topContainer.className = 'vtable-sheet-top-container';\n this.rootElement.appendChild(topContainer);\n\n // 创建主菜单\n if (this.options.mainMenu?.show) {\n this.mainMenuElement = this.menuManager.createMainMenu();\n topContainer.appendChild(this.mainMenuElement);\n }\n // 创建公式栏\n if (this.options.showFormulaBar) {\n this.formulaBarElement = this.formulaUIManager.createFormulaBar();\n topContainer.appendChild(this.formulaBarElement);\n\n this.initFormulaAutocomplete();\n }\n\n // 创建内容区域\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'vtable-sheet-content';\n this.rootElement.appendChild(this.contentElement);\n\n // 创建sheet切换栏\n if (this.options.showSheetTab) {\n this.sheetTabElement = this.createSheetTab();\n this.rootElement.appendChild(this.sheetTabElement);\n }\n }\n\n /**\n * 创建sheet切换栏\n */\n private createSheetTab(): HTMLElement {\n // SVG图标常量\n const addIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z\"/>' +\n '</svg>';\n const leftIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>' +\n '</svg>';\n const rightIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>' +\n '</svg>';\n const menuIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 ' +\n '.9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/>' +\n '</svg>';\n\n const sheetTab = document.createElement('div');\n sheetTab.className = 'vtable-sheet-tab-bar';\n\n // 创建左侧渐变效果\n const fadeLeft = document.createElement('div');\n fadeLeft.className = 'vtable-sheet-fade-left';\n fadeLeft.style.display = 'none';\n sheetTab.appendChild(fadeLeft);\n\n // 创建中间的tabs容器\n const tabsContainer = document.createElement('div');\n tabsContainer.className = 'vtable-sheet-tabs-container';\n tabsContainer.addEventListener('scroll', () => this.updateFadeEffects(tabsContainer, fadeLeft, fadeRight));\n sheetTab.appendChild(tabsContainer);\n\n // 创建插入指示器\n const insertIndicator = document.createElement('div');\n insertIndicator.className = 'vtable-sheet-insert-indicator';\n insertIndicator.style.display = 'none';\n tabsContainer.appendChild(insertIndicator);\n\n // 创建右侧渐变效果\n const fadeRight = document.createElement('div');\n fadeRight.className = 'vtable-sheet-fade-right';\n sheetTab.appendChild(fadeRight);\n\n // 添加新增sheet按钮\n const addButton = document.createElement('button');\n addButton.className = 'vtable-sheet-add-button';\n addButton.innerHTML = addIcon;\n addButton.title = '添加工作表';\n addButton.addEventListener('click', () => this._addNewSheet());\n sheetTab.appendChild(addButton);\n\n // 创建导航按钮容器\n const navButtons = document.createElement('div');\n navButtons.className = 'vtable-sheet-nav-buttons';\n\n // 创建左侧滚动按钮\n const leftScrollBtn = document.createElement('button');\n leftScrollBtn.className = 'vtable-sheet-scroll-button';\n leftScrollBtn.innerHTML = leftIcon;\n leftScrollBtn.title = '向左滚动';\n leftScrollBtn.addEventListener('click', () => this.scrollSheetTabs('left', tabsContainer));\n navButtons.appendChild(leftScrollBtn);\n\n // 创建右侧滚动按钮\n const rightScrollBtn = document.createElement('button');\n rightScrollBtn.className = 'vtable-sheet-scroll-button';\n rightScrollBtn.innerHTML = rightIcon;\n rightScrollBtn.title = '向右滚动';\n rightScrollBtn.addEventListener('click', () => this.scrollSheetTabs('right', tabsContainer));\n navButtons.appendChild(rightScrollBtn);\n\n // 创建sheet菜单按钮\n const menuButton = document.createElement('button');\n menuButton.className = 'vtable-sheet-menu-button';\n menuButton.innerHTML = menuIcon;\n menuButton.title = '工作表选项';\n menuButton.addEventListener('click', e => this.toggleSheetMenu(e));\n navButtons.appendChild(menuButton);\n\n // 创建菜单容器\n const menuContainer = document.createElement('ul');\n menuContainer.className = 'vtable-sheet-menu-list';\n sheetTab.appendChild(menuContainer);\n\n sheetTab.appendChild(navButtons);\n // 初始化渐变效果\n setTimeout(() => {\n this.updateFadeEffects(tabsContainer, fadeLeft, fadeRight);\n }, 100);\n\n return sheetTab;\n }\n\n /**\n * 显示工作表菜单\n */\n\n private toggleSheetMenu(event: MouseEvent): void {\n const menuContainer = this.sheetTabElement?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.classList.toggle('active');\n }\n\n /**\n * 更新渐变效果\n * @param tabsContainer 标签容器\n * @param fadeLeft 左侧渐变效果\n * @param fadeRight 右侧渐变效果\n */\n private updateFadeEffects(tabsContainer: HTMLElement, fadeLeft: HTMLElement, fadeRight: HTMLElement): void {\n // 显示/隐藏左侧渐变\n if (tabsContainer.scrollLeft > 10) {\n fadeLeft.style.display = 'block';\n } else {\n fadeLeft.style.display = 'none';\n }\n\n // 显示/隐藏右侧渐变\n const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;\n if (tabsContainer.scrollLeft < maxScroll - 10) {\n fadeRight.style.display = 'block';\n } else {\n fadeRight.style.display = 'none';\n }\n }\n\n /**\n * 滚动sheet标签\n * @param direction 滚动方向\n * @param tabsContainer 标签容器\n */\n private scrollSheetTabs(direction: 'left' | 'right', tabsContainer: HTMLElement): void {\n const scrollAmount = 200; // 每次滚动的像素数\n const currentScroll = tabsContainer.scrollLeft;\n\n if (direction === 'left') {\n tabsContainer.scrollTo({\n left: Math.max(0, currentScroll - scrollAmount),\n behavior: 'smooth'\n });\n } else {\n tabsContainer.scrollTo({\n left: currentScroll + scrollAmount,\n behavior: 'smooth'\n });\n }\n }\n /**\n * 激活sheet标签并滚动到可见区域\n */\n private _activeSheetTab(): void {\n const tabs = this.sheetTabElement?.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n let activeTab: HTMLElement | null = null;\n tabs.forEach(tab => {\n tab.classList.remove('active');\n if (tab.dataset.key === this.activeWorkSheet?.getKey()) {\n tab.classList.add('active');\n activeTab = tab;\n }\n });\n // 确保激活的标签可见\n setTimeout(() => {\n if (activeTab) {\n activeTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n /**\n * 更新sheet切换标签\n * @param tabsContainer 标签容器\n */\n updateSheetTabs(\n tabsContainer: HTMLElement = this.sheetTabElement?.querySelector('.vtable-sheet-tabs-container')\n ): void {\n if (!tabsContainer) {\n return;\n }\n // 清除现有标签\n const tabs = tabsContainer.querySelectorAll('.vtable-sheet-tab');\n tabs.forEach(tab => {\n tab.remove();\n });\n // 添加sheet标签\n const sheets = this.sheetManager.getAllSheets();\n sheets.forEach((sheet, index) => {\n tabsContainer.appendChild(this.createSheetTabItem(sheet, index));\n });\n // 激活sheet标签并滚动到可见区域\n this._activeSheetTab();\n }\n /**\n * 创建tab栏标签项\n */\n private createSheetTabItem(sheet: ISheetDefine, index: number): HTMLElement {\n const tab = document.createElement('div');\n tab.className = 'vtable-sheet-tab';\n tab.dataset.key = sheet.sheetKey;\n tab.textContent = sheet.sheetTitle;\n tab.title = sheet.sheetTitle;\n tab.addEventListener('click', () => this.activateSheet(sheet.sheetKey));\n tab.addEventListener('dblclick', () => this.handleSheetTabDblClick(sheet.sheetKey, sheet.sheetTitle));\n // 拖拽事件\n tab.addEventListener('mousedown', e => this.dragManager.handleTabMouseDown(e, sheet.sheetKey));\n\n return tab;\n }\n /**\n * 处理sheet标签双击事件\n * 双击sheet标签后,将标签设为可编辑状态。输入完成后进行重命名。\n * @param sheetKey 工作表key\n * @param originalTitle 原始名称\n */\n private handleSheetTabDblClick(sheetKey: string, originalTitle: string): void {\n const targetTab = this.getSheetTabElementByKey(sheetKey);\n if (!targetTab) {\n return;\n }\n // 将原文本节点设为可编辑\n targetTab.setAttribute('contenteditable', 'true');\n targetTab.setAttribute('spellcheck', 'false');\n targetTab.classList.add('editing'); // 添加编辑状态样式\n // 选中所有文本\n const range = document.createRange();\n range.selectNodeContents(targetTab);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const onBlur = () => {\n finishInput(true);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n finishInput(true);\n } else if (e.key === 'Escape') {\n finishInput(false);\n }\n };\n const finishInput = (commit: boolean) => {\n targetTab.removeEventListener('blur', onBlur);\n targetTab.removeEventListener('keydown', onKeyDown);\n targetTab.classList.remove('editing');\n targetTab.setAttribute('contenteditable', 'false');\n const newTitle = targetTab.textContent?.trim();\n if (!commit || newTitle === originalTitle || !this.renameSheet(sheetKey, newTitle)) {\n targetTab.textContent = originalTitle;\n return;\n }\n };\n targetTab.addEventListener('blur', onBlur);\n targetTab.addEventListener('keydown', onKeyDown);\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 工作表key\n * @param newTitle 新名称\n * @returns 是否成功\n */\n private renameSheet(sheetKey: string, newTitle: string): boolean {\n const sheet = this.sheetManager.getSheet(sheetKey);\n if (!sheet) {\n return false;\n }\n const error = checkTabTitle(newTitle);\n if (error) {\n showSnackbar(error, 1300);\n return false;\n }\n const isExist = this.sheetManager.getAllSheets().find(s => s.sheetKey !== sheetKey && s.sheetTitle === newTitle);\n if (isExist) {\n showSnackbar('工作表名称已存在,请重新输入', 1300);\n return false;\n }\n this.sheetManager.renameSheet(sheetKey, newTitle);\n this.workSheetInstances.get(sheetKey)?.setTitle(newTitle);\n this.updateSheetTabs();\n this.updateSheetMenu();\n return true;\n }\n\n /**\n * 获取指定sheetKey的标签元素\n */\n private getSheetTabElementByKey(sheetKey: string): HTMLElement | null {\n const tabsContainer = this.sheetTabElement?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n return tabsContainer?.querySelector(`.vtable-sheet-tab[data-key=\"${sheetKey}\"]`) as HTMLElement;\n }\n\n /**\n * 更新sheet列表\n */\n updateSheetMenu(): void {\n const menuContainer = this.sheetTabElement?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.innerHTML = '';\n const sheets = this.sheetManager.getAllSheets();\n sheets.forEach(sheet => {\n // li\n const li = document.createElement('li');\n li.className = 'vtable-sheet-menu-item';\n li.dataset.key = sheet.sheetKey;\n // title\n const title = document.createElement('span');\n title.className = 'vtable-sheet-menu-item-title';\n title.innerText = sheet.sheetTitle;\n li.appendChild(title);\n // delete button\n const div = document.createElement('div');\n div.className = 'vtable-sheet-menu-delete-button';\n div.innerHTML =\n '<svg class=\"x-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">' +\n '<path d=\"M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '<path d=\"M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '</svg>';\n div.addEventListener('click', e => {\n e.stopPropagation();\n this.removeSheet(sheet.sheetKey);\n });\n li.addEventListener('click', () => this.activateSheet(sheet.sheetKey));\n li.appendChild(div);\n menuContainer.appendChild(li);\n });\n this.activeSheetMenuItem();\n // 确保激活的标签可见\n setTimeout(() => {\n const activeItem = menuContainer.querySelector('.vtable-sheet-main-menu-item.active');\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 激活sheet菜单项并滚动到可见区域\n */\n private activeSheetMenuItem(): void {\n const menuItems = this.sheetTabElement?.querySelectorAll('.vtable-sheet-main-menu-item') as NodeListOf<HTMLElement>;\n let activeItem: HTMLElement | null = null;\n menuItems.forEach(item => {\n item.classList.remove('active');\n if (item.dataset.key === this.activeWorkSheet?.getKey()) {\n item.classList.add('active');\n activeItem = item;\n }\n });\n setTimeout(() => {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 滚动以确保标签可见\n * @param tab 标签\n * @param container 容器\n */\n private scrollTabIntoView(tab: HTMLElement, container: HTMLElement): void {\n const tabRect = tab.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.left < containerRect.left) {\n // 标签在可见区域左侧\n container.scrollLeft += tabRect.left - containerRect.left - 10;\n } else if (tabRect.right > containerRect.right) {\n // 标签在可见区域右侧\n container.scrollLeft += tabRect.right - containerRect.right + 10;\n }\n }\n\n /**\n * 初始化sheets\n */\n private initSheets(): void {\n if (this.options.sheets && this.options.sheets.length > 0) {\n // 添加所有sheet\n this.options.sheets.forEach((sheetDefine: ISheetDefine) => {\n this.sheetManager.addSheet(sheetDefine);\n });\n\n // 找到active的sheet\n let activeSheetKey = '';\n const activeSheet = this.options.sheets.find((sheet: ISheetDefine) => sheet.active);\n if (activeSheet) {\n activeSheetKey = activeSheet.sheetKey;\n } else {\n activeSheetKey = this.options.sheets[0].sheetKey;\n }\n\n // 激活sheet\n this.activateSheet(activeSheetKey);\n } else {\n // 如果没有提供sheets,创建一个默认的\n this._addNewSheet();\n }\n }\n\n /**\n * 激活指定sheet\n * @param sheetKey sheet的key\n */\n activateSheet(sheetKey: string): void {\n // 设置活动sheet\n this.sheetManager.setActiveSheet(sheetKey);\n\n // 获取sheet定义\n const sheetDefine = this.sheetManager.getSheet(sheetKey);\n if (!sheetDefine) {\n return;\n }\n\n // 隐藏所有sheet实例\n this.workSheetInstances.forEach(instance => {\n instance.getElement().style.display = 'none';\n });\n\n // 如果已经存在实例,则显示并激活对应tab和menu\n if (this.workSheetInstances.has(sheetKey)) {\n const instance = this.workSheetInstances.get(sheetKey)!;\n instance.getElement().style.display = 'block';\n this.activeWorkSheet = instance;\n // sheet标签和菜单项激活样式\n this._activeSheetTab();\n this.activeSheetMenuItem();\n\n // 恢复筛选状态\n this.restoreFilterState(instance, sheetDefine);\n } else {\n // 创建新的sheet实例\n const instance = this.createWorkSheetInstance(sheetDefine);\n this.workSheetInstances.set(sheetKey, instance);\n this.activeWorkSheet = instance;\n // 刷新sheet标签和菜单\n this.updateSheetTabs();\n this.updateSheetMenu();\n\n // 恢复筛选状态\n this.restoreFilterState(instance, sheetDefine);\n }\n\n this.updateFormulaBar();\n }\n\n addSheet(sheet: ISheetDefine): void {\n this.sheetManager.addSheet(sheet);\n this.updateSheetTabs();\n this.updateSheetMenu();\n }\n\n /**\n * 删除sheet\n * @param sheetKey 工作表key\n */\n removeSheet(sheetKey: string): void {\n if (this.sheetManager.getSheetCount() <= 1) {\n showSnackbar('至少保留一个工作表', 1300);\n return;\n }\n // 删除实例对应的dom元素\n const instance = this.workSheetInstances.get(sheetKey);\n if (instance) {\n instance.getElement().remove();\n this.workSheetInstances.delete(sheetKey);\n }\n // 删除sheet定义\n const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);\n // 激活新的sheet(如果有)\n if (newActiveSheetKey) {\n this.activateSheet(newActiveSheetKey);\n }\n this.updateSheetTabs();\n this.updateSheetMenu();\n }\n getSheetCount(): number {\n return this.sheetManager.getSheetCount();\n }\n getSheet(sheetKey: string): ISheetDefine | null {\n return this.sheetManager.getSheet(sheetKey);\n }\n getAllSheets(): ISheetDefine[] {\n return this.sheetManager.getAllSheets();\n }\n\n /**\n * 创建sheet实例\n * @param sheetDefine sheet的定义\n */\n private createWorkSheetInstance(sheetDefine: ISheetDefine): WorkSheet {\n formulaEditor.setSheet(this);\n // 计算内容区域大小\n const contentWidth = this.contentElement.clientWidth;\n const contentHeight = this.contentElement.clientHeight;\n\n // 创建sheet实例\n const sheet = new WorkSheet(this, {\n ...sheetDefine,\n container: this.contentElement,\n width: contentWidth,\n height: contentHeight,\n defaultRowHeight: this.options.defaultRowHeight,\n defaultColWidth: this.options.defaultColWidth,\n plugins: getTablePlugins(sheetDefine, this.options),\n headerEditor: 'formula',\n editor: 'formula',\n select: {\n makeSelectCellVisible: false\n },\n style: {\n borderColor: ['#E1E4E8', '#E1E4E8', '#E1E4E8', '#E1E4E8'],\n borderLineWidth: [1, 1, 1, 1],\n borderLineDash: [null, null, null, null],\n padding: [8, 8, 8, 8]\n },\n editCellTrigger: ['api', 'keydown', 'doubleclick'],\n customMergeCell: sheetDefine.cellMerge,\n theme: sheetDefine.theme?.tableTheme || this.options.theme?.tableTheme\n } as any);\n\n // 注册事件 - 使用预先绑定的事件处理方法\n sheet.on('cell-selected', this.eventManager.handleCellSelectedBind);\n sheet.on('cell-value-changed', this.eventManager.handleCellValueChangedBind);\n sheet.on('selection-changed', this.eventManager.handleSelectionChangedForRangeModeBind);\n sheet.on('selection-end', this.eventManager.handleSelectionChangedForRangeModeBind);\n\n // 在公式管理器中添加这个sheet\n try {\n const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);\n this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData);\n } catch (error) {\n console.warn(`Sheet ${sheetDefine.sheetKey} may already exist in formula manager:`, error);\n // 如果添加失败(可能已存在),继续执行\n }\n\n return sheet;\n }\n\n /**\n * 恢复筛选状态\n */\n private restoreFilterState(sheet: WorkSheet, sheetDefine: ISheetDefine): void {\n // 如果没有保存的筛选状态,直接返回\n if (!sheetDefine.filterState) {\n return;\n }\n\n console.log(`恢复 Sheet ${sheetDefine.sheetKey} 的筛选状态:`, sheetDefine.filterState);\n\n // 等待表格初始化完成\n setTimeout(() => {\n if (sheet.tableInstance && sheet.tableInstance.pluginManager) {\n const filterPlugin = sheet.tableInstance.pluginManager.getPluginByName('Filter') as any;\n if (filterPlugin) {\n filterPlugin.setFilterState(sheetDefine.filterState);\n console.log(`Sheet ${sheetDefine.sheetKey} 筛选状态恢复完成`);\n } else {\n console.warn(`Sheet ${sheetDefine.sheetKey} 未找到筛选插件或插件不支持 setFilterState 方法`);\n }\n } else {\n console.warn(`Sheet ${sheetDefine.sheetKey} 表格实例或插件管理器未初始化`);\n }\n }, 0);\n }\n\n /**\n * 添加新sheet\n */\n private _addNewSheet(): void {\n // 生成新sheet的key和title\n const sheetCount = this.sheetManager.getSheetCount();\n const baseKey = `sheet${sheetCount + 1}`;\n const baseTitle = `Sheet ${sheetCount + 1}`;\n let key = baseKey;\n let title = baseTitle;\n let index = sheetCount + 1;\n // 检查key和title是否被占用,递增直到唯一\n const existingKeys = new Set(this.sheetManager.getAllSheets().map(s => s.sheetKey));\n const existingTitles = new Set(this.sheetManager.getAllSheets().map(s => s.sheetTitle));\n while (existingKeys.has(key) || existingTitles.has(title)) {\n index += 1;\n key = `sheet${index}`;\n title = `Sheet ${index}`;\n }\n\n // 创建新sheet配置\n const newSheet: ISheetDefine = {\n sheetKey: key,\n sheetTitle: title,\n columnCount: 20,\n rowCount: 100,\n data: []\n };\n\n // 添加到管理器\n this.sheetManager.addSheet(newSheet);\n\n // 激活新sheet\n this.activateSheet(key);\n }\n\n /**\n * 更新公式栏\n */\n private updateFormulaBar(): void {\n this.formulaUIManager.updateFormulaBar();\n }\n\n /**\n * 获取公式管理器\n */\n getFormulaManager(): FormulaManager {\n return this.formulaManager;\n }\n /**\n * 获取Sheet管理器\n */\n getSheetManager(): SheetManager {\n return this.sheetManager;\n }\n\n /**\n * 获取活动Sheet实例\n */\n getActiveSheet(): WorkSheet | null {\n return this.activeWorkSheet;\n }\n\n /**\n * 保存所有数据为配置\n */\n saveToConfig(): IVTableSheetOptions {\n // 收集所有sheet的数据\n const sheets: ISheetDefine[] = [];\n\n this.sheetManager.getAllSheets().forEach(sheetDefine => {\n const instance = this.workSheetInstances.get(sheetDefine.sheetKey);\n if (instance) {\n const data = instance.getData();\n //column中去除field字段 (field字段会在columns.map中被使用)\n const columns = instance.getColumns().map(column => {\n // 解构时省略field属性\n const { ...rest } = column;\n // 删除field属性\n delete rest.field;\n return rest;\n });\n // 找到最后一个有title的列的索引\n const lastTitleIndex = columns.reduce((lastIndex, column, index) => (column.title ? index : lastIndex), -1);\n\n // 从最后一个有title的列之后删除所有列\n if (lastTitleIndex === -1) {\n columns.length = 0; // 清空数组\n } else {\n columns.splice(lastTitleIndex + 1);\n }\n // 找到最后一个有非空值的行\n const lastDataIndex = data.reduce((lastIndex, rowData, index) => (rowData ? index : lastIndex), -1);\n // 保留到最后一个有值的行,删除之后的空行\n if (lastDataIndex === -1) {\n data.length = 0; // 清空数组\n } else {\n data.splice(lastDataIndex + 1);\n }\n\n // 获取筛选状态\n let filterState = null;\n const filterPlugin = instance.tableInstance.pluginManager.getPluginByName('Filter') as any;\n if (filterPlugin) {\n filterState = filterPlugin.getFilterState();\n }\n\n // 获取排序状态\n let sortState = instance.tableInstance.internalProps.sortState;\n sortState = Array.isArray(sortState) ? sortState : [sortState];\n const currentSortState = sortState.map(item => ({\n field: item.field,\n order: item.order,\n ...(item.orderFn != null && { orderFn: item.orderFn })\n }));\n\n sheets.push({\n ...sheetDefine,\n data,\n columns,\n cellMerge: instance.tableInstance.options.customMergeCell as TYPES.CustomMergeCellArray,\n showHeader: instance.tableInstance.options.showHeader,\n frozenRowCount: instance.tableInstance.frozenRowCount,\n frozenColCount: instance.tableInstance.frozenColCount,\n active: sheetDefine.sheetKey === this.sheetManager.getActiveSheet().sheetKey,\n filterState: filterState,\n sortState: currentSortState\n });\n } else {\n sheets.push(sheetDefine);\n }\n });\n\n return {\n ...this.options,\n sheets\n };\n }\n /** 导出当前sheet到文件 */\n exportSheetToFile(fileType: 'csv' | 'xlsx'): void {\n const sheet = this.getActiveSheet();\n if (!sheet) {\n return;\n }\n if (fileType === 'csv') {\n if ((sheet.tableInstance as any)?.exportToCsv) {\n (sheet.tableInstance as any).exportToCsv();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n } else {\n if ((sheet.tableInstance as any)?.exportToExcel) {\n (sheet.tableInstance as any).exportToExcel();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n }\n }\n /** 导入文件到当前sheet */\n importFileToSheet(): void {\n const sheet = this.getActiveSheet();\n if (!sheet) {\n return;\n }\n if ((sheet.tableInstance as any)?.importFile) {\n (sheet.tableInstance as any).importFile();\n } else {\n console.warn('Please configure ExcelImportPlugin in VTablePluginModules');\n }\n }\n /**\n * 获取容器元素\n */\n getContainer(): HTMLElement {\n return this.container;\n }\n\n /**\n * 获取根元素\n */\n getRootElement(): HTMLElement {\n return this.rootElement;\n }\n\n /**\n * 获取选项\n */\n getOptions(): IVTableSheetOptions {\n return this.options;\n }\n\n /**\n * 获取公式栏元素\n */\n getFormulaBarElement(): HTMLElement | null {\n return this.formulaBarElement;\n }\n\n /**\n * 获取sheet标签栏元素\n */\n getSheetTabElement(): HTMLElement | null {\n return this.sheetTabElement;\n }\n\n /**\n * 获取内容区域元素\n */\n getContentElement(): HTMLElement {\n return this.contentElement;\n }\n\n /**\n * 销毁实例\n */\n release(): void {\n // 释放事件管理器\n this.eventManager.release();\n this.formulaManager.release();\n this.formulaUIManager.release();\n // 销毁所有sheet实例\n this.workSheetInstances.forEach(instance => {\n instance.release();\n });\n // 清空容器\n if (this.rootElement && this.rootElement.parentNode) {\n this.rootElement.parentNode.removeChild(this.rootElement);\n }\n\n if (this.formulaAutocomplete) {\n this.formulaAutocomplete.release();\n }\n if (this.formulaManager.cellHighlightManager) {\n this.formulaManager.cellHighlightManager.release();\n }\n }\n\n /**\n * 导出指定sheet的数据\n * @param sheetKey sheet的key\n * @returns 数据\n */\n exportData(sheetKey: string): any[][] {\n const sheet = this.workSheetInstances.get(sheetKey);\n if (!sheet) {\n return [];\n }\n return sheet.getData();\n }\n\n /**\n * 导出所有sheet的数据\n * @returns 数据\n */\n exportAllData(): any[][] {\n const sheets = Array.from(this.workSheetInstances.values());\n return sheets.map(sheet => sheet.getData());\n }\n\n /**\n * resize\n */\n resize(): void {\n // const containerWidth = this.getContainer().clientWidth;\n // const containerHeight = this.getContainer().clientHeight;\n // this.rootElement.style.width = `${this.getOptions().width || containerWidth}px`;\n // this.rootElement.style.height = `${this.getOptions().height || containerHeight}px`;\n this.getActiveSheet()?.resize();\n }\n\n /**\n * 若所选范围包含当前正在编辑的单元格,自动排除该单元格以避免 #CYCLE!\n */\n excludeEditCellFromSelection(\n range: { startRow: number; startCol: number; endRow: number; endCol: number },\n editRow: number,\n editCol: number\n ) {\n const r = { ...range };\n const withinRow = r.startRow <= editRow && editRow <= r.endRow;\n const withinCol = r.startCol <= editCol && editCol <= r.endCol;\n if (!withinRow || !withinCol) {\n return r;\n }\n\n const rowSpan = r.endRow - r.startRow;\n const colSpan = r.endCol - r.startCol;\n\n // 如果选择范围就是编辑单元格本身,返回空范围(表示无效选择)\n if (rowSpan === 0 && colSpan === 0 && r.startRow === editRow && r.startCol === editCol) {\n return { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n }\n\n if (rowSpan >= colSpan) {\n // 优先在行方向上排除编辑单元格\n if (editRow === r.startRow && r.startRow < r.endRow) {\n r.startRow += 1;\n } else if (editRow === r.endRow && r.startRow < r.endRow) {\n r.endRow -= 1;\n } else if (r.startRow < r.endRow) {\n r.startRow += 1;\n } // 中间,默认从起点缩一格\n } else {\n // 优先在列方向上排除编辑单元格\n if (editCol === r.startCol && r.startCol < r.endCol) {\n r.startCol += 1;\n } else if (editCol === r.endCol && r.startCol < r.endCol) {\n r.endCol -= 1;\n } else if (r.startCol < r.endCol) {\n r.startCol += 1;\n }\n }\n return r;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/vtable-sheet.ts"],"names":[],"mappings":"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","file":"vtable-sheet.js","sourcesContent":["import { FormulaManager } from '../managers/formula-manager';\nimport SheetManager from '../managers/sheet-manager';\nimport { WorkSheet } from '../core/WorkSheet';\nimport * as VTable from '@visactor/vtable';\nimport { getTablePlugins } from '../core/table-plugins';\nimport { EventManager } from '../event/event-manager';\nimport { showSnackbar } from '../tools/ui/snackbar';\nimport type { IVTableSheetOptions, ISheetDefine, CellValueChangedEvent } from '../ts-types';\nimport { WorkSheetEventType } from '../ts-types';\nimport SheetTabDragManager from '../managers/tab-drag-manager';\nimport { checkTabTitle } from '../tools';\nimport { FormulaAutocomplete } from '../formula/formula-autocomplete';\nimport { formulaEditor } from '../formula/formula-editor';\nimport { CellHighlightManager } from '../formula/cell-highlight-manager';\nimport type { TYPES } from '@visactor/vtable';\nimport { MenuManager } from '../managers/menu-manager';\nimport { FormulaUIManager } from '../formula/formula-ui-manager';\n\n// 注册公式编辑器\nVTable.register.editor('formula', formulaEditor);\nexport default class VTableSheet {\n /** DOM容器 */\n private container: HTMLElement;\n /** 配置选项 */\n private options: IVTableSheetOptions;\n /** sheet管理器 */\n private sheetManager: SheetManager;\n /** 公式管理器 */\n formulaManager: FormulaManager;\n /** 事件管理器 */\n private eventManager: EventManager;\n\n /** 菜单管理 */\n private menuManager: MenuManager;\n /** 当前活动sheet实例 */\n private activeWorkSheet: WorkSheet | null = null;\n /** 所有sheet实例 */\n workSheetInstances: Map<string, WorkSheet> = new Map();\n /** 公式自动补全 */\n private formulaAutocomplete: FormulaAutocomplete | null = null;\n\n /** 公式UI管理器 */\n formulaUIManager: FormulaUIManager;\n\n /** UI组件 */\n private rootElement: HTMLElement;\n private formulaBarElement: HTMLElement | null = null;\n private sheetTabElement: HTMLElement | null = null;\n private mainMenuElement: HTMLElement | null = null;\n private contentElement: HTMLElement;\n\n // tab拖拽管理器\n private dragManager: SheetTabDragManager;\n\n /**\n * 构造函数\n * @param options 配置选项\n */\n constructor(container: HTMLElement, options: IVTableSheetOptions) {\n this.container = container;\n this.options = this.mergeDefaultOptions(options);\n\n // 创建管理器\n this.sheetManager = new SheetManager();\n this.formulaManager = new FormulaManager(this);\n this.eventManager = new EventManager(this);\n this.dragManager = new SheetTabDragManager(this);\n this.menuManager = new MenuManager(this);\n this.formulaUIManager = new FormulaUIManager(this);\n\n // 初始化UI\n this.initUI();\n\n // 初始化sheets\n this.initSheets();\n\n this.resize();\n }\n\n /**\n * 合并默认配置\n */\n private mergeDefaultOptions(options: IVTableSheetOptions): IVTableSheetOptions {\n return {\n showFormulaBar: true,\n showSheetTab: true,\n defaultRowHeight: 25,\n defaultColWidth: 100,\n ...options\n };\n }\n\n /**\n * 初始化公式自动补全\n */\n private initFormulaAutocomplete(): void {\n if (!this.formulaBarElement) {\n return;\n }\n\n const formulaInput = this.formulaUIManager.formulaInput;\n if (formulaInput) {\n this.formulaAutocomplete = new FormulaAutocomplete(this.rootElement, this);\n this.formulaAutocomplete.attachTo(formulaInput);\n }\n }\n\n /**\n * 初始化UI\n */\n private initUI(): void {\n // 创建根元素\n this.rootElement = document.createElement('div');\n this.rootElement.className = 'vtable-sheet-container';\n // this.rootElement.style.width = `${this.options.width}px`;\n // this.rootElement.style.height = `${this.options.height}px`;\n this.container.appendChild(this.rootElement);\n //创建顶部菜单和公式的容器\n const topContainer = document.createElement('div');\n topContainer.className = 'vtable-sheet-top-container';\n this.rootElement.appendChild(topContainer);\n\n // 创建主菜单\n if (this.options.mainMenu?.show) {\n this.mainMenuElement = this.menuManager.createMainMenu();\n topContainer.appendChild(this.mainMenuElement);\n }\n // 创建公式栏\n if (this.options.showFormulaBar) {\n this.formulaBarElement = this.formulaUIManager.createFormulaBar();\n topContainer.appendChild(this.formulaBarElement);\n\n this.initFormulaAutocomplete();\n }\n\n // 创建内容区域\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'vtable-sheet-content';\n this.rootElement.appendChild(this.contentElement);\n\n // 创建sheet切换栏\n if (this.options.showSheetTab) {\n this.sheetTabElement = this.createSheetTab();\n this.rootElement.appendChild(this.sheetTabElement);\n }\n }\n\n /**\n * 创建sheet切换栏\n */\n private createSheetTab(): HTMLElement {\n // SVG图标常量\n const addIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z\"/>' +\n '</svg>';\n const leftIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>' +\n '</svg>';\n const rightIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>' +\n '</svg>';\n const menuIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 ' +\n '.9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/>' +\n '</svg>';\n\n const sheetTab = document.createElement('div');\n sheetTab.className = 'vtable-sheet-tab-bar';\n\n // 创建左侧渐变效果\n const fadeLeft = document.createElement('div');\n fadeLeft.className = 'vtable-sheet-fade-left';\n fadeLeft.style.display = 'none';\n sheetTab.appendChild(fadeLeft);\n\n // 创建中间的tabs容器\n const tabsContainer = document.createElement('div');\n tabsContainer.className = 'vtable-sheet-tabs-container';\n tabsContainer.addEventListener('scroll', () => this.updateFadeEffects(tabsContainer, fadeLeft, fadeRight));\n sheetTab.appendChild(tabsContainer);\n\n // 创建插入指示器\n const insertIndicator = document.createElement('div');\n insertIndicator.className = 'vtable-sheet-insert-indicator';\n insertIndicator.style.display = 'none';\n tabsContainer.appendChild(insertIndicator);\n\n // 创建右侧渐变效果\n const fadeRight = document.createElement('div');\n fadeRight.className = 'vtable-sheet-fade-right';\n sheetTab.appendChild(fadeRight);\n\n // 添加新增sheet按钮\n const addButton = document.createElement('button');\n addButton.className = 'vtable-sheet-add-button';\n addButton.innerHTML = addIcon;\n addButton.title = '添加工作表';\n addButton.addEventListener('click', () => this._addNewSheet());\n sheetTab.appendChild(addButton);\n\n // 创建导航按钮容器\n const navButtons = document.createElement('div');\n navButtons.className = 'vtable-sheet-nav-buttons';\n\n // 创建左侧滚动按钮\n const leftScrollBtn = document.createElement('button');\n leftScrollBtn.className = 'vtable-sheet-scroll-button';\n leftScrollBtn.innerHTML = leftIcon;\n leftScrollBtn.title = '向左滚动';\n leftScrollBtn.addEventListener('click', () => this.scrollSheetTabs('left', tabsContainer));\n navButtons.appendChild(leftScrollBtn);\n\n // 创建右侧滚动按钮\n const rightScrollBtn = document.createElement('button');\n rightScrollBtn.className = 'vtable-sheet-scroll-button';\n rightScrollBtn.innerHTML = rightIcon;\n rightScrollBtn.title = '向右滚动';\n rightScrollBtn.addEventListener('click', () => this.scrollSheetTabs('right', tabsContainer));\n navButtons.appendChild(rightScrollBtn);\n\n // 创建sheet菜单按钮\n const menuButton = document.createElement('button');\n menuButton.className = 'vtable-sheet-menu-button';\n menuButton.innerHTML = menuIcon;\n menuButton.title = '工作表选项';\n menuButton.addEventListener('click', e => this.toggleSheetMenu(e));\n navButtons.appendChild(menuButton);\n\n // 创建菜单容器\n const menuContainer = document.createElement('ul');\n menuContainer.className = 'vtable-sheet-menu-list';\n sheetTab.appendChild(menuContainer);\n\n sheetTab.appendChild(navButtons);\n // 初始化渐变效果\n setTimeout(() => {\n this.updateFadeEffects(tabsContainer, fadeLeft, fadeRight);\n }, 100);\n\n return sheetTab;\n }\n\n /**\n * 显示工作表菜单\n */\n\n private toggleSheetMenu(event: MouseEvent): void {\n const menuContainer = this.sheetTabElement?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.classList.toggle('active');\n }\n\n /**\n * 更新渐变效果\n * @param tabsContainer 标签容器\n * @param fadeLeft 左侧渐变效果\n * @param fadeRight 右侧渐变效果\n */\n private updateFadeEffects(tabsContainer: HTMLElement, fadeLeft: HTMLElement, fadeRight: HTMLElement): void {\n // 显示/隐藏左侧渐变\n if (tabsContainer.scrollLeft > 10) {\n fadeLeft.style.display = 'block';\n } else {\n fadeLeft.style.display = 'none';\n }\n\n // 显示/隐藏右侧渐变\n const maxScroll = tabsContainer.scrollWidth - tabsContainer.clientWidth;\n if (tabsContainer.scrollLeft < maxScroll - 10) {\n fadeRight.style.display = 'block';\n } else {\n fadeRight.style.display = 'none';\n }\n }\n\n /**\n * 滚动sheet标签\n * @param direction 滚动方向\n * @param tabsContainer 标签容器\n */\n private scrollSheetTabs(direction: 'left' | 'right', tabsContainer: HTMLElement): void {\n const scrollAmount = 200; // 每次滚动的像素数\n const currentScroll = tabsContainer.scrollLeft;\n\n if (direction === 'left') {\n tabsContainer.scrollTo({\n left: Math.max(0, currentScroll - scrollAmount),\n behavior: 'smooth'\n });\n } else {\n tabsContainer.scrollTo({\n left: currentScroll + scrollAmount,\n behavior: 'smooth'\n });\n }\n }\n /**\n * 激活sheet标签并滚动到可见区域\n */\n private _activeSheetTab(): void {\n const tabs = this.sheetTabElement?.querySelectorAll('.vtable-sheet-tab') as NodeListOf<HTMLElement>;\n let activeTab: HTMLElement | null = null;\n tabs.forEach(tab => {\n tab.classList.remove('active');\n if (tab.dataset.key === this.activeWorkSheet?.getKey()) {\n tab.classList.add('active');\n activeTab = tab;\n }\n });\n // 确保激活的标签可见\n setTimeout(() => {\n if (activeTab) {\n activeTab.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n /**\n * 更新sheet切换标签\n * @param tabsContainer 标签容器\n */\n updateSheetTabs(\n tabsContainer: HTMLElement = this.sheetTabElement?.querySelector('.vtable-sheet-tabs-container')\n ): void {\n if (!tabsContainer) {\n return;\n }\n // 清除现有标签\n const tabs = tabsContainer.querySelectorAll('.vtable-sheet-tab');\n tabs.forEach(tab => {\n tab.remove();\n });\n // 添加sheet标签\n const sheets = this.sheetManager.getAllSheets();\n sheets.forEach((sheet, index) => {\n tabsContainer.appendChild(this.createSheetTabItem(sheet, index));\n });\n // 激活sheet标签并滚动到可见区域\n this._activeSheetTab();\n }\n /**\n * 创建tab栏标签项\n */\n private createSheetTabItem(sheet: ISheetDefine, index: number): HTMLElement {\n const tab = document.createElement('div');\n tab.className = 'vtable-sheet-tab';\n tab.dataset.key = sheet.sheetKey;\n tab.textContent = sheet.sheetTitle;\n tab.title = sheet.sheetTitle;\n tab.addEventListener('click', () => this.activateSheet(sheet.sheetKey));\n tab.addEventListener('dblclick', () => this.handleSheetTabDblClick(sheet.sheetKey, sheet.sheetTitle));\n // 拖拽事件\n tab.addEventListener('mousedown', e => this.dragManager.handleTabMouseDown(e, sheet.sheetKey));\n\n return tab;\n }\n /**\n * 处理sheet标签双击事件\n * 双击sheet标签后,将标签设为可编辑状态。输入完成后进行重命名。\n * @param sheetKey 工作表key\n * @param originalTitle 原始名称\n */\n private handleSheetTabDblClick(sheetKey: string, originalTitle: string): void {\n const targetTab = this.getSheetTabElementByKey(sheetKey);\n if (!targetTab) {\n return;\n }\n // 将原文本节点设为可编辑\n targetTab.setAttribute('contenteditable', 'true');\n targetTab.setAttribute('spellcheck', 'false');\n targetTab.classList.add('editing'); // 添加编辑状态样式\n // 选中所有文本\n const range = document.createRange();\n range.selectNodeContents(targetTab);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n const onBlur = () => {\n finishInput(true);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n finishInput(true);\n } else if (e.key === 'Escape') {\n finishInput(false);\n }\n };\n const finishInput = (commit: boolean) => {\n targetTab.removeEventListener('blur', onBlur);\n targetTab.removeEventListener('keydown', onKeyDown);\n targetTab.classList.remove('editing');\n targetTab.setAttribute('contenteditable', 'false');\n const newTitle = targetTab.textContent?.trim();\n if (!commit || newTitle === originalTitle || !this.renameSheet(sheetKey, newTitle)) {\n targetTab.textContent = originalTitle;\n return;\n }\n };\n targetTab.addEventListener('blur', onBlur);\n targetTab.addEventListener('keydown', onKeyDown);\n }\n\n /**\n * 重命名sheet\n * @param sheetKey 工作表key\n * @param newTitle 新名称\n * @returns 是否成功\n */\n private renameSheet(sheetKey: string, newTitle: string): boolean {\n const sheet = this.sheetManager.getSheet(sheetKey);\n if (!sheet) {\n return false;\n }\n const error = checkTabTitle(newTitle);\n if (error) {\n showSnackbar(error, 1300);\n return false;\n }\n const isExist = this.sheetManager.getAllSheets().find(s => s.sheetKey !== sheetKey && s.sheetTitle === newTitle);\n if (isExist) {\n showSnackbar('工作表名称已存在,请重新输入', 1300);\n return false;\n }\n this.sheetManager.renameSheet(sheetKey, newTitle);\n this.workSheetInstances.get(sheetKey)?.setTitle(newTitle);\n this.updateSheetTabs();\n this.updateSheetMenu();\n return true;\n }\n\n /**\n * 获取指定sheetKey的标签元素\n */\n private getSheetTabElementByKey(sheetKey: string): HTMLElement | null {\n const tabsContainer = this.sheetTabElement?.querySelector('.vtable-sheet-tabs-container') as HTMLElement;\n return tabsContainer?.querySelector(`.vtable-sheet-tab[data-key=\"${sheetKey}\"]`) as HTMLElement;\n }\n\n /**\n * 更新sheet列表\n */\n updateSheetMenu(): void {\n const menuContainer = this.sheetTabElement?.querySelector('.vtable-sheet-menu-list') as HTMLElement;\n menuContainer.innerHTML = '';\n const sheets = this.sheetManager.getAllSheets();\n sheets.forEach(sheet => {\n // li\n const li = document.createElement('li');\n li.className = 'vtable-sheet-menu-item';\n li.dataset.key = sheet.sheetKey;\n // title\n const title = document.createElement('span');\n title.className = 'vtable-sheet-menu-item-title';\n title.innerText = sheet.sheetTitle;\n li.appendChild(title);\n // delete button\n const div = document.createElement('div');\n div.className = 'vtable-sheet-menu-delete-button';\n div.innerHTML =\n '<svg class=\"x-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">' +\n '<path d=\"M18 6L6 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '<path d=\"M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>' +\n '</svg>';\n div.addEventListener('click', e => {\n e.stopPropagation();\n this.removeSheet(sheet.sheetKey);\n });\n li.addEventListener('click', () => this.activateSheet(sheet.sheetKey));\n li.appendChild(div);\n menuContainer.appendChild(li);\n });\n this.activeSheetMenuItem();\n // 确保激活的标签可见\n setTimeout(() => {\n const activeItem = menuContainer.querySelector('.vtable-sheet-main-menu-item.active');\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 激活sheet菜单项并滚动到可见区域\n */\n private activeSheetMenuItem(): void {\n const menuItems = this.sheetTabElement?.querySelectorAll('.vtable-sheet-main-menu-item') as NodeListOf<HTMLElement>;\n let activeItem: HTMLElement | null = null;\n menuItems.forEach(item => {\n item.classList.remove('active');\n if (item.dataset.key === this.activeWorkSheet?.getKey()) {\n item.classList.add('active');\n activeItem = item;\n }\n });\n setTimeout(() => {\n if (activeItem) {\n activeItem.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n }, 100);\n }\n\n /**\n * 滚动以确保标签可见\n * @param tab 标签\n * @param container 容器\n */\n private scrollTabIntoView(tab: HTMLElement, container: HTMLElement): void {\n const tabRect = tab.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n\n if (tabRect.left < containerRect.left) {\n // 标签在可见区域左侧\n container.scrollLeft += tabRect.left - containerRect.left - 10;\n } else if (tabRect.right > containerRect.right) {\n // 标签在可见区域右侧\n container.scrollLeft += tabRect.right - containerRect.right + 10;\n }\n }\n\n /**\n * 初始化sheets\n */\n private initSheets(): void {\n if (this.options.sheets && this.options.sheets.length > 0) {\n // 添加所有sheet\n this.options.sheets.forEach((sheetDefine: ISheetDefine) => {\n this.sheetManager.addSheet(sheetDefine);\n });\n\n // 找到active的sheet\n let activeSheetKey = '';\n const activeSheet = this.options.sheets.find((sheet: ISheetDefine) => sheet.active);\n if (activeSheet) {\n activeSheetKey = activeSheet.sheetKey;\n } else {\n activeSheetKey = this.options.sheets[0].sheetKey;\n }\n\n // 激活sheet\n this.activateSheet(activeSheetKey);\n } else {\n // 如果没有提供sheets,创建一个默认的\n this._addNewSheet();\n }\n }\n\n /**\n * 激活指定sheet\n * @param sheetKey sheet的key\n */\n activateSheet(sheetKey: string): void {\n // 设置活动sheet\n this.sheetManager.setActiveSheet(sheetKey);\n\n // 获取sheet定义\n const sheetDefine = this.sheetManager.getSheet(sheetKey);\n if (!sheetDefine) {\n return;\n }\n\n // 隐藏所有sheet实例\n this.workSheetInstances.forEach(instance => {\n instance.getElement().style.display = 'none';\n });\n\n // 如果已经存在实例,则显示并激活对应tab和menu\n if (this.workSheetInstances.has(sheetKey)) {\n const instance = this.workSheetInstances.get(sheetKey)!;\n instance.getElement().style.display = 'block';\n this.activeWorkSheet = instance;\n\n // 更新公式管理器中的活动工作表(在实例激活后)\n this.formulaManager.setActiveSheet(sheetKey);\n\n // sheet标签和菜单项激活样式\n this._activeSheetTab();\n this.activeSheetMenuItem();\n\n // 恢复筛选状态\n this.restoreFilterState(instance, sheetDefine);\n } else {\n // 创建新的sheet实例\n const instance = this.createWorkSheetInstance(sheetDefine);\n this.workSheetInstances.set(sheetKey, instance);\n this.activeWorkSheet = instance;\n\n // 更新公式管理器中的活动工作表(在实例创建后)\n this.formulaManager.setActiveSheet(sheetKey);\n\n // 刷新sheet标签和菜单\n this.updateSheetTabs();\n this.updateSheetMenu();\n\n // 恢复筛选状态\n this.restoreFilterState(instance, sheetDefine);\n }\n\n this.updateFormulaBar();\n }\n\n addSheet(sheet: ISheetDefine): void {\n this.sheetManager.addSheet(sheet);\n this.updateSheetTabs();\n this.updateSheetMenu();\n }\n\n /**\n * 删除sheet\n * @param sheetKey 工作表key\n */\n removeSheet(sheetKey: string): void {\n if (this.sheetManager.getSheetCount() <= 1) {\n showSnackbar('至少保留一个工作表', 1300);\n return;\n }\n // 删除实例对应的dom元素\n const instance = this.workSheetInstances.get(sheetKey);\n if (instance) {\n instance.getElement().remove();\n this.workSheetInstances.delete(sheetKey);\n }\n // 删除sheet定义\n const newActiveSheetKey = this.sheetManager.removeSheet(sheetKey);\n // 激活新的sheet(如果有)\n if (newActiveSheetKey) {\n this.activateSheet(newActiveSheetKey);\n }\n this.updateSheetTabs();\n this.updateSheetMenu();\n }\n getSheetCount(): number {\n return this.sheetManager.getSheetCount();\n }\n getSheet(sheetKey: string): ISheetDefine | null {\n return this.sheetManager.getSheet(sheetKey);\n }\n getAllSheets(): ISheetDefine[] {\n return this.sheetManager.getAllSheets();\n }\n\n /**\n * 创建sheet实例\n * @param sheetDefine sheet的定义\n */\n private createWorkSheetInstance(sheetDefine: ISheetDefine): WorkSheet {\n formulaEditor.setSheet(this);\n // 计算内容区域大小\n const contentWidth = this.contentElement.clientWidth;\n const contentHeight = this.contentElement.clientHeight;\n\n // 创建sheet实例\n const sheet = new WorkSheet(this, {\n ...sheetDefine,\n container: this.contentElement,\n width: contentWidth,\n height: contentHeight,\n defaultRowHeight: this.options.defaultRowHeight,\n defaultColWidth: this.options.defaultColWidth,\n plugins: getTablePlugins(sheetDefine, this.options),\n headerEditor: 'formula',\n editor: 'formula',\n select: {\n makeSelectCellVisible: false\n },\n style: {\n borderColor: ['#E1E4E8', '#E1E4E8', '#E1E4E8', '#E1E4E8'],\n borderLineWidth: [1, 1, 1, 1],\n borderLineDash: [null, null, null, null],\n padding: [8, 8, 8, 8]\n },\n editCellTrigger: ['api', 'keydown', 'doubleclick'],\n customMergeCell: sheetDefine.cellMerge,\n theme: sheetDefine.theme?.tableTheme || this.options.theme?.tableTheme\n } as any);\n\n // 注册事件 - 使用预先绑定的事件处理方法和WorkSheetEventType枚举\n sheet.on(WorkSheetEventType.CELL_CLICK, this.eventManager.handleCellClickBind);\n sheet.on(WorkSheetEventType.CELL_VALUE_CHANGED, this.eventManager.handleCellValueChangedBind);\n sheet.on(WorkSheetEventType.SELECTION_CHANGED, this.eventManager.handleSelectionChangedForRangeModeBind);\n sheet.on(WorkSheetEventType.SELECTION_END, this.eventManager.handleSelectionChangedForRangeModeBind);\n\n // 在公式管理器中添加这个sheet\n try {\n const normalizedData = this.formulaManager.normalizeSheetData(sheetDefine.data, sheet.tableInstance);\n this.formulaManager.addSheet(sheetDefine.sheetKey, normalizedData);\n // 加载保存的公式数据(如果有)\n if (sheetDefine.formulas && Object.keys(sheetDefine.formulas).length > 0) {\n this.loadFormulas(sheetDefine.sheetKey, sheetDefine.formulas);\n }\n } catch (error) {\n console.warn(`Sheet ${sheetDefine.sheetKey} may already exist in formula manager:`, error);\n // 如果添加失败(可能已存在),继续执行\n }\n\n return sheet;\n }\n /**\n * 加载指定工作表的公式数据\n * @param sheetKey 工作表键\n * @param formulas 公式数据 (A1表示法的单元格引用 -> 公式内容)\n */\n private loadFormulas(sheetKey: string, formulas: Record<string, string>): void {\n if (!formulas || Object.keys(formulas).length === 0) {\n return;\n }\n\n try {\n // 优化公式计算顺序\n const sortedFormulas = this.formulaManager.sortFormulasByDependency(sheetKey, formulas);\n // 按照优化后的顺序设置公式\n for (const [cellRef, formula] of sortedFormulas) {\n // 解析单元格引用 (如 A1, B2) 到行列索引\n const { row, col } = this.parseCellKey(cellRef);\n // 设置单元格公式\n this.formulaManager.setCellContent({ sheet: sheetKey, row, col }, formula);\n }\n\n // 刷新计算\n this.formulaManager.rebuildAndRecalculate();\n } catch (error) {\n console.error(`Failed to load formulas for sheet ${sheetKey}:`, error);\n }\n }\n\n /**\n * 将单元格引用(A1表示法)解析为行列索引\n * @param cellKey 单元格引用 (如 A1, B2)\n * @returns 行列索引 (0-based)\n */\n private parseCellKey(cellKey: string): { row: number; col: number } {\n // 匹配列引用(字母部分)和行引用(数字部分)\n const match = cellKey.match(/^([A-Za-z]+)(\\d+)$/);\n if (!match) {\n throw new Error(`Invalid cell reference: ${cellKey}`);\n }\n const [, colStr, rowStr] = match;\n // 解析行索引 (1-based -> 0-based)\n const row = parseInt(rowStr, 10) - 1;\n // 解析列索引 (A -> 0, B -> 1, ..., Z -> 25, AA -> 26, etc.)\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n const charCode = colStr.toUpperCase().charCodeAt(i) - 65; // 65 is ASCII for 'A'\n col = col * 26 + charCode;\n }\n return { row, col };\n }\n\n /**\n * 恢复筛选状态\n */\n private restoreFilterState(sheet: WorkSheet, sheetDefine: ISheetDefine): void {\n // 如果没有保存的筛选状态,直接返回\n if (!sheetDefine.filterState) {\n return;\n }\n\n // console.log(`恢复 Sheet ${sheetDefine.sheetKey} 的筛选状态:`, sheetDefine.filterState);\n\n // 等待表格初始化完成\n setTimeout(() => {\n if (sheet.tableInstance && sheet.tableInstance.pluginManager) {\n const filterPlugin = sheet.tableInstance.pluginManager.getPluginByName('Filter') as any;\n if (filterPlugin) {\n filterPlugin.setFilterState(sheetDefine.filterState);\n } else {\n console.warn(`Sheet ${sheetDefine.sheetKey} 未找到筛选插件或插件不支持 setFilterState 方法`);\n }\n } else {\n console.warn(`Sheet ${sheetDefine.sheetKey} 表格实例或插件管理器未初始化`);\n }\n }, 0);\n }\n\n /**\n * 添加新sheet\n */\n private _addNewSheet(): void {\n // 生成新sheet的key和title\n const sheetCount = this.sheetManager.getSheetCount();\n const baseKey = `sheet${sheetCount + 1}`;\n const baseTitle = `Sheet ${sheetCount + 1}`;\n let key = baseKey;\n let title = baseTitle;\n let index = sheetCount + 1;\n // 检查key和title是否被占用,递增直到唯一\n const existingKeys = new Set(this.sheetManager.getAllSheets().map(s => s.sheetKey));\n const existingTitles = new Set(this.sheetManager.getAllSheets().map(s => s.sheetTitle));\n while (existingKeys.has(key) || existingTitles.has(title)) {\n index += 1;\n key = `sheet${index}`;\n title = `Sheet ${index}`;\n }\n\n // 创建新sheet配置\n const newSheet: ISheetDefine = {\n sheetKey: key,\n sheetTitle: title,\n columnCount: 20,\n rowCount: 100,\n data: []\n };\n\n // 添加到管理器\n this.sheetManager.addSheet(newSheet);\n\n // 激活新sheet\n this.activateSheet(key);\n }\n\n /**\n * 更新公式栏\n */\n private updateFormulaBar(): void {\n this.formulaUIManager.updateFormulaBar();\n }\n\n /**\n * 获取公式管理器\n */\n getFormulaManager(): FormulaManager {\n return this.formulaManager;\n }\n /**\n * 获取Sheet管理器\n */\n getSheetManager(): SheetManager {\n return this.sheetManager;\n }\n\n /**\n * 获取活动Sheet实例\n */\n getActiveSheet(): WorkSheet | null {\n return this.activeWorkSheet;\n }\n\n /**\n * 保存所有数据为配置\n */\n saveToConfig(): IVTableSheetOptions {\n // 收集所有sheet的数据\n const sheets: ISheetDefine[] = [];\n\n this.sheetManager.getAllSheets().forEach(sheetDefine => {\n const instance = this.workSheetInstances.get(sheetDefine.sheetKey);\n if (instance) {\n const data = instance.getCopiedData();\n //column中去除field字段 (field字段会在columns.map中被使用)\n const columns = instance.getColumns().map(column => {\n // 解构时省略field属性\n const { ...rest } = column;\n // 删除field属性\n delete rest.field;\n return rest;\n });\n // 找到最后一个有title的列的索引\n const lastTitleIndex = columns.reduce((lastIndex, column, index) => (column.title ? index : lastIndex), -1);\n\n // 从最后一个有title的列之后删除所有列\n if (lastTitleIndex === -1) {\n columns.length = 0; // 清空数组\n } else {\n columns.splice(lastTitleIndex + 1);\n }\n // 找到最后一个有非空值的行\n const lastDataIndex = data.reduce((lastIndex, rowData, index) => (rowData ? index : lastIndex), -1);\n // 保留到最后一个有值的行,删除之后的空行\n if (lastDataIndex === -1) {\n data.length = 0; // 清空数组\n } else {\n data.splice(lastDataIndex + 1);\n }\n\n // 获取筛选状态\n let filterState = null;\n const filterPlugin = instance.tableInstance.pluginManager.getPluginByName('Filter') as any;\n if (filterPlugin) {\n filterState = filterPlugin.getFilterState();\n }\n\n // 获取排序状态\n let sortState = instance.tableInstance.internalProps.sortState;\n let currentSortState;\n if (sortState) {\n sortState = Array.isArray(sortState) ? sortState : [sortState];\n currentSortState = sortState.map(item => ({\n field: item.field,\n order: item.order,\n ...(item.orderFn != null && { orderFn: item.orderFn })\n }));\n }\n\n // 使用FormulaManager的导出方法获取所有公式\n const formulas = this.formulaManager.exportFormulas(sheetDefine.sheetKey);\n\n sheets.push({\n ...sheetDefine,\n data,\n columns,\n cellMerge: instance.tableInstance.options.customMergeCell as TYPES.CustomMergeCellArray,\n showHeader: instance.tableInstance.options.showHeader,\n frozenRowCount: instance.tableInstance.frozenRowCount,\n frozenColCount: instance.tableInstance.frozenColCount,\n active: sheetDefine.sheetKey === this.sheetManager.getActiveSheet().sheetKey,\n filterState: filterState,\n sortState: currentSortState,\n formulas: Object.keys(formulas).length > 0 ? formulas : undefined\n });\n } else {\n sheets.push(sheetDefine);\n }\n });\n\n return {\n ...this.options,\n sheets\n };\n }\n\n /** 导出当前sheet到文件 */\n exportSheetToFile(fileType: 'csv' | 'xlsx'): void {\n const sheet = this.getActiveSheet();\n if (!sheet) {\n return;\n }\n if (fileType === 'csv') {\n if ((sheet.tableInstance as any)?.exportToCsv) {\n (sheet.tableInstance as any).exportToCsv();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n } else {\n if ((sheet.tableInstance as any)?.exportToExcel) {\n (sheet.tableInstance as any).exportToExcel();\n } else {\n console.warn('Please configure TableExportPlugin in VTablePluginModules');\n }\n }\n }\n /** 导入文件到当前sheet */\n importFileToSheet(): void {\n const sheet = this.getActiveSheet();\n if (!sheet) {\n return;\n }\n if ((sheet.tableInstance as any)?.importFile) {\n (sheet.tableInstance as any).importFile();\n } else {\n console.warn('Please configure ExcelImportPlugin in VTablePluginModules');\n }\n }\n /**\n * 获取容器元素\n */\n getContainer(): HTMLElement {\n return this.container;\n }\n\n /**\n * 获取根元素\n */\n getRootElement(): HTMLElement {\n return this.rootElement;\n }\n\n /**\n * 获取选项\n */\n getOptions(): IVTableSheetOptions {\n return this.options;\n }\n\n /**\n * 获取公式栏元素\n */\n getFormulaBarElement(): HTMLElement | null {\n return this.formulaBarElement;\n }\n\n /**\n * 获取sheet标签栏元素\n */\n getSheetTabElement(): HTMLElement | null {\n return this.sheetTabElement;\n }\n\n /**\n * 获取内容区域元素\n */\n getContentElement(): HTMLElement {\n return this.contentElement;\n }\n\n /**\n * 销毁实例\n */\n release(): void {\n // 释放事件管理器\n this.eventManager.release();\n this.formulaManager.release();\n this.formulaUIManager.release();\n // 销毁所有sheet实例\n this.workSheetInstances.forEach(instance => {\n instance.release();\n });\n // 清空容器\n if (this.rootElement && this.rootElement.parentNode) {\n this.rootElement.parentNode.removeChild(this.rootElement);\n }\n\n if (this.formulaAutocomplete) {\n this.formulaAutocomplete.release();\n }\n if (this.formulaManager.cellHighlightManager) {\n this.formulaManager.cellHighlightManager.release();\n }\n }\n\n /**\n * 导出指定sheet的数据\n * @param sheetKey sheet的key\n * @returns 数据\n */\n exportData(sheetKey: string): any[][] {\n const sheet = this.workSheetInstances.get(sheetKey);\n if (!sheet) {\n return [];\n }\n return sheet.getData();\n }\n\n /**\n * 导出所有sheet的数据\n * @returns 数据\n */\n exportAllData(): any[][] {\n const sheets = Array.from(this.workSheetInstances.values());\n return sheets.map(sheet => sheet.getData());\n }\n\n /**\n * resize\n */\n resize(): void {\n // const containerWidth = this.getContainer().clientWidth;\n // const containerHeight = this.getContainer().clientHeight;\n // this.rootElement.style.width = `${this.getOptions().width || containerWidth}px`;\n // this.rootElement.style.height = `${this.getOptions().height || containerHeight}px`;\n this.getActiveSheet()?.resize();\n }\n\n /**\n * 若所选范围包含当前正在编辑的单元格,自动排除该单元格以避免 #CYCLE!\n */\n excludeEditCellFromSelection(\n range: { startRow: number; startCol: number; endRow: number; endCol: number },\n editRow: number,\n editCol: number\n ) {\n const r = { ...range };\n const withinRow = r.startRow <= editRow && editRow <= r.endRow;\n const withinCol = r.startCol <= editCol && editCol <= r.endCol;\n if (!withinRow || !withinCol) {\n return r;\n }\n\n const rowSpan = r.endRow - r.startRow;\n const colSpan = r.endCol - r.startCol;\n\n // 如果选择范围就是编辑单元格本身,返回空范围(表示无效选择)\n if (rowSpan === 0 && colSpan === 0 && r.startRow === editRow && r.startCol === editCol) {\n return { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n }\n\n if (rowSpan >= colSpan) {\n // 优先在行方向上排除编辑单元格\n if (editRow === r.startRow && r.startRow < r.endRow) {\n r.startRow += 1;\n } else if (editRow === r.endRow && r.startRow < r.endRow) {\n r.endRow -= 1;\n } else if (r.startRow < r.endRow) {\n r.startRow += 1;\n } // 中间,默认从起点缩一格\n } else {\n // 优先在列方向上排除编辑单元格\n if (editCol === r.startCol && r.startCol < r.endCol) {\n r.startCol += 1;\n } else if (editCol === r.endCol && r.startCol < r.endCol) {\n r.endCol -= 1;\n } else if (r.startCol < r.endCol) {\n r.startCol += 1;\n }\n }\n return r;\n }\n}\n"]}
|
package/cjs/core/WorkSheet.d.ts
CHANGED
|
@@ -52,6 +52,7 @@ export declare class WorkSheet extends EventTarget implements IWorkSheetAPI {
|
|
|
52
52
|
setTitle(title: string): void;
|
|
53
53
|
getColumns(): ColumnDefine[];
|
|
54
54
|
getData(): any[][];
|
|
55
|
+
getCopiedData(): any[][];
|
|
55
56
|
setData(data: any[][]): void;
|
|
56
57
|
getCellValue(row: number, col: number): any;
|
|
57
58
|
setCellValue(row: number, col: number, value: any): void;
|