@visactor/vtable-sheet 1.23.1-alpha.2 → 1.23.2
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/cjs/components/sheet-tab-event-handler.js +3 -2
- package/cjs/components/sheet-tab-event-handler.js.map +1 -1
- package/cjs/components/vtable-sheet.d.ts +4 -1
- package/cjs/components/vtable-sheet.js +115 -17
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +3 -1
- package/cjs/core/WorkSheet.js +45 -21
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +5 -0
- package/cjs/core/table-plugins.js +10 -9
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/table-event-relay.js +1 -0
- package/cjs/event/table-event-relay.js.map +1 -1
- package/cjs/formula/formula-engine.js +0 -1
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/index.d.ts +3 -3
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +3 -1
- package/cjs/managers/formula-manager.js +39 -15
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.d.ts +2 -0
- package/cjs/managers/menu-manager.js +3 -0
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/managers/sheet-manager.d.ts +1 -0
- package/cjs/managers/sheet-manager.js +7 -0
- package/cjs/managers/sheet-manager.js.map +1 -1
- package/cjs/managers/tab-drag-manager.d.ts +2 -2
- package/cjs/managers/tab-drag-manager.js.map +1 -1
- package/cjs/sheet-helper.d.ts +2 -0
- package/cjs/sheet-helper.js +15 -3
- package/cjs/sheet-helper.js.map +1 -1
- package/cjs/ts-types/index.d.ts +2 -1
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/sheet.d.ts +12 -7
- package/cjs/ts-types/sheet.js.map +1 -1
- package/dist/vtable-sheet.js +867 -225
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/sheet-tab-event-handler.js +3 -2
- package/es/components/sheet-tab-event-handler.js.map +1 -1
- package/es/components/vtable-sheet.d.ts +4 -1
- package/es/components/vtable-sheet.js +117 -16
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +3 -1
- package/es/core/WorkSheet.js +44 -21
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +5 -0
- package/es/core/table-plugins.js +8 -7
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/table-event-relay.js +1 -0
- package/es/event/table-event-relay.js.map +1 -1
- package/es/formula/formula-engine.js +0 -1
- package/es/formula/formula-engine.js.map +1 -1
- package/es/index.d.ts +3 -3
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +3 -1
- package/es/managers/formula-manager.js +39 -15
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.d.ts +2 -0
- package/es/managers/menu-manager.js +3 -0
- package/es/managers/menu-manager.js.map +1 -1
- package/es/managers/sheet-manager.d.ts +1 -0
- package/es/managers/sheet-manager.js +7 -0
- package/es/managers/sheet-manager.js.map +1 -1
- package/es/managers/tab-drag-manager.d.ts +2 -2
- package/es/managers/tab-drag-manager.js.map +1 -1
- package/es/sheet-helper.d.ts +2 -0
- package/es/sheet-helper.js +11 -0
- package/es/sheet-helper.js.map +1 -1
- package/es/ts-types/index.d.ts +2 -1
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/sheet.d.ts +12 -7
- package/es/ts-types/sheet.js.map +1 -1
- package/package.json +8 -7
package/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import VTableSheet from './components/vtable-sheet';
|
|
2
|
-
import type { ISheetDefine, IVTableSheetOptions } from './ts-types';
|
|
2
|
+
import type { ISheetDefine, IVTableSheetOptions, IVTableSheetUpdateOptions } from './ts-types';
|
|
3
3
|
import * as TYPES from './ts-types';
|
|
4
4
|
import * as VTable from './vtable';
|
|
5
|
-
export declare const version = "1.23.
|
|
6
|
-
export { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };
|
|
5
|
+
export declare const version = "1.23.2";
|
|
6
|
+
export { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions, IVTableSheetUpdateOptions };
|
package/cjs/index.js
CHANGED
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,QAAQ,CAAC;AAEhC,IAAA,4BAAY,GAAE,CAAC","file":"index.js","sourcesContent":["import VTableSheet from './components/vtable-sheet';\nimport type { ISheetDefine, IVTableSheetOptions, IVTableSheetUpdateOptions } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.23.2\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions, IVTableSheetUpdateOptions };\n"]}
|
|
@@ -2,7 +2,7 @@ import { FormulaEngine } from '../formula/formula-engine';
|
|
|
2
2
|
import type VTableSheet from '../components/vtable-sheet';
|
|
3
3
|
import type { FormulaCell, FormulaResult, IFormulaManager } from '../ts-types/formula';
|
|
4
4
|
import { FormulaRangeSelector } from '../formula/formula-range-selector';
|
|
5
|
-
import type { CellRange } from '../ts-types';
|
|
5
|
+
import type { CellRange, ISheetDefine } from '../ts-types';
|
|
6
6
|
import { CellHighlightManager } from '../formula';
|
|
7
7
|
import type * as VTable from '@visactor/vtable';
|
|
8
8
|
import { CrossSheetFormulaHandler } from '../formula/cross-sheet-formula-handler';
|
|
@@ -39,6 +39,7 @@ export declare class FormulaManager implements IFormulaManager {
|
|
|
39
39
|
updateSheetTitle(sheetKey: string, newTitle: string): void;
|
|
40
40
|
private updateCrossSheetFormulasWithNewTitle;
|
|
41
41
|
private parseA1CellRef;
|
|
42
|
+
private creatingSheets;
|
|
42
43
|
private ensureSheetRegistered;
|
|
43
44
|
private ensureAllSheetsRegisteredForCrossSheetFormula;
|
|
44
45
|
private normalizeDataForFormulaEngine;
|
|
@@ -75,6 +76,7 @@ export declare class FormulaManager implements IFormulaManager {
|
|
|
75
76
|
};
|
|
76
77
|
suspendEvaluation(): void;
|
|
77
78
|
resumeEvaluation(): void;
|
|
79
|
+
rebuildFormulas(sheets: ISheetDefine[]): void;
|
|
78
80
|
rebuildAndRecalculate(): void;
|
|
79
81
|
clearContent(): void;
|
|
80
82
|
release(): void;
|
|
@@ -54,7 +54,7 @@ class FormulaManager {
|
|
|
54
54
|
this.sheetMapping = new Map, this.reverseSheetMapping = new Map, this.isInitialized = !1,
|
|
55
55
|
this.nextSheetId = 0, this._formulaWorkingOnCell = null, this.lastKnownCursorPosInFormulaInput = null,
|
|
56
56
|
this.lastSelectionRangesOfHandling = [], this.inputIsParamMode = null, this.inputingElement = null,
|
|
57
|
-
this.sheet = sheet, this.cellHighlightManager = new formula_1.CellHighlightManager(sheet),
|
|
57
|
+
this.creatingSheets = new Set, this.sheet = sheet, this.cellHighlightManager = new formula_1.CellHighlightManager(sheet),
|
|
58
58
|
this.formulaRangeSelector = new formula_range_selector_1.FormulaRangeSelector(this),
|
|
59
59
|
this.initializeFormulaEngine(), this.crossSheetHandler = new cross_sheet_formula_handler_1.CrossSheetFormulaHandler(this.formulaEngine, this.sheet.getSheetManager(), this);
|
|
60
60
|
}
|
|
@@ -115,7 +115,6 @@ class FormulaManager {
|
|
|
115
115
|
removeSheet(sheetKey) {
|
|
116
116
|
const sheetId = this.sheetMapping.get(sheetKey);
|
|
117
117
|
if (void 0 !== sheetId) try {
|
|
118
|
-
if (this.sheetMapping.size <= 1) throw new Error("Cannot remove the last sheet");
|
|
119
118
|
this.formulaEngine.removeSheet(sheetKey), this.sheetMapping.delete(sheetKey), this.reverseSheetMapping.delete(sheetId);
|
|
120
119
|
} catch (error) {
|
|
121
120
|
throw new Error(`Failed to remove sheet: ${sheetKey}`);
|
|
@@ -175,10 +174,15 @@ class FormulaManager {
|
|
|
175
174
|
}
|
|
176
175
|
ensureSheetRegistered(sheetKey) {
|
|
177
176
|
if (this.sheet.workSheetInstances.has(sheetKey)) return;
|
|
177
|
+
if (this.creatingSheets.has(sheetKey)) return;
|
|
178
178
|
const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
if (sheetDefine) try {
|
|
180
|
+
this.creatingSheets.add(sheetKey);
|
|
181
|
+
const instance = this.sheet.createWorkSheetInstance(sheetDefine);
|
|
182
|
+
this.sheet.workSheetInstances.set(sheetKey, instance);
|
|
183
|
+
} finally {
|
|
184
|
+
this.creatingSheets.delete(sheetKey);
|
|
185
|
+
}
|
|
182
186
|
}
|
|
183
187
|
ensureAllSheetsRegisteredForCrossSheetFormula(formula) {
|
|
184
188
|
try {
|
|
@@ -217,7 +221,7 @@ class FormulaManager {
|
|
|
217
221
|
if (this.sheet && "function" == typeof this.sheet.getWorkSheetByKey) worksheet = this.sheet.getWorkSheetByKey(cell.sheet); else try {
|
|
218
222
|
const workSheetInstances = this.sheet.workSheetInstances;
|
|
219
223
|
workSheetInstances && workSheetInstances.get && (worksheet = workSheetInstances.get(cell.sheet));
|
|
220
|
-
} catch (
|
|
224
|
+
} catch (_e) {
|
|
221
225
|
return;
|
|
222
226
|
}
|
|
223
227
|
if (worksheet && worksheet.eventManager) switch (eventType) {
|
|
@@ -250,6 +254,7 @@ class FormulaManager {
|
|
|
250
254
|
if (this.ensureInitialized(), !cell || void 0 === cell.sheet || void 0 === cell.row || void 0 === cell.col) throw new Error("Invalid cell parameter for setCellContent");
|
|
251
255
|
if (cell.row < 0 || cell.col < 0) throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);
|
|
252
256
|
try {
|
|
257
|
+
this.formulaEngine.setActiveSheet(cell.sheet);
|
|
253
258
|
const isFormula = "string" == typeof value && value.startsWith("="), oldFormula = this.getCellFormula(cell);
|
|
254
259
|
isFormula && this.hasCrossSheetReference(value) ? this.crossSheetHandler.setCrossSheetFormula(cell, value) : this.formulaEngine.setCellContent(cell, value);
|
|
255
260
|
const newFormula = this.getCellFormula(cell);
|
|
@@ -267,7 +272,8 @@ class FormulaManager {
|
|
|
267
272
|
this.ensureAllSheetsRegisteredForCrossSheetFormula(formula);
|
|
268
273
|
return this.formulaEngine.getCellValue(cell);
|
|
269
274
|
}
|
|
270
|
-
return this.ensureSheetRegistered(cell.sheet), this.formulaEngine.
|
|
275
|
+
return this.ensureSheetRegistered(cell.sheet), this.formulaEngine.setActiveSheet(cell.sheet),
|
|
276
|
+
this.formulaEngine.getCellValue(cell);
|
|
271
277
|
} catch (error) {
|
|
272
278
|
return {
|
|
273
279
|
value: null,
|
|
@@ -326,7 +332,7 @@ class FormulaManager {
|
|
|
326
332
|
row: cell.row,
|
|
327
333
|
col: cell.col
|
|
328
334
|
});
|
|
329
|
-
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value);
|
|
335
|
+
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value, !1, !1);
|
|
330
336
|
}));
|
|
331
337
|
} catch (error) {
|
|
332
338
|
throw new Error(`Failed to add ${numberOfRows} rows at index ${rowIndex}`);
|
|
@@ -343,7 +349,7 @@ class FormulaManager {
|
|
|
343
349
|
row: cell.row,
|
|
344
350
|
col: cell.col
|
|
345
351
|
});
|
|
346
|
-
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value);
|
|
352
|
+
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value, !1, !1);
|
|
347
353
|
}));
|
|
348
354
|
} catch (error) {
|
|
349
355
|
throw new Error(`Failed to remove ${numberOfRows} rows at index ${rowIndex}`);
|
|
@@ -360,7 +366,7 @@ class FormulaManager {
|
|
|
360
366
|
row: cell.row,
|
|
361
367
|
col: cell.col
|
|
362
368
|
});
|
|
363
|
-
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value);
|
|
369
|
+
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value, !1, !1);
|
|
364
370
|
}));
|
|
365
371
|
} catch (error) {
|
|
366
372
|
throw new Error(`Failed to add ${numberOfColumns} columns at index ${columnIndex}`);
|
|
@@ -377,7 +383,7 @@ class FormulaManager {
|
|
|
377
383
|
row: cell.row,
|
|
378
384
|
col: cell.col
|
|
379
385
|
});
|
|
380
|
-
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value);
|
|
386
|
+
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value, !1, !1);
|
|
381
387
|
}));
|
|
382
388
|
} catch (error) {
|
|
383
389
|
throw new Error(`Failed to remove ${numberOfColumns} columns at index ${columnIndex}`);
|
|
@@ -392,7 +398,7 @@ class FormulaManager {
|
|
|
392
398
|
const totalColCount = sheet.columnCount, totalRowCount = sheet.rowCount, {adjustedCells: adjustedCells, movedCells: movedCells} = this.formulaEngine.adjustFormulaReferencesForColumnMove(sheetKey, sourceCol, targetCol, totalColCount, totalRowCount), allAffectedCells = [ ...adjustedCells, ...movedCells ];
|
|
393
399
|
for (const cell of allAffectedCells) {
|
|
394
400
|
const result = this.getCellValue(cell);
|
|
395
|
-
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value);
|
|
401
|
+
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value, !1, !1);
|
|
396
402
|
}
|
|
397
403
|
} catch (error) {
|
|
398
404
|
throw new Error(`Failed to change column header position: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
@@ -406,7 +412,7 @@ class FormulaManager {
|
|
|
406
412
|
const {adjustedCells: adjustedCells, movedCells: movedCells} = this.formulaEngine.adjustFormulaReferencesForRowMove(sheetKey, sourceRow, targetRow), allAffectedCells = [ ...adjustedCells, ...movedCells ];
|
|
407
413
|
for (const cell of allAffectedCells) {
|
|
408
414
|
const result = this.getCellValue(cell);
|
|
409
|
-
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value);
|
|
415
|
+
null === (_a = this.sheet.getActiveSheet().tableInstance) || void 0 === _a || _a.changeCellValue(cell.col, cell.row, result.error ? "#ERROR!" : result.value, !1, !1);
|
|
410
416
|
}
|
|
411
417
|
} catch (error) {
|
|
412
418
|
throw new Error(`Failed to change row header position: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
@@ -423,7 +429,7 @@ class FormulaManager {
|
|
|
423
429
|
sortFormulasByDependency(sheetKey, formulas) {
|
|
424
430
|
try {
|
|
425
431
|
return this.formulaEngine.sortFormulasByDependency(sheetKey, formulas);
|
|
426
|
-
} catch (
|
|
432
|
+
} catch (_error) {
|
|
427
433
|
return Object.entries(formulas);
|
|
428
434
|
}
|
|
429
435
|
}
|
|
@@ -461,7 +467,7 @@ class FormulaManager {
|
|
|
461
467
|
if (formula.match(/\b(AND|OR|NOT)\((?=[\s,)])/i)) return !1;
|
|
462
468
|
if (formula.match(/[+\-*/^&%][+\-*/^&%]/)) return !1;
|
|
463
469
|
return this.validateFormula(formula).isValid;
|
|
464
|
-
} catch (
|
|
470
|
+
} catch (_error) {
|
|
465
471
|
return !1;
|
|
466
472
|
}
|
|
467
473
|
}
|
|
@@ -478,6 +484,24 @@ class FormulaManager {
|
|
|
478
484
|
}
|
|
479
485
|
suspendEvaluation() {}
|
|
480
486
|
resumeEvaluation() {}
|
|
487
|
+
rebuildFormulas(sheets) {
|
|
488
|
+
try {
|
|
489
|
+
if (this.formulaEngine) try {
|
|
490
|
+
this.formulaEngine.release();
|
|
491
|
+
} catch (error) {}
|
|
492
|
+
if (this.sheetMapping.clear(), this.reverseSheetMapping.clear(), this.nextSheetId = 0,
|
|
493
|
+
this.initializeFormulaEngine(), this.crossSheetHandler) try {
|
|
494
|
+
this.crossSheetHandler.destroy();
|
|
495
|
+
} catch (error) {}
|
|
496
|
+
this.crossSheetHandler = new cross_sheet_formula_handler_1.CrossSheetFormulaHandler(this.formulaEngine, this.sheet.getSheetManager(), this),
|
|
497
|
+
sheets.forEach((sheetDefine => {
|
|
498
|
+
const sheetKey = sheetDefine.sheetKey, worksheetInstance = this.sheet.workSheetInstances.get(sheetKey);
|
|
499
|
+
if (!worksheetInstance || !worksheetInstance.tableInstance) return;
|
|
500
|
+
const normalizedData = this.normalizeSheetData(worksheetInstance.getData(), worksheetInstance.tableInstance);
|
|
501
|
+
this.addSheet(sheetKey, normalizedData, sheetDefine.sheetTitle);
|
|
502
|
+
}));
|
|
503
|
+
} catch (error) {}
|
|
504
|
+
}
|
|
481
505
|
rebuildAndRecalculate() {}
|
|
482
506
|
clearContent() {
|
|
483
507
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/managers/formula-manager.ts"],"names":[],"mappings":"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","file":"formula-manager.js","sourcesContent":["import { FormulaEngine } from '../formula/formula-engine';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { FormulaCell, FormulaResult, IFormulaManager } from '../ts-types/formula';\nimport { FormulaRangeSelector } from '../formula/formula-range-selector';\nimport type { CellRange } from '../ts-types';\nimport { CellHighlightManager } from '../formula';\nimport type * as VTable from '@visactor/vtable';\nimport { CrossSheetFormulaHandler } from '../formula/cross-sheet-formula-handler';\nimport type { CrossSheetFormulaOptions } from '../formula/cross-sheet-formula-handler';\n\n/**\n * 标准FormulaEngine配置 (MIT兼容)\n */\nconst DEFAULT_FORMULA_ENGINE_CONFIG = {\n precisionRounding: 14,\n caseSensitive: false,\n ignoreWhiteSpace: 'standard' as const,\n nullDate: { year: 1899, month: 12, day: 30 },\n dateFormats: ['DD/MM/YYYY', 'DD/MM/YY', 'YYYY-MM-DD'],\n timeFormats: ['hh:mm', 'hh:mm:ss.s']\n};\n\nexport class FormulaManager implements IFormulaManager {\n /** Sheet实例 */\n sheet: VTableSheet;\n /** FormulaEngine实例 */\n formulaEngine: FormulaEngine;\n /** 工作表映射 */\n private sheetMapping: Map<string, number> = new Map();\n /** 反向工作表映射 */\n private reverseSheetMapping: Map<number, string> = new Map();\n /** 是否已初始化 */\n private isInitialized = false;\n /** 下一个工作表ID */\n private nextSheetId = 0;\n /** 单元格高亮管理器 */\n cellHighlightManager: CellHighlightManager;\n /** 正在输入公式的单元格(如果是完整的公式 不做记录。没输入完整才记录)。为后面拖拽单元范围或者点击单元格选中计算范围逻辑做准备。 */\n _formulaWorkingOnCell: FormulaCell | null = null;\n /** 上一次被记录过的光标位置。 公式输入框中光标位置 */\n lastKnownCursorPosInFormulaInput: number | null = null;\n\n /** 公式范围选择器 */\n formulaRangeSelector: FormulaRangeSelector;\n /** 正在处理的单元格选区 */\n lastSelectionRangesOfHandling: CellRange[] = [];\n\n inputIsParamMode: {\n inParamMode: boolean;\n functionParamPosition: {\n start: number;\n end: number;\n } | null;\n } | null = null;\n\n inputingElement: HTMLInputElement | null = null;\n\n /** 跨sheet公式处理器 */\n crossSheetHandler: CrossSheetFormulaHandler;\n\n get formulaWorkingOnCell(): FormulaCell | null {\n return this._formulaWorkingOnCell;\n }\n set formulaWorkingOnCell(value: FormulaCell | null) {\n this._formulaWorkingOnCell = value;\n }\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.cellHighlightManager = new CellHighlightManager(sheet);\n this.formulaRangeSelector = new FormulaRangeSelector(this);\n this.initializeFormulaEngine();\n this.crossSheetHandler = new CrossSheetFormulaHandler(this.formulaEngine, this.sheet.getSheetManager(), this);\n }\n\n /**\n * 初始化FormulaEngine实例\n */\n private initializeFormulaEngine(): void {\n try {\n this.formulaEngine = new FormulaEngine(DEFAULT_FORMULA_ENGINE_CONFIG);\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize FormulaEngine:', error);\n throw new Error('FormulaManager initialization failed');\n }\n }\n\n /**\n * 添加新工作表 - 正确的多表格支持 (MIT兼容)\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据 因为要输入给FormulaEngine\n * @param sheetTitle 工作表标题(用户可见的名称)\n * @returns 工作表ID\n */\n addSheet(sheetKey: string, normalizedData?: unknown[][], sheetTitle?: string): number {\n this.ensureInitialized();\n\n // 检查是否已存在\n if (this.sheetMapping.has(sheetKey)) {\n const existingId = this.sheetMapping.get(sheetKey);\n if (existingId !== undefined) {\n return existingId;\n }\n }\n\n try {\n // 记录添加前的数量\n const wasFirstSheet = this.sheetMapping.size === 0;\n\n // 使用FormulaEngine创建工作表\n const sheetId = this.formulaEngine.addSheet(sheetKey, normalizedData);\n\n // 设置工作表标题(如果提供)\n if (sheetTitle) {\n this.formulaEngine.setSheetTitle(sheetKey, sheetTitle);\n }\n\n this.sheetMapping.set(sheetKey, sheetId);\n this.reverseSheetMapping.set(sheetId, sheetKey);\n this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1);\n\n // 如果是第一个工作表,设置为活动工作表\n if (wasFirstSheet) {\n this.formulaEngine.setActiveSheet(sheetKey);\n }\n\n return sheetId;\n } catch (error) {\n console.error(`Failed to add sheet ${sheetKey}:`, error);\n throw new Error(`Failed to add sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 标准化工作表数据\n * @param data 工作表数据\n * @returns 标准化后的工作表数据\n */\n normalizeSheetData(data: unknown[][], tableInstance: VTable.ListTable): unknown[][] {\n try {\n //将columns中的title追加到data中\n const headerRows: unknown[][] = [];\n for (let i = 0; i < tableInstance.columnHeaderLevelCount; i++) {\n const headerRow: unknown[] = [];\n for (let j = 0; j < tableInstance.colCount; j++) {\n const cellValue = tableInstance.getCellValue(j, i);\n headerRow.push(cellValue);\n }\n headerRows.push(headerRow);\n }\n const dataCopy = JSON.parse(JSON.stringify(data));\n\n const toNormalizeData = tableInstance.columnHeaderLevelCount > 0 ? [...headerRows].concat(dataCopy) : dataCopy;\n\n if (!Array.isArray(toNormalizeData) || toNormalizeData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都是数组,并转换数据类型\n const validData = toNormalizeData.filter(row => Array.isArray(row));\n if (validData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都有相同的列数,并正确处理数据类型\n const maxCols = Math.max(...validData.map(row => row.length));\n return validData.map(row => {\n const normalizedRow = Array.isArray(row)\n ? row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) && cell.trim() !== '' ? num : cell;\n }\n return cell ?? '';\n })\n : [''];\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n return normalizedRow;\n });\n } catch (error) {\n console.error('Failed to normalize sheet data:', error);\n return [['']];\n }\n }\n\n /**\n * 移除工作表 (MIT兼容)\n * @param sheetKey 工作表键\n */\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n try {\n // 不能删除最后一个sheet\n if (this.sheetMapping.size <= 1) {\n throw new Error('Cannot remove the last sheet');\n }\n\n this.formulaEngine.removeSheet(sheetKey);\n this.sheetMapping.delete(sheetKey);\n this.reverseSheetMapping.delete(sheetId);\n } catch (error) {\n console.error(`Failed to remove sheet ${sheetKey}:`, error);\n throw new Error(`Failed to remove sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 重命名工作表 (MIT兼容)\n * @param oldKey 旧工作表键\n * @param newKey 新工作表键\n */\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheetMapping.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n try {\n // 使用FormulaEngine的renameSheet API\n this.formulaEngine.renameSheet(oldKey, newKey);\n\n // 更新内部映射\n this.sheetMapping.delete(oldKey);\n this.sheetMapping.set(newKey, sheetId);\n this.reverseSheetMapping.set(sheetId, newKey);\n } catch (error) {\n console.error(`Failed to rename sheet from ${oldKey} to ${newKey}:`, error);\n throw new Error(`Failed to rename sheet: ${oldKey}`);\n }\n }\n\n /**\n * 更新工作表标题(用于sheet重命名时)\n * @param sheetKey 工作表键\n * @param newTitle 新标题\n */\n updateSheetTitle(sheetKey: string, newTitle: string): void {\n // 获取旧标题\n const oldTitle = this.formulaEngine.getSheetTitle(sheetKey);\n\n // 使用FormulaEngine的setSheetTitle API更新标题映射\n this.formulaEngine.setSheetTitle(sheetKey, newTitle);\n\n // 更新所有引用旧标题的公式\n if (oldTitle && oldTitle !== newTitle) {\n this.updateCrossSheetFormulasWithNewTitle(oldTitle, newTitle);\n }\n\n // 清除相关缓存以确保跨sheet公式能正确识别新的标题\n if (this.crossSheetHandler) {\n this.crossSheetHandler.clearCache();\n }\n }\n\n /**\n * 更新所有引用旧标题的跨sheet公式\n * @param oldTitle 旧标题\n * @param newTitle 新标题\n */\n private updateCrossSheetFormulasWithNewTitle(oldTitle: string, newTitle: string): void {\n try {\n // 获取所有工作表\n const allSheets = this.sheet.getSheetManager().getAllSheets();\n\n for (const sheetInfo of allSheets) {\n const formulas = this.formulaEngine.exportFormulas(sheetInfo.sheetKey);\n\n for (const [cellRef, formula] of Object.entries(formulas)) {\n if (this.hasCrossSheetReference(formula)) {\n // 转义旧标题中的特殊字符,用于正则表达式\n const escapedOldTitle = oldTitle.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // 创建各种可能的引用模式\n const patterns = [\n // 英文感叹号,无引号: 销售数据!\n `${escapedOldTitle}!`,\n // 中文感叹号,无引号: 销售数据!\n `${escapedOldTitle}!`,\n // 英文感叹号,有引号: '销售数据'!\n `'${escapedOldTitle}'!`,\n // 中文感叹号,有引号: '销售数据'!\n `'${escapedOldTitle}'!`\n ];\n\n let updatedFormula = formula;\n let hasChanges = false;\n\n // 逐一替换各种模式\n for (const pattern of patterns) {\n if (updatedFormula.includes(pattern)) {\n // 根据模式类型进行相应的替换\n if (pattern.includes(`'${escapedOldTitle}'`)) {\n // 处理带引号的情况\n if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(new RegExp(`'${escapedOldTitle}'!`, 'g'), `'${newTitle}'!`);\n } else if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(\n new RegExp(`'${escapedOldTitle}'!`, 'g'),\n `'${newTitle}'!`\n );\n }\n } else {\n // 处理无引号的情况\n if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(new RegExp(`${escapedOldTitle}!`, 'g'), `${newTitle}!`);\n } else if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(new RegExp(`${escapedOldTitle}!`, 'g'), `${newTitle}!`);\n }\n }\n hasChanges = true;\n }\n }\n\n if (hasChanges && updatedFormula !== formula) {\n // 解析单元格引用 (A1格式转换为行列坐标)\n const cell = this.parseA1CellRef(`${sheetInfo.sheetKey}!${cellRef}`);\n if (cell) {\n // 更新公式\n this.formulaEngine.setCellContent(cell, updatedFormula);\n // console.log(`Updated formula in ${sheetInfo.sheetKey}!${cellRef}: ${formula} -> ${updatedFormula}`);\n }\n }\n }\n }\n }\n } catch (error) {\n console.error(`Failed to update cross-sheet formulas from ${oldTitle} to ${newTitle}:`, error);\n }\n }\n\n /**\n * 解析A1格式的单元格引用为行列坐标\n * @param cellRef A1格式的单元格引用,如 \"Sheet1!A1\" 或 \"A1\"\n * @returns 单元格对象,如果解析失败返回null\n */\n private parseA1CellRef(cellRef: string): { sheet: string; row: number; col: number } | null {\n try {\n // 支持中英文感叹号\n let parts: string[];\n if (cellRef.includes('!')) {\n parts = cellRef.split('!');\n } else if (cellRef.includes('!')) {\n parts = cellRef.split('!');\n } else {\n // 没有sheet前缀,使用默认sheet\n parts = ['Sheet1', cellRef];\n }\n\n if (parts.length !== 2) {\n return null;\n }\n\n const [sheet, a1Notation] = parts;\n\n // 解析A1格式 (如 A1, B2, AA10)\n const match = a1Notation.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n return null;\n }\n\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 转换列字母为索引 (A=0, B=1, ..., Z=25, AA=26, etc.)\n let col = 0;\n for (let i = 0; i < colLetters.length; i++) {\n col = col * 26 + (colLetters.charCodeAt(i) - 65);\n }\n\n return { sheet, row: rowNumber - 1, col };\n } catch {\n return null;\n }\n }\n\n /**\n * 确保sheet已在formulaEngine中注册\n * @param sheetKey 工作表键\n */\n private ensureSheetRegistered(sheetKey: string): void {\n if (this.sheet.workSheetInstances.has(sheetKey)) {\n return;\n }\n const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);\n if (!sheetDefine) {\n return;\n }\n const instance = this.sheet.createWorkSheetInstance(sheetDefine);\n this.sheet.workSheetInstances.set(sheetKey, instance);\n }\n\n /**\n * 确保跨sheet公式中引用的所有sheet都已注册\n * @param formula 公式字符串\n */\n private ensureAllSheetsRegisteredForCrossSheetFormula(formula: string): void {\n try {\n // 提取公式中引用的所有sheet名称\n const sheetPattern = /([A-Za-z0-9_一-龥]+)!/g;\n let match;\n const referencedSheets = new Set<string>();\n\n while ((match = sheetPattern.exec(formula)) !== null) {\n const sheetName = match[1];\n if (sheetName) {\n referencedSheets.add(sheetName);\n }\n }\n\n // 将所有引用的sheet转换为sheetKey并注册\n for (const sheetTitle of referencedSheets) {\n // 查找对应的sheetKey\n const allSheets = this.sheet.getSheetManager().getAllSheets();\n const sheetInfo = allSheets.find(sheet => sheet.sheetTitle.toLowerCase() === sheetTitle.toLowerCase());\n\n if (sheetInfo) {\n // 确保这个sheet已注册到formulaEngine\n this.ensureSheetRegistered(sheetInfo.sheetKey);\n }\n }\n } catch (error) {\n console.warn('Failed to register sheets for cross-sheet formula:', error);\n }\n }\n\n /**\n * 标准化数据供公式引擎使用\n * @param data 原始数据\n * @returns 标准化后的数据\n */\n private normalizeDataForFormulaEngine(data: unknown[][]): unknown[][] {\n if (!Array.isArray(data) || data.length === 0) {\n return [['']];\n }\n\n const maxCols = Math.max(...data.map(row => (Array.isArray(row) ? row.length : 0)));\n\n return data.map(row => {\n if (!Array.isArray(row)) {\n return Array(maxCols).fill('');\n }\n\n const normalizedRow = row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) && cell.trim() !== '' ? num : cell;\n }\n return cell ?? '';\n });\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n\n return normalizedRow;\n });\n }\n\n /**\n * 触发公式相关事件\n * @param cell 单元格\n * @param eventType 事件类型\n * @param formula 公式内容\n * @param error 错误信息(可选)\n */\n private emitFormulaEvent(\n cell: FormulaCell,\n eventType: 'added' | 'removed' | 'error',\n formula?: string,\n error?: any\n ): void {\n // Safely get the worksheet instance\n let worksheet: any = null;\n\n // Try to get worksheet using the public method if available\n if (this.sheet && typeof this.sheet.getWorkSheetByKey === 'function') {\n worksheet = this.sheet.getWorkSheetByKey(cell.sheet);\n } else {\n // Fallback: try to access the private property directly (for backwards compatibility in tests)\n try {\n const workSheetInstances = (this.sheet as any).workSheetInstances;\n if (workSheetInstances && workSheetInstances.get) {\n worksheet = workSheetInstances.get(cell.sheet);\n }\n } catch (e) {\n // If we can't access the worksheet, just return silently\n return;\n }\n }\n\n if (!worksheet || !worksheet.eventManager) {\n return;\n }\n\n switch (eventType) {\n case 'added':\n worksheet.eventManager.emitFormulaAdded({ row: cell.row, col: cell.col }, formula);\n break;\n case 'removed':\n worksheet.eventManager.emitFormulaRemoved({ row: cell.row, col: cell.col }, formula);\n break;\n case 'error':\n worksheet.eventManager.emitFormulaError(cell, formula || '', error);\n break;\n }\n }\n\n /**\n * 获取工作表ID\n * @param sheetKey 工作表键\n * @returns 工作表ID\n */\n getSheetId(sheetKey: string): number {\n // 首先尝试精确匹配\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId !== undefined) {\n return sheetId;\n }\n\n // 如果精确匹配失败,尝试不区分大小写的匹配\n const lowerSheetKey = sheetKey.toLowerCase();\n for (const [existingKey, existingId] of this.sheetMapping.entries()) {\n if (existingKey.toLowerCase() === lowerSheetKey) {\n return existingId;\n }\n }\n\n // 如果还是找不到,自动创建新sheet\n return this.addSheet(sheetKey);\n }\n\n /**\n * 设置单元格内容 (MIT兼容)\n * @param cell 单元格\n * @param value 值\n */\n setCellContent(cell: FormulaCell, value: unknown): void {\n this.ensureInitialized();\n\n // 检查单元格参数有效性\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n console.error('Invalid cell parameter:', cell);\n throw new Error('Invalid cell parameter for setCellContent');\n }\n\n // 检查单元格是否超出有效范围\n if (cell.row < 0 || cell.col < 0) {\n console.error('Cell coordinates out of bounds:', cell);\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n try {\n // 检查是否为公式\n const isFormula = typeof value === 'string' && value.startsWith('=');\n const oldFormula = this.getCellFormula(cell);\n\n // 检查是否为跨sheet公式\n if (isFormula && this.hasCrossSheetReference(value)) {\n // 使用跨sheet公式处理器处理\n // 注意:setCrossSheetFormula 是异步的,但这里没有等待\n // 由于 setCrossSheetFormula 内部会同步调用 formulaEngine.setCellContent,\n // 所以公式会被立即存储,不需要等待 Promise\n this.crossSheetHandler.setCrossSheetFormula(cell, value);\n } else {\n // 使用FormulaEngine设置单元格内容\n this.formulaEngine.setCellContent(cell, value);\n }\n\n // 在操作成功后触发相应的事件\n const newFormula = this.getCellFormula(cell);\n if (newFormula && newFormula !== oldFormula) {\n // 公式添加或更新\n this.emitFormulaEvent(cell, 'added', newFormula);\n } else if (!newFormula && oldFormula) {\n // 公式被移除\n this.emitFormulaEvent(cell, 'removed', oldFormula);\n }\n } catch (error) {\n console.error('Failed to set cell content:', error);\n\n // 触发公式错误事件\n if (typeof value === 'string' && value.startsWith('=')) {\n this.emitFormulaEvent(cell, 'error', value, error);\n }\n\n // 提供更详细的错误信息\n if (error instanceof Error) {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}. ${error.message}`);\n } else {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}`);\n }\n }\n }\n\n /**\n * 获取单元格值 (MIT兼容)\n * @param cell 单元格\n * @returns 单元格值\n */\n getCellValue(cell: FormulaCell): FormulaResult {\n this.ensureInitialized();\n\n try {\n // 检查是否为跨sheet公式\n const formula = this.formulaEngine.getCellFormula(cell);\n if (formula && this.hasCrossSheetReference(formula)) {\n // 对于跨sheet公式,确保所有相关sheet都已注册\n this.ensureAllSheetsRegisteredForCrossSheetFormula(formula);\n const result = this.formulaEngine.getCellValue(cell);\n return result;\n }\n\n // 检查sheet是否已在formulaEngine中注册,如果没有则尝试注册\n this.ensureSheetRegistered(cell.sheet);\n\n // 使用FormulaEngine获取单元格值\n return this.formulaEngine.getCellValue(cell);\n } catch (error) {\n console.error('Failed to get cell value:', error);\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n /**\n * 获取单元格公式 (MIT兼容)\n * @param cell 单元格\n * @returns 单元格公式\n */\n getCellFormula(cell: FormulaCell): string | undefined {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取单元格公式\n return this.formulaEngine.getCellFormula(cell);\n } catch (error) {\n console.error('Failed to get cell formula:', error);\n return undefined;\n }\n }\n\n /**\n * 检查是否为公式单元格 (MIT兼容)\n * @param cell 单元格\n * @returns 是否为公式单元格\n */\n isCellFormula(cell: FormulaCell): boolean {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine检查是否为公式单元格\n return this.formulaEngine.isCellFormula(cell);\n } catch (error) {\n console.error('Failed to check if cell has formula:', error);\n return false;\n }\n }\n\n /**\n * 获取依赖此单元格的所有单元格(包括范围依赖)(MIT兼容)\n * @param cell 单元格\n * @returns 依赖此单元格的所有单元格\n */\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取依赖单元格\n return this.formulaEngine.getCellDependents(cell);\n } catch (error) {\n console.error('Failed to get cell dependents:', error);\n return [];\n }\n }\n\n /**\n * 获取此单元格依赖的所有单元格 (MIT兼容)\n * @param cell 单元格\n * @returns 此单元格依赖的所有单元格\n */\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取前置单元格\n return this.formulaEngine.getCellPrecedents(cell);\n } catch (error) {\n console.error('Failed to get cell precedents:', error);\n return [];\n }\n }\n\n /**\n * 批量更新单元格 (MIT兼容)\n * @param changes 更新内容\n */\n batchUpdate(changes: Array<{ cell: FormulaCell; value: unknown }>): void {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine批量更新单元格\n for (const { cell, value } of changes) {\n this.formulaEngine.setCellContent(cell, value);\n }\n } catch (error) {\n console.error('Failed to batch update cells:', error);\n throw new Error('Batch update failed');\n }\n }\n\n /**\n * 添加行 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 添加的行数\n */\n addRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1) {\n this.ensureInitialized();\n\n try {\n // 简化实现:在指定位置插入空行\n console.warn(\n `addRows operation not fully implemented in MIT version.\n Inserting ${numberOfRows} empty rows at index ${rowIndex}`\n );\n // 调整公式引用\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'insert',\n 'row',\n rowIndex,\n numberOfRows,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n\n // 刷新所有受影响的单元格\n [...adjustedCells, ...movedCells].forEach(cell => {\n // this.sheet.getActiveSheet().tableInstance.scenegraph.updateCellContent(cell.row, cell.col);\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value);\n });\n } catch (error) {\n console.error('Failed to add rows:', error);\n throw new Error(`Failed to add ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 删除行 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 删除的行数\n */\n removeRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1) {\n this.ensureInitialized();\n\n try {\n // 简化实现:删除指定位置的行\n console.warn(\n `removeRows operation not fully implemented in MIT version. Removing ${numberOfRows} rows at index ${rowIndex}`\n );\n\n // 调整公式引用,获取所有受影响的单元格\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'delete',\n 'row',\n rowIndex,\n numberOfRows,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n\n // 刷新所有受影响的单元格\n [...adjustedCells, ...movedCells].forEach(cell => {\n // this.sheet.getActiveSheet().tableInstance.scenegraph.updateCellContent(cell.row, cell.col);\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value);\n });\n } catch (error) {\n console.error('Failed to remove rows:', error);\n throw new Error(`Failed to remove ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 添加列 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 添加的列数\n */\n addColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n // 简化实现:在指定位置插入空列\n console.warn(\n `addColumns operation not fully implemented in MIT version.\n Inserting ${numberOfColumns} empty columns at index ${columnIndex}`\n );\n\n // 调整公式引用,获取所有受影响的单元格\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'insert',\n 'column',\n columnIndex,\n numberOfColumns,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n [...adjustedCells, ...movedCells].forEach(cell => {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value);\n });\n } catch (error) {\n console.error('Failed to add columns:', error);\n throw new Error(`Failed to add ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n\n /**\n * 删除列 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 删除的列数\n */\n removeColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n // 简化实现:删除指定位置的列\n console.warn(\n `removeColumns operation not fully implemented in MIT version.\n Removing ${numberOfColumns} columns at index ${columnIndex}`\n );\n\n // 调整公式引用,获取所有受影响的单元格\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'delete',\n 'column',\n columnIndex,\n numberOfColumns,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n // 刷新所有受影响的单元格\n [...adjustedCells, ...movedCells].forEach(cell => {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value);\n });\n } catch (error) {\n console.error('Failed to remove columns:', error);\n throw new Error(`Failed to remove ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n /**\n * 移动列表头位置.将sourceCol位置开始往后moveCount个列,移动调整到targetCol位置处\n * @param sheetKey\n * @param sourceCol\n * @param targetCol\n * @returns\n */\n changeColumnHeaderPosition(sheetKey: string, sourceCol: number, targetCol: number): void {\n this.ensureInitialized();\n\n try {\n // 获取工作表信息\n const sheet = this.sheet.getSheet(sheetKey);\n if (!sheet) {\n throw new Error(`Sheet not found: ${sheetKey}`);\n }\n\n const totalColCount = sheet.columnCount;\n const totalRowCount = sheet.rowCount;\n\n // 使用专门的列移动方法来避免#REF!错误\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferencesForColumnMove(\n sheetKey,\n sourceCol,\n targetCol,\n totalColCount,\n totalRowCount\n );\n\n // 刷新所有受影响的单元格\n const allAffectedCells = [...adjustedCells, ...movedCells];\n for (const cell of allAffectedCells) {\n const result = this.getCellValue(cell);\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value);\n }\n\n // Log completion info\n // console.log(\n // `Column move completed: ${adjustedCells.length} formulas adjusted, ${movedCells.length} formulas moved`\n // );\n } catch (error) {\n console.error(`Failed to change column header position from ${sourceCol} to ${targetCol}:`, error);\n throw new Error(\n `Failed to change column header position: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * 移动行表头位置.将sourceRow位置开始往后moveCount个行,移动调整到targetRow位置处\n * @param sheetKey 工作表键\n * @param sourceRow 源行索引\n * @param targetRow 目标行索引\n */\n changeRowHeaderPosition(sheetKey: string, sourceRow: number, targetRow: number): void {\n this.ensureInitialized();\n\n try {\n // 获取工作表信息\n const sheet = this.sheet.getSheet(sheetKey);\n if (!sheet) {\n throw new Error(`Sheet not found: ${sheetKey}`);\n }\n\n // 使用专门的行移动方法来避免#REF!错误\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferencesForRowMove(\n sheetKey,\n sourceRow,\n targetRow\n );\n\n // 刷新所有受影响的单元格\n const allAffectedCells = [...adjustedCells, ...movedCells];\n for (const cell of allAffectedCells) {\n const result = this.getCellValue(cell);\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value);\n }\n\n // Log completion info\n // console.log(\n // `Row move completed: ${adjustedCells.length} formulas adjusted, ${movedCells.length} formulas moved`\n // );\n } catch (error) {\n console.error(`Failed to change row header position from ${sourceRow} to ${targetRow}:`, error);\n throw new Error(\n `Failed to change row header position: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * 获取工作表序列化数据 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @returns 工作表序列化数据\n */\n getSheetSerialized(sheetKey: string): unknown[][] {\n this.ensureInitialized();\n\n try {\n // 简化实现:返回空数组,实际实现需要获取工作表数据\n console.warn(`getSheetSerialized operation not fully implemented in MIT version for sheet ${sheetKey}`);\n return [[]];\n } catch (error) {\n console.error('Failed to get sheet serialized data:', error);\n return [[]];\n }\n }\n\n /**\n * 根据依赖关系对公式进行排序 (MIT兼容)\n * @param sheetKey 工作表键\n * @param formulas 公式数据 (A1表示法的单元格引用 -> 公式内容)\n * @returns 排序后的公式条目数组\n */\n sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][] {\n try {\n // 使用FormulaEngine的依赖排序功能\n return this.formulaEngine.sortFormulasByDependency(sheetKey, formulas);\n } catch (error) {\n // 如果排序失败,返回原始顺序\n return Object.entries(formulas);\n }\n }\n\n /**\n * 检查循环引用 (MIT兼容 - 简化实现)\n * @returns 是否存在循环引用\n */\n hasCircularReference(): boolean {\n try {\n // 简化实现:FormulaEngine内部处理循环引用检测\n console.warn('Circular reference detection not fully implemented in MIT version');\n return false;\n } catch (error) {\n console.error('Failed to check circular reference:', error);\n return false;\n }\n }\n\n /**\n * 获取可用函数列表 - 静态列表\n * @returns 可用函数列表\n */\n getAvailableFunctions(): string[] {\n // 返回常用的Excel函数列表\n return [\n 'ABS',\n 'ACOS',\n 'AND',\n 'ASIN',\n 'ATAN',\n 'AVERAGE',\n 'CEILING',\n 'CONCATENATE',\n 'COS',\n 'COUNT',\n 'COUNTA',\n 'COUNTIF',\n 'COUNTIFS',\n 'DATE',\n 'DAY',\n 'FLOOR',\n 'IF',\n 'IFERROR',\n 'INDEX',\n 'LEFT',\n 'LEN',\n 'LOWER',\n 'MATCH',\n 'MAX',\n 'MID',\n 'MIN',\n 'MONTH',\n 'NOT',\n 'NOW',\n 'OR',\n 'RIGHT',\n 'ROUND',\n 'ROUNDDOWN',\n 'ROUNDUP',\n 'SIN',\n 'SUM',\n 'SUMIF',\n 'SUMIFS',\n 'TAN',\n 'TODAY',\n 'UPPER',\n 'VLOOKUP',\n 'YEAR'\n ];\n }\n\n /**\n * 验证公式语法 (MIT兼容)\n * @param formula 公式\n * @returns 验证结果\n */\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 使用FormulaEngine验证公式\n return this.formulaEngine.validateFormula(formula);\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n // /**\n // * 检查公式是否完整\n // * @param formula 公式字符串\n // * @returns 是否完整\n // */\n // isFormulaComplete(formula: string): boolean {\n // if (!formula || typeof formula !== 'string') {\n // return false;\n // }\n\n // // 如果不是公式,则认为是完整的\n // if (!formula.startsWith('=')) {\n // return true;\n // }\n\n // // 检查是否只有等号或等号加空格\n // if (formula.trim() === '=') {\n // return false;\n // }\n\n // try {\n // // 检查括号是否匹配\n // const openParenCount = (formula.match(/\\(/g) || []).length;\n // const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // // 检查引号是否匹配(简单检查)\n // const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n // const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // // 检查括号和引号是否匹配\n // if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n // return false;\n // }\n\n // // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n // if (\n // formula.match(/\\([^)]*,\\s*\\)/) ||\n // formula.match(/,\\s*\\)/) ||\n // formula.match(/\\(\\s*\\)/) ||\n // formula.endsWith(',')\n // ) {\n // return false;\n // }\n\n // // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n // if (formula.match(/,,/)) {\n // return false;\n // }\n\n // // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n // if (formula.match(/[+\\-*/^&%<>=]$/)) {\n // return false;\n // }\n\n // // 尝试验证公式语法\n // const validationResult = this.validateFormula(formula);\n // return validationResult.isValid;\n // } catch (error) {\n // // 如果验证抛出异常,则公式不完整\n // return false;\n // }\n // }\n\n /**\n * 检查公式是否完整\n * @param formula 公式字符串\n * @returns 是否完整\n */\n isFormulaComplete(formula: string): boolean {\n if (!formula || typeof formula !== 'string') {\n return false;\n }\n\n // 如果不是公式,则认为是完整的\n if (!formula.startsWith('=')) {\n return true;\n }\n\n // 检查是否只有等号或等号加空格\n if (formula.trim() === '=') {\n return false;\n }\n\n try {\n // 检查括号是否匹配\n const openParenCount = (formula.match(/\\(/g) || []).length;\n const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // 检查引号是否匹配(简单检查)\n const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // 检查括号和引号是否匹配\n if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n return false;\n }\n\n // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n if (\n formula.match(/\\([^)]*,\\s*\\)/) ||\n formula.match(/,\\s*\\)/) ||\n formula.match(/\\(\\s*\\)/) ||\n formula.endsWith(',')\n ) {\n return false;\n }\n\n // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n if (formula.match(/,,/)) {\n return false;\n }\n\n // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n if (formula.match(/[+\\-*/^&%<>=]$/)) {\n return false;\n }\n\n // 检查比较运算符后是否缺少操作数,如 \"=IF(E1>,\" 或 \"=IF(A1=)\" 这种情况\n if (formula.match(/[<>=][<>=]?(?=[\\s,)])/)) {\n return false;\n }\n\n // 检查逻辑运算符后是否缺少操作数,如 \"=IF(AND(A1,)\" 这种情况\n if (formula.match(/\\b(AND|OR|NOT)\\((?=[\\s,)])/i)) {\n return false;\n }\n\n // 检查数学运算符后是否有操作数,如 \"=A1+*B1\" 这种情况\n if (formula.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n return false;\n }\n\n // 尝试验证公式语法\n const validationResult = this.validateFormula(formula);\n return validationResult.isValid;\n } catch (error) {\n // 如果验证抛出异常,则公式不完整\n return false;\n }\n }\n\n /**\n * 计算单个公式而不影响工作表 (MIT兼容)\n * @param formula 公式\n * @returns 计算结果\n */\n calculateFormula(formula: string): { value: unknown; error?: string } {\n try {\n // 确保所有引用的sheet都已注册(用于跨sheet公式)\n if (this.hasCrossSheetReference(formula)) {\n this.ensureAllSheetsRegisteredForCrossSheetFormula(formula);\n }\n\n // 使用FormulaEngine计算公式\n return this.formulaEngine.calculateFormula(formula);\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 暂停自动计算 (MIT兼容 - 简化实现)\n * @returns 是否成功\n */\n suspendEvaluation(): void {\n try {\n // 简化实现:FormulaEngine不支持暂停计算\n console.warn('suspendEvaluation operation not supported in MIT version');\n } catch (error) {\n console.error('Failed to suspend evaluation:', error);\n }\n }\n\n /**\n * 恢复自动计算 (MIT兼容 - 简化实现)\n */\n resumeEvaluation(): void {\n try {\n // 简化实现:FormulaEngine不支持恢复计算\n console.warn('resumeEvaluation operation not supported in MIT version');\n } catch (error) {\n console.error('Failed to resume evaluation:', error);\n }\n }\n\n /**\n * 强制重新计算所有公式 (MIT兼容 - 简化实现)\n */\n rebuildAndRecalculate(): void {\n try {\n // 简化实现:FormulaEngine自动处理重新计算\n console.warn('rebuildAndRecalculate operation not required in MIT version');\n } catch (error) {\n console.error('Failed to rebuild and recalculate:', error);\n }\n }\n\n /**\n * 清空所有内容 (MIT兼容)\n */\n clearContent(): void {\n try {\n this.release();\n this.initializeFormulaEngine();\n } catch (error) {\n console.error('Failed to clear content:', error);\n }\n }\n\n /**\n * 销毁FormulaManager (MIT兼容)\n */\n release(): void {\n this.formulaRangeSelector?.release();\n this.cellHighlightManager?.release();\n this.crossSheetHandler?.destroy();\n try {\n if (this.formulaEngine) {\n this.formulaEngine.release();\n }\n } catch (error) {\n console.error('Failed to destroy FormulaEngine:', error);\n } finally {\n this.sheetMapping.clear();\n this.reverseSheetMapping.clear();\n this.isInitialized = false;\n this.nextSheetId = 0;\n this.formulaRangeSelector = null;\n this.cellHighlightManager = null;\n }\n }\n\n /**\n * 导出状态用于调试 (MIT兼容)\n */\n exportState(): Record<string, unknown> {\n return {\n isInitialized: this.isInitialized,\n sheets: Array.from(this.sheetMapping.entries()),\n functions: this.getAvailableFunctions(),\n crossSheetHandler: this.crossSheetHandler ? this.crossSheetHandler.getHandlerStatus() : null,\n stats: null // FormulaEngine不提供统计信息\n };\n }\n\n /**\n * 导出指定工作表中的所有公式 (MIT兼容)\n * @param sheetKey 工作表键\n * @returns 公式数据 (A1表示法的单元格引用 -> 公式内容)\n */\n exportFormulas(sheetKey: string): Record<string, string> {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine导出公式\n return this.formulaEngine.exportFormulas(sheetKey);\n } catch (error) {\n console.error(`Failed to export formulas for sheet ${sheetKey}:`, error);\n return {};\n }\n }\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('FormulaManager not initialized');\n }\n }\n\n /**\n * 获取所有工作表信息 (MIT兼容)\n */\n getAllSheets(): Array<{ key: string; id: number; title: string }> {\n try {\n // 使用FormulaEngine获取所有工作表\n return this.formulaEngine.getAllSheets();\n } catch (error) {\n console.error('Failed to get all sheets:', error);\n return [];\n }\n }\n\n /**\n * 设置活动工作表 (MIT兼容)\n * @param sheetKey 工作表键\n */\n setActiveSheet(sheetKey: string): void {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine设置活动工作表\n this.formulaEngine.setActiveSheet(sheetKey);\n } catch (error) {\n console.error(`Failed to set active sheet ${sheetKey}:`, error);\n throw new Error(`Failed to set active sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 获取活动工作表 (MIT兼容)\n */\n getActiveSheet(): string | null {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取活动工作表\n return this.formulaEngine.getActiveSheet();\n } catch (error) {\n console.error('Failed to get active sheet:', error);\n return null;\n }\n }\n\n /**\n * 复制/移动单元格范围 - 简化版本 (MIT兼容)\n * @param sourceSheet 源工作表\n * @param sourceRange 源范围\n * @param targetSheet 目标工作表\n * @param targetRow 目标行\n * @param targetCol 目标列\n */\n copyRange(\n sourceSheet: string,\n sourceRange: { startRow: number; startCol: number; endRow: number; endCol: number },\n targetSheet: string,\n targetRow: number,\n targetCol: number\n ): void {\n this.ensureInitialized();\n\n try {\n // 简单的数据复制实现\n for (let row = sourceRange.startRow; row <= sourceRange.endRow; row++) {\n for (let col = sourceRange.startCol; col <= sourceRange.endCol; col++) {\n const sourceCell = { sheet: sourceSheet, row, col };\n const targetCell = {\n sheet: targetSheet,\n row: targetRow + (row - sourceRange.startRow),\n col: targetCol + (col - sourceRange.startCol)\n };\n\n const value = this.getCellValue(sourceCell).value;\n if (value !== null && value !== undefined) {\n this.setCellContent(targetCell, value);\n }\n }\n }\n } catch (error) {\n console.error('Failed to copy range:', error);\n throw new Error('Failed to copy cell range');\n }\n }\n\n /**\n * 检查是否为跨sheet引用\n */\n private hasCrossSheetReference(formula: string): boolean {\n return formula.includes('!') || formula.includes('!');\n }\n\n /**\n * 获取跨sheet依赖关系\n */\n getCrossSheetDependencies(): Map<string, string[]> {\n return this.crossSheetHandler.getCrossSheetDependencies();\n }\n\n /**\n * 验证跨sheet公式\n */\n validateCrossSheetFormula(cell: FormulaCell) {\n return this.crossSheetHandler.validateCrossSheetFormula(cell);\n }\n\n /**\n * 验证所有跨sheet公式\n */\n validateAllCrossSheetFormulas() {\n return this.crossSheetHandler.validateAllCrossSheetFormulas();\n }\n\n /**\n * 强制重新计算所有跨sheet公式\n */\n async recalculateAllCrossSheetFormulas(): Promise<void> {\n await this.crossSheetHandler.recalculateAllCrossSheetFormulas();\n }\n\n /**\n * 更新跨sheet公式处理器选项\n */\n updateCrossSheetOptions(options: Partial<CrossSheetFormulaOptions>): void {\n this.crossSheetHandler.updateOptions(options);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/managers/formula-manager.ts"],"names":[],"mappings":"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","file":"formula-manager.js","sourcesContent":["import { FormulaEngine } from '../formula/formula-engine';\nimport type VTableSheet from '../components/vtable-sheet';\nimport type { FormulaCell, FormulaResult, IFormulaManager } from '../ts-types/formula';\nimport { FormulaRangeSelector } from '../formula/formula-range-selector';\nimport type { CellRange, ISheetDefine } from '../ts-types';\nimport { CellHighlightManager } from '../formula';\nimport type * as VTable from '@visactor/vtable';\nimport { CrossSheetFormulaHandler } from '../formula/cross-sheet-formula-handler';\nimport type { CrossSheetFormulaOptions } from '../formula/cross-sheet-formula-handler';\n\n/**\n * 标准FormulaEngine配置 (MIT兼容)\n */\nconst DEFAULT_FORMULA_ENGINE_CONFIG = {\n precisionRounding: 14,\n caseSensitive: false,\n ignoreWhiteSpace: 'standard' as const,\n nullDate: { year: 1899, month: 12, day: 30 },\n dateFormats: ['DD/MM/YYYY', 'DD/MM/YY', 'YYYY-MM-DD'],\n timeFormats: ['hh:mm', 'hh:mm:ss.s']\n};\n\nexport class FormulaManager implements IFormulaManager {\n /** Sheet实例 */\n sheet: VTableSheet;\n /** FormulaEngine实例 */\n formulaEngine: FormulaEngine;\n /** 工作表映射 */\n private sheetMapping: Map<string, number> = new Map();\n /** 反向工作表映射 */\n private reverseSheetMapping: Map<number, string> = new Map();\n /** 是否已初始化 */\n private isInitialized = false;\n /** 下一个工作表ID */\n private nextSheetId = 0;\n /** 单元格高亮管理器 */\n cellHighlightManager: CellHighlightManager;\n /** 正在输入公式的单元格(如果是完整的公式 不做记录。没输入完整才记录)。为后面拖拽单元范围或者点击单元格选中计算范围逻辑做准备。 */\n _formulaWorkingOnCell: FormulaCell | null = null;\n /** 上一次被记录过的光标位置。 公式输入框中光标位置 */\n lastKnownCursorPosInFormulaInput: number | null = null;\n\n /** 公式范围选择器 */\n formulaRangeSelector: FormulaRangeSelector;\n /** 正在处理的单元格选区 */\n lastSelectionRangesOfHandling: CellRange[] = [];\n\n inputIsParamMode: {\n inParamMode: boolean;\n functionParamPosition: {\n start: number;\n end: number;\n } | null;\n } | null = null;\n\n inputingElement: HTMLInputElement | null = null;\n\n /** 跨sheet公式处理器 */\n crossSheetHandler: CrossSheetFormulaHandler;\n\n get formulaWorkingOnCell(): FormulaCell | null {\n return this._formulaWorkingOnCell;\n }\n set formulaWorkingOnCell(value: FormulaCell | null) {\n this._formulaWorkingOnCell = value;\n }\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n this.cellHighlightManager = new CellHighlightManager(sheet);\n this.formulaRangeSelector = new FormulaRangeSelector(this);\n this.initializeFormulaEngine();\n this.crossSheetHandler = new CrossSheetFormulaHandler(this.formulaEngine, this.sheet.getSheetManager(), this);\n }\n\n /**\n * 初始化FormulaEngine实例\n */\n private initializeFormulaEngine(): void {\n try {\n this.formulaEngine = new FormulaEngine(DEFAULT_FORMULA_ENGINE_CONFIG);\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize FormulaEngine:', error);\n throw new Error('FormulaManager initialization failed');\n }\n }\n\n /**\n * 添加新工作表 - 正确的多表格支持 (MIT兼容)\n * @param sheetKey 工作表键\n * @param normalizedData 工作表数据 需要规范处理过 且包含表头的数据 因为要输入给FormulaEngine\n * @param sheetTitle 工作表标题(用户可见的名称)\n * @returns 工作表ID\n */\n addSheet(sheetKey: string, normalizedData?: unknown[][], sheetTitle?: string): number {\n this.ensureInitialized();\n\n // 检查是否已存在\n if (this.sheetMapping.has(sheetKey)) {\n const existingId = this.sheetMapping.get(sheetKey);\n if (existingId !== undefined) {\n return existingId;\n }\n }\n\n try {\n // 记录添加前的数量\n const wasFirstSheet = this.sheetMapping.size === 0;\n\n // 使用FormulaEngine创建工作表\n const sheetId = this.formulaEngine.addSheet(sheetKey, normalizedData);\n\n // 设置工作表标题(如果提供)\n if (sheetTitle) {\n this.formulaEngine.setSheetTitle(sheetKey, sheetTitle);\n }\n\n this.sheetMapping.set(sheetKey, sheetId);\n this.reverseSheetMapping.set(sheetId, sheetKey);\n this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1);\n\n // 如果是第一个工作表,设置为活动工作表\n if (wasFirstSheet) {\n this.formulaEngine.setActiveSheet(sheetKey);\n }\n\n return sheetId;\n } catch (error) {\n console.error(`Failed to add sheet ${sheetKey}:`, error);\n throw new Error(`Failed to add sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 标准化工作表数据\n * @param data 工作表数据\n * @returns 标准化后的工作表数据\n */\n normalizeSheetData(data: unknown[][], tableInstance: VTable.ListTable): unknown[][] {\n try {\n //将columns中的title追加到data中\n const headerRows: unknown[][] = [];\n for (let i = 0; i < tableInstance.columnHeaderLevelCount; i++) {\n const headerRow: unknown[] = [];\n for (let j = 0; j < tableInstance.colCount; j++) {\n const cellValue = tableInstance.getCellValue(j, i);\n headerRow.push(cellValue);\n }\n headerRows.push(headerRow);\n }\n const dataCopy = JSON.parse(JSON.stringify(data));\n\n const toNormalizeData = tableInstance.columnHeaderLevelCount > 0 ? [...headerRows].concat(dataCopy) : dataCopy;\n\n if (!Array.isArray(toNormalizeData) || toNormalizeData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都是数组,并转换数据类型\n const validData = toNormalizeData.filter(row => Array.isArray(row));\n if (validData.length === 0) {\n return [['']];\n }\n\n // 确保所有行都有相同的列数,并正确处理数据类型\n const maxCols = Math.max(...validData.map(row => row.length));\n return validData.map(row => {\n const normalizedRow = Array.isArray(row)\n ? row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) && cell.trim() !== '' ? num : cell;\n }\n return cell ?? '';\n })\n : [''];\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n return normalizedRow;\n });\n } catch (error) {\n console.error('Failed to normalize sheet data:', error);\n return [['']];\n }\n }\n\n /**\n * 移除工作表 (MIT兼容)\n * @param sheetKey 工作表键\n */\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n try {\n // // 不能删除最后一个sheet\n // if (this.sheetMapping.size <= 1) {\n // throw new Error('Cannot remove the last sheet');\n // }\n\n this.formulaEngine.removeSheet(sheetKey);\n this.sheetMapping.delete(sheetKey);\n this.reverseSheetMapping.delete(sheetId);\n } catch (error) {\n console.error(`Failed to remove sheet ${sheetKey}:`, error);\n throw new Error(`Failed to remove sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 重命名工作表 (MIT兼容)\n * @param oldKey 旧工作表键\n * @param newKey 新工作表键\n */\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheetMapping.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n try {\n // 使用FormulaEngine的renameSheet API\n this.formulaEngine.renameSheet(oldKey, newKey);\n\n // 更新内部映射\n this.sheetMapping.delete(oldKey);\n this.sheetMapping.set(newKey, sheetId);\n this.reverseSheetMapping.set(sheetId, newKey);\n } catch (error) {\n console.error(`Failed to rename sheet from ${oldKey} to ${newKey}:`, error);\n throw new Error(`Failed to rename sheet: ${oldKey}`);\n }\n }\n\n /**\n * 更新工作表标题(用于sheet重命名时)\n * @param sheetKey 工作表键\n * @param newTitle 新标题\n */\n updateSheetTitle(sheetKey: string, newTitle: string): void {\n // 获取旧标题\n const oldTitle = this.formulaEngine.getSheetTitle(sheetKey);\n\n // 使用FormulaEngine的setSheetTitle API更新标题映射\n this.formulaEngine.setSheetTitle(sheetKey, newTitle);\n\n // 更新所有引用旧标题的公式\n if (oldTitle && oldTitle !== newTitle) {\n this.updateCrossSheetFormulasWithNewTitle(oldTitle, newTitle);\n }\n\n // 清除相关缓存以确保跨sheet公式能正确识别新的标题\n if (this.crossSheetHandler) {\n this.crossSheetHandler.clearCache();\n }\n }\n\n /**\n * 更新所有引用旧标题的跨sheet公式\n * @param oldTitle 旧标题\n * @param newTitle 新标题\n */\n private updateCrossSheetFormulasWithNewTitle(oldTitle: string, newTitle: string): void {\n try {\n // 获取所有工作表\n const allSheets = this.sheet.getSheetManager().getAllSheets();\n\n for (const sheetInfo of allSheets) {\n const formulas = this.formulaEngine.exportFormulas(sheetInfo.sheetKey);\n\n for (const [cellRef, formula] of Object.entries(formulas)) {\n if (this.hasCrossSheetReference(formula)) {\n // 转义旧标题中的特殊字符,用于正则表达式\n const escapedOldTitle = oldTitle.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // 创建各种可能的引用模式\n const patterns = [\n // 英文感叹号,无引号: 销售数据!\n `${escapedOldTitle}!`,\n // 中文感叹号,无引号: 销售数据!\n `${escapedOldTitle}!`,\n // 英文感叹号,有引号: '销售数据'!\n `'${escapedOldTitle}'!`,\n // 中文感叹号,有引号: '销售数据'!\n `'${escapedOldTitle}'!`\n ];\n\n let updatedFormula = formula;\n let hasChanges = false;\n\n // 逐一替换各种模式\n for (const pattern of patterns) {\n if (updatedFormula.includes(pattern)) {\n // 根据模式类型进行相应的替换\n if (pattern.includes(`'${escapedOldTitle}'`)) {\n // 处理带引号的情况\n if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(new RegExp(`'${escapedOldTitle}'!`, 'g'), `'${newTitle}'!`);\n } else if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(\n new RegExp(`'${escapedOldTitle}'!`, 'g'),\n `'${newTitle}'!`\n );\n }\n } else {\n // 处理无引号的情况\n if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(new RegExp(`${escapedOldTitle}!`, 'g'), `${newTitle}!`);\n } else if (pattern.endsWith('!')) {\n updatedFormula = updatedFormula.replace(new RegExp(`${escapedOldTitle}!`, 'g'), `${newTitle}!`);\n }\n }\n hasChanges = true;\n }\n }\n\n if (hasChanges && updatedFormula !== formula) {\n // 解析单元格引用 (A1格式转换为行列坐标)\n const cell = this.parseA1CellRef(`${sheetInfo.sheetKey}!${cellRef}`);\n if (cell) {\n // 更新公式\n this.formulaEngine.setCellContent(cell, updatedFormula);\n // console.log(`Updated formula in ${sheetInfo.sheetKey}!${cellRef}: ${formula} -> ${updatedFormula}`);\n }\n }\n }\n }\n }\n } catch (error) {\n console.error(`Failed to update cross-sheet formulas from ${oldTitle} to ${newTitle}:`, error);\n }\n }\n\n /**\n * 解析A1格式的单元格引用为行列坐标\n * @param cellRef A1格式的单元格引用,如 \"Sheet1!A1\" 或 \"A1\"\n * @returns 单元格对象,如果解析失败返回null\n */\n private parseA1CellRef(cellRef: string): { sheet: string; row: number; col: number } | null {\n try {\n // 支持中英文感叹号\n let parts: string[];\n if (cellRef.includes('!')) {\n parts = cellRef.split('!');\n } else if (cellRef.includes('!')) {\n parts = cellRef.split('!');\n } else {\n // 没有sheet前缀,使用默认sheet\n parts = ['Sheet1', cellRef];\n }\n\n if (parts.length !== 2) {\n return null;\n }\n\n const [sheet, a1Notation] = parts;\n\n // 解析A1格式 (如 A1, B2, AA10)\n const match = a1Notation.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n return null;\n }\n\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 转换列字母为索引 (A=0, B=1, ..., Z=25, AA=26, etc.)\n let col = 0;\n for (let i = 0; i < colLetters.length; i++) {\n col = col * 26 + (colLetters.charCodeAt(i) - 65);\n }\n\n return { sheet, row: rowNumber - 1, col };\n } catch {\n return null;\n }\n }\n\n // 用于防止死循环的标记\n private creatingSheets = new Set<string>();\n\n /**\n * 确保sheet已在formulaEngine中注册\n * @param sheetKey 工作表键\n */\n private ensureSheetRegistered(sheetKey: string): void {\n if (this.sheet.workSheetInstances.has(sheetKey)) {\n return;\n }\n\n // 如果正在创建这个 sheet,直接返回避免死循环\n if (this.creatingSheets.has(sheetKey)) {\n return;\n }\n\n const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);\n if (!sheetDefine) {\n return;\n }\n\n try {\n // 标记正在创建\n this.creatingSheets.add(sheetKey);\n const instance = this.sheet.createWorkSheetInstance(sheetDefine);\n this.sheet.workSheetInstances.set(sheetKey, instance);\n } finally {\n // 创建完成后移除标记\n this.creatingSheets.delete(sheetKey);\n }\n }\n\n /**\n * 确保跨sheet公式中引用的所有sheet都已注册\n * @param formula 公式字符串\n */\n private ensureAllSheetsRegisteredForCrossSheetFormula(formula: string): void {\n try {\n // 提取公式中引用的所有sheet名称\n const sheetPattern = /([A-Za-z0-9_一-龥]+)!/g;\n let match;\n const referencedSheets = new Set<string>();\n\n while ((match = sheetPattern.exec(formula)) !== null) {\n const sheetName = match[1];\n if (sheetName) {\n referencedSheets.add(sheetName);\n }\n }\n\n // 将所有引用的sheet转换为sheetKey并注册\n for (const sheetTitle of referencedSheets) {\n // 查找对应的sheetKey\n const allSheets = this.sheet.getSheetManager().getAllSheets();\n const sheetInfo = allSheets.find(sheet => sheet.sheetTitle.toLowerCase() === sheetTitle.toLowerCase());\n\n if (sheetInfo) {\n // 确保这个sheet已注册到formulaEngine\n this.ensureSheetRegistered(sheetInfo.sheetKey);\n }\n }\n } catch (error) {\n console.warn('Failed to register sheets for cross-sheet formula:', error);\n }\n }\n\n /**\n * 标准化数据供公式引擎使用\n * @param data 原始数据\n * @returns 标准化后的数据\n */\n private normalizeDataForFormulaEngine(data: unknown[][]): unknown[][] {\n if (!Array.isArray(data) || data.length === 0) {\n return [['']];\n }\n\n const maxCols = Math.max(...data.map(row => (Array.isArray(row) ? row.length : 0)));\n\n return data.map(row => {\n if (!Array.isArray(row)) {\n return Array(maxCols).fill('');\n }\n\n const normalizedRow = row.map(cell => {\n if (typeof cell === 'string') {\n if (cell.startsWith('=')) {\n return cell; // 保持公式不变\n }\n const num = Number(cell);\n return !isNaN(num) && cell.trim() !== '' ? num : cell;\n }\n return cell ?? '';\n });\n\n while (normalizedRow.length < maxCols) {\n normalizedRow.push('');\n }\n\n return normalizedRow;\n });\n }\n\n /**\n * 触发公式相关事件\n * @param cell 单元格\n * @param eventType 事件类型\n * @param formula 公式内容\n * @param error 错误信息(可选)\n */\n private emitFormulaEvent(\n cell: FormulaCell,\n eventType: 'added' | 'removed' | 'error',\n formula?: string,\n error?: any\n ): void {\n // Safely get the worksheet instance\n let worksheet: any = null;\n\n // Try to get worksheet using the public method if available\n if (this.sheet && typeof this.sheet.getWorkSheetByKey === 'function') {\n worksheet = this.sheet.getWorkSheetByKey(cell.sheet);\n } else {\n // Fallback: try to access the private property directly (for backwards compatibility in tests)\n try {\n const workSheetInstances = (this.sheet as any).workSheetInstances;\n if (workSheetInstances && workSheetInstances.get) {\n worksheet = workSheetInstances.get(cell.sheet);\n }\n } catch (_e) {\n void _e;\n // If we can't access the worksheet, just return silently\n return;\n }\n }\n\n if (!worksheet || !worksheet.eventManager) {\n return;\n }\n\n switch (eventType) {\n case 'added':\n worksheet.eventManager.emitFormulaAdded({ row: cell.row, col: cell.col }, formula);\n break;\n case 'removed':\n worksheet.eventManager.emitFormulaRemoved({ row: cell.row, col: cell.col }, formula);\n break;\n case 'error':\n worksheet.eventManager.emitFormulaError(cell, formula || '', error);\n break;\n }\n }\n\n /**\n * 获取工作表ID\n * @param sheetKey 工作表键\n * @returns 工作表ID\n */\n getSheetId(sheetKey: string): number {\n // 首先尝试精确匹配\n const sheetId = this.sheetMapping.get(sheetKey);\n if (sheetId !== undefined) {\n return sheetId;\n }\n\n // 如果精确匹配失败,尝试不区分大小写的匹配\n const lowerSheetKey = sheetKey.toLowerCase();\n for (const [existingKey, existingId] of this.sheetMapping.entries()) {\n if (existingKey.toLowerCase() === lowerSheetKey) {\n return existingId;\n }\n }\n\n // 如果还是找不到,自动创建新sheet\n return this.addSheet(sheetKey);\n }\n\n /**\n * 设置单元格内容 (MIT兼容)\n * @param cell 单元格\n * @param value 值\n */\n setCellContent(cell: FormulaCell, value: unknown): void {\n this.ensureInitialized();\n\n // 检查单元格参数有效性\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n console.error('Invalid cell parameter:', cell);\n throw new Error('Invalid cell parameter for setCellContent');\n }\n\n // 检查单元格是否超出有效范围\n if (cell.row < 0 || cell.col < 0) {\n console.error('Cell coordinates out of bounds:', cell);\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n try {\n // 公式计算应以当前单元格所属 sheet 为上下文\n this.formulaEngine.setActiveSheet(cell.sheet);\n\n // 检查是否为公式\n const isFormula = typeof value === 'string' && value.startsWith('=');\n const oldFormula = this.getCellFormula(cell);\n\n // 检查是否为跨sheet公式\n if (isFormula && this.hasCrossSheetReference(value)) {\n // 使用跨sheet公式处理器处理\n // 注意:setCrossSheetFormula 是异步的,但这里没有等待\n // 由于 setCrossSheetFormula 内部会同步调用 formulaEngine.setCellContent,\n // 所以公式会被立即存储,不需要等待 Promise\n this.crossSheetHandler.setCrossSheetFormula(cell, value);\n } else {\n // 使用FormulaEngine设置单元格内容\n this.formulaEngine.setCellContent(cell, value);\n }\n\n // 在操作成功后触发相应的事件\n const newFormula = this.getCellFormula(cell);\n if (newFormula && newFormula !== oldFormula) {\n // 公式添加或更新\n this.emitFormulaEvent(cell, 'added', newFormula);\n } else if (!newFormula && oldFormula) {\n // 公式被移除\n this.emitFormulaEvent(cell, 'removed', oldFormula);\n }\n } catch (error) {\n console.error('Failed to set cell content:', error);\n\n // 触发公式错误事件\n if (typeof value === 'string' && value.startsWith('=')) {\n this.emitFormulaEvent(cell, 'error', value, error);\n }\n\n // 提供更详细的错误信息\n if (error instanceof Error) {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}. ${error.message}`);\n } else {\n throw new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}`);\n }\n }\n }\n\n /**\n * 获取单元格值 (MIT兼容)\n * @param cell 单元格\n * @returns 单元格值\n */\n getCellValue(cell: FormulaCell): FormulaResult {\n this.ensureInitialized();\n\n try {\n // 检查是否为跨sheet公式\n const formula = this.formulaEngine.getCellFormula(cell);\n if (formula && this.hasCrossSheetReference(formula)) {\n // 对于跨sheet公式,确保所有相关sheet都已注册\n this.ensureAllSheetsRegisteredForCrossSheetFormula(formula);\n const result = this.formulaEngine.getCellValue(cell);\n return result;\n }\n\n // 检查sheet是否已在formulaEngine中注册,如果没有则尝试注册\n this.ensureSheetRegistered(cell.sheet);\n\n // 以当前单元格所属 sheet 作为计算上下文\n this.formulaEngine.setActiveSheet(cell.sheet);\n\n // 使用FormulaEngine获取单元格值\n return this.formulaEngine.getCellValue(cell);\n } catch (error) {\n console.error('Failed to get cell value:', error);\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n /**\n * 获取单元格公式 (MIT兼容)\n * @param cell 单元格\n * @returns 单元格公式\n */\n getCellFormula(cell: FormulaCell): string | undefined {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取单元格公式\n return this.formulaEngine.getCellFormula(cell);\n } catch (error) {\n console.error('Failed to get cell formula:', error);\n return undefined;\n }\n }\n\n /**\n * 检查是否为公式单元格 (MIT兼容)\n * @param cell 单元格\n * @returns 是否为公式单元格\n */\n isCellFormula(cell: FormulaCell): boolean {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine检查是否为公式单元格\n return this.formulaEngine.isCellFormula(cell);\n } catch (error) {\n console.error('Failed to check if cell has formula:', error);\n return false;\n }\n }\n\n /**\n * 获取依赖此单元格的所有单元格(包括范围依赖)(MIT兼容)\n * @param cell 单元格\n * @returns 依赖此单元格的所有单元格\n */\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取依赖单元格\n return this.formulaEngine.getCellDependents(cell);\n } catch (error) {\n console.error('Failed to get cell dependents:', error);\n return [];\n }\n }\n\n /**\n * 获取此单元格依赖的所有单元格 (MIT兼容)\n * @param cell 单元格\n * @returns 此单元格依赖的所有单元格\n */\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取前置单元格\n return this.formulaEngine.getCellPrecedents(cell);\n } catch (error) {\n console.error('Failed to get cell precedents:', error);\n return [];\n }\n }\n\n /**\n * 批量更新单元格 (MIT兼容)\n * @param changes 更新内容\n */\n batchUpdate(changes: Array<{ cell: FormulaCell; value: unknown }>): void {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine批量更新单元格\n for (const { cell, value } of changes) {\n this.formulaEngine.setCellContent(cell, value);\n }\n } catch (error) {\n console.error('Failed to batch update cells:', error);\n throw new Error('Batch update failed');\n }\n }\n\n /**\n * 添加行 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 添加的行数\n */\n addRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1) {\n this.ensureInitialized();\n\n try {\n // 简化实现:在指定位置插入空行\n console.warn(\n `addRows operation not fully implemented in MIT version.\n Inserting ${numberOfRows} empty rows at index ${rowIndex}`\n );\n // 调整公式引用\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'insert',\n 'row',\n rowIndex,\n numberOfRows,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n\n // 刷新所有受影响的单元格\n [...adjustedCells, ...movedCells].forEach(cell => {\n // this.sheet.getActiveSheet().tableInstance.scenegraph.updateCellContent(cell.row, cell.col);\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value, false, false);\n });\n } catch (error) {\n console.error('Failed to add rows:', error);\n throw new Error(`Failed to add ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 删除行 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param rowIndex 行索引\n * @param numberOfRows 删除的行数\n */\n removeRows(sheetKey: string, rowIndex: number, numberOfRows: number = 1) {\n this.ensureInitialized();\n\n try {\n // 简化实现:删除指定位置的行\n console.warn(\n `removeRows operation not fully implemented in MIT version. Removing ${numberOfRows} rows at index ${rowIndex}`\n );\n\n // 调整公式引用,获取所有受影响的单元格\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'delete',\n 'row',\n rowIndex,\n numberOfRows,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n\n // 刷新所有受影响的单元格\n [...adjustedCells, ...movedCells].forEach(cell => {\n // this.sheet.getActiveSheet().tableInstance.scenegraph.updateCellContent(cell.row, cell.col);\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value, false, false);\n });\n } catch (error) {\n console.error('Failed to remove rows:', error);\n throw new Error(`Failed to remove ${numberOfRows} rows at index ${rowIndex}`);\n }\n }\n\n /**\n * 添加列 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 添加的列数\n */\n addColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n // 简化实现:在指定位置插入空列\n console.warn(\n `addColumns operation not fully implemented in MIT version.\n Inserting ${numberOfColumns} empty columns at index ${columnIndex}`\n );\n\n // 调整公式引用,获取所有受影响的单元格\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'insert',\n 'column',\n columnIndex,\n numberOfColumns,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n [...adjustedCells, ...movedCells].forEach(cell => {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value, false, false);\n });\n } catch (error) {\n console.error('Failed to add columns:', error);\n throw new Error(`Failed to add ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n\n /**\n * 删除列 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @param columnIndex 列索引\n * @param numberOfColumns 删除的列数\n */\n removeColumns(sheetKey: string, columnIndex: number, numberOfColumns: number = 1): void {\n this.ensureInitialized();\n\n try {\n // 简化实现:删除指定位置的列\n console.warn(\n `removeColumns operation not fully implemented in MIT version.\n Removing ${numberOfColumns} columns at index ${columnIndex}`\n );\n\n // 调整公式引用,获取所有受影响的单元格\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferences(\n sheetKey,\n 'delete',\n 'column',\n columnIndex,\n numberOfColumns,\n this.sheet.getSheet(sheetKey).columnCount,\n this.sheet.getSheet(sheetKey).rowCount\n );\n // 刷新所有受影响的单元格\n [...adjustedCells, ...movedCells].forEach(cell => {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: sheetKey,\n row: cell.row,\n col: cell.col\n });\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value, false, false);\n });\n } catch (error) {\n console.error('Failed to remove columns:', error);\n throw new Error(`Failed to remove ${numberOfColumns} columns at index ${columnIndex}`);\n }\n }\n /**\n * 移动列表头位置.将sourceCol位置开始往后moveCount个列,移动调整到targetCol位置处\n * @param sheetKey\n * @param sourceCol\n * @param targetCol\n * @returns\n */\n changeColumnHeaderPosition(sheetKey: string, sourceCol: number, targetCol: number): void {\n this.ensureInitialized();\n\n try {\n // 获取工作表信息\n const sheet = this.sheet.getSheet(sheetKey);\n if (!sheet) {\n throw new Error(`Sheet not found: ${sheetKey}`);\n }\n\n const totalColCount = sheet.columnCount;\n const totalRowCount = sheet.rowCount;\n\n // 使用专门的列移动方法来避免#REF!错误\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferencesForColumnMove(\n sheetKey,\n sourceCol,\n targetCol,\n totalColCount,\n totalRowCount\n );\n\n // 刷新所有受影响的单元格\n const allAffectedCells = [...adjustedCells, ...movedCells];\n for (const cell of allAffectedCells) {\n const result = this.getCellValue(cell);\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value, false, false);\n }\n\n // Log completion info\n // console.log(\n // `Column move completed: ${adjustedCells.length} formulas adjusted, ${movedCells.length} formulas moved`\n // );\n } catch (error) {\n console.error(`Failed to change column header position from ${sourceCol} to ${targetCol}:`, error);\n throw new Error(\n `Failed to change column header position: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * 移动行表头位置.将sourceRow位置开始往后moveCount个行,移动调整到targetRow位置处\n * @param sheetKey 工作表键\n * @param sourceRow 源行索引\n * @param targetRow 目标行索引\n */\n changeRowHeaderPosition(sheetKey: string, sourceRow: number, targetRow: number): void {\n this.ensureInitialized();\n\n try {\n // 获取工作表信息\n const sheet = this.sheet.getSheet(sheetKey);\n if (!sheet) {\n throw new Error(`Sheet not found: ${sheetKey}`);\n }\n\n // 使用专门的行移动方法来避免#REF!错误\n const { adjustedCells, movedCells } = this.formulaEngine.adjustFormulaReferencesForRowMove(\n sheetKey,\n sourceRow,\n targetRow\n );\n\n // 刷新所有受影响的单元格\n const allAffectedCells = [...adjustedCells, ...movedCells];\n for (const cell of allAffectedCells) {\n const result = this.getCellValue(cell);\n this.sheet\n .getActiveSheet()\n .tableInstance?.changeCellValue(cell.col, cell.row, result.error ? '#ERROR!' : result.value, false, false);\n }\n\n // Log completion info\n // console.log(\n // `Row move completed: ${adjustedCells.length} formulas adjusted, ${movedCells.length} formulas moved`\n // );\n } catch (error) {\n console.error(`Failed to change row header position from ${sourceRow} to ${targetRow}:`, error);\n throw new Error(\n `Failed to change row header position: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * 获取工作表序列化数据 (MIT兼容 - 简化实现)\n * @param sheetKey 工作表键\n * @returns 工作表序列化数据\n */\n getSheetSerialized(sheetKey: string): unknown[][] {\n this.ensureInitialized();\n\n try {\n // 简化实现:返回空数组,实际实现需要获取工作表数据\n console.warn(`getSheetSerialized operation not fully implemented in MIT version for sheet ${sheetKey}`);\n return [[]];\n } catch (error) {\n console.error('Failed to get sheet serialized data:', error);\n return [[]];\n }\n }\n\n /**\n * 根据依赖关系对公式进行排序 (MIT兼容)\n * @param sheetKey 工作表键\n * @param formulas 公式数据 (A1表示法的单元格引用 -> 公式内容)\n * @returns 排序后的公式条目数组\n */\n sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][] {\n try {\n // 使用FormulaEngine的依赖排序功能\n return this.formulaEngine.sortFormulasByDependency(sheetKey, formulas);\n } catch (_error) {\n void _error;\n // 如果排序失败,返回原始顺序\n return Object.entries(formulas);\n }\n }\n\n /**\n * 检查循环引用 (MIT兼容 - 简化实现)\n * @returns 是否存在循环引用\n */\n hasCircularReference(): boolean {\n try {\n // 简化实现:FormulaEngine内部处理循环引用检测\n console.warn('Circular reference detection not fully implemented in MIT version');\n return false;\n } catch (error) {\n console.error('Failed to check circular reference:', error);\n return false;\n }\n }\n\n /**\n * 获取可用函数列表 - 静态列表\n * @returns 可用函数列表\n */\n getAvailableFunctions(): string[] {\n // 返回常用的Excel函数列表\n return [\n 'ABS',\n 'ACOS',\n 'AND',\n 'ASIN',\n 'ATAN',\n 'AVERAGE',\n 'CEILING',\n 'CONCATENATE',\n 'COS',\n 'COUNT',\n 'COUNTA',\n 'COUNTIF',\n 'COUNTIFS',\n 'DATE',\n 'DAY',\n 'FLOOR',\n 'IF',\n 'IFERROR',\n 'INDEX',\n 'LEFT',\n 'LEN',\n 'LOWER',\n 'MATCH',\n 'MAX',\n 'MID',\n 'MIN',\n 'MONTH',\n 'NOT',\n 'NOW',\n 'OR',\n 'RIGHT',\n 'ROUND',\n 'ROUNDDOWN',\n 'ROUNDUP',\n 'SIN',\n 'SUM',\n 'SUMIF',\n 'SUMIFS',\n 'TAN',\n 'TODAY',\n 'UPPER',\n 'VLOOKUP',\n 'YEAR'\n ];\n }\n\n /**\n * 验证公式语法 (MIT兼容)\n * @param formula 公式\n * @returns 验证结果\n */\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 使用FormulaEngine验证公式\n return this.formulaEngine.validateFormula(formula);\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n // /**\n // * 检查公式是否完整\n // * @param formula 公式字符串\n // * @returns 是否完整\n // */\n // isFormulaComplete(formula: string): boolean {\n // if (!formula || typeof formula !== 'string') {\n // return false;\n // }\n\n // // 如果不是公式,则认为是完整的\n // if (!formula.startsWith('=')) {\n // return true;\n // }\n\n // // 检查是否只有等号或等号加空格\n // if (formula.trim() === '=') {\n // return false;\n // }\n\n // try {\n // // 检查括号是否匹配\n // const openParenCount = (formula.match(/\\(/g) || []).length;\n // const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // // 检查引号是否匹配(简单检查)\n // const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n // const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // // 检查括号和引号是否匹配\n // if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n // return false;\n // }\n\n // // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n // if (\n // formula.match(/\\([^)]*,\\s*\\)/) ||\n // formula.match(/,\\s*\\)/) ||\n // formula.match(/\\(\\s*\\)/) ||\n // formula.endsWith(',')\n // ) {\n // return false;\n // }\n\n // // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n // if (formula.match(/,,/)) {\n // return false;\n // }\n\n // // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n // if (formula.match(/[+\\-*/^&%<>=]$/)) {\n // return false;\n // }\n\n // // 尝试验证公式语法\n // const validationResult = this.validateFormula(formula);\n // return validationResult.isValid;\n // } catch (error) {\n // // 如果验证抛出异常,则公式不完整\n // return false;\n // }\n // }\n\n /**\n * 检查公式是否完整\n * @param formula 公式字符串\n * @returns 是否完整\n */\n isFormulaComplete(formula: string): boolean {\n if (!formula || typeof formula !== 'string') {\n return false;\n }\n\n // 如果不是公式,则认为是完整的\n if (!formula.startsWith('=')) {\n return true;\n }\n\n // 检查是否只有等号或等号加空格\n if (formula.trim() === '=') {\n return false;\n }\n\n try {\n // 检查括号是否匹配\n const openParenCount = (formula.match(/\\(/g) || []).length;\n const closeParenCount = (formula.match(/\\)/g) || []).length;\n\n // 检查引号是否匹配(简单检查)\n const doubleQuoteCount = (formula.match(/\"/g) || []).length;\n const singleQuoteCount = (formula.match(/'/g) || []).length;\n\n // 检查括号和引号是否匹配\n if (openParenCount !== closeParenCount || doubleQuoteCount % 2 !== 0 || singleQuoteCount % 2 !== 0) {\n return false;\n }\n\n // 检查是否有未完成的函数参数,如 \"=SUM(A1,B2,)\" 这种情况\n if (\n formula.match(/\\([^)]*,\\s*\\)/) ||\n formula.match(/,\\s*\\)/) ||\n formula.match(/\\(\\s*\\)/) ||\n formula.endsWith(',')\n ) {\n return false;\n }\n\n // 检查是否有连续的逗号,如 \"=SUM(A1,,B2)\" 这种情况\n if (formula.match(/,,/)) {\n return false;\n }\n\n // 检查是否以操作符结尾,如 \"=A1+\" 这种情况\n if (formula.match(/[+\\-*/^&%<>=]$/)) {\n return false;\n }\n\n // 检查比较运算符后是否缺少操作数,如 \"=IF(E1>,\" 或 \"=IF(A1=)\" 这种情况\n if (formula.match(/[<>=][<>=]?(?=[\\s,)])/)) {\n return false;\n }\n\n // 检查逻辑运算符后是否缺少操作数,如 \"=IF(AND(A1,)\" 这种情况\n if (formula.match(/\\b(AND|OR|NOT)\\((?=[\\s,)])/i)) {\n return false;\n }\n\n // 检查数学运算符后是否有操作数,如 \"=A1+*B1\" 这种情况\n if (formula.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n return false;\n }\n\n // 尝试验证公式语法\n const validationResult = this.validateFormula(formula);\n return validationResult.isValid;\n } catch (_error) {\n void _error;\n // 如果验证抛出异常,则公式不完整\n return false;\n }\n }\n\n /**\n * 计算单个公式而不影响工作表 (MIT兼容)\n * @param formula 公式\n * @returns 计算结果\n */\n calculateFormula(formula: string): { value: unknown; error?: string } {\n try {\n // 确保所有引用的sheet都已注册(用于跨sheet公式)\n if (this.hasCrossSheetReference(formula)) {\n this.ensureAllSheetsRegisteredForCrossSheetFormula(formula);\n }\n\n // 使用FormulaEngine计算公式\n return this.formulaEngine.calculateFormula(formula);\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n /**\n * 暂停自动计算 (MIT兼容 - 简化实现)\n * @returns 是否成功\n */\n suspendEvaluation(): void {\n try {\n // 简化实现:FormulaEngine不支持暂停计算\n console.warn('suspendEvaluation operation not supported in MIT version');\n } catch (error) {\n console.error('Failed to suspend evaluation:', error);\n }\n }\n\n /**\n * 恢复自动计算 (MIT兼容 - 简化实现)\n */\n resumeEvaluation(): void {\n try {\n // 简化实现:FormulaEngine不支持恢复计算\n console.warn('resumeEvaluation operation not supported in MIT version');\n } catch (error) {\n console.error('Failed to resume evaluation:', error);\n }\n }\n\n /**\n * 基于当前 WorkSheet 实例重建所有公式引擎状态。\n *\n * 典型使用场景:\n * - VTableSheet 在全量更新 sheets 列表后调用;\n * - 先清空内部映射与 FormulaEngine,再根据传入的 sheets 重新注册工作表。\n *\n * 注意:公式内容本身(ISheetDefine.formulas)不在此方法中恢复,\n * 由外层(例如 VTableSheet.loadFormulas)在重建完成后按需重新写入。\n */\n rebuildFormulas(sheets: ISheetDefine[]): void {\n try {\n // 释放旧的 FormulaEngine,但保留高亮管理等 UI 相关对象\n if (this.formulaEngine) {\n try {\n this.formulaEngine.release();\n } catch (error) {\n console.error('Failed to release FormulaEngine before rebuild:', error);\n }\n }\n\n // 重置内部状态映射\n this.sheetMapping.clear();\n this.reverseSheetMapping.clear();\n this.nextSheetId = 0;\n\n // 重新初始化公式引擎\n this.initializeFormulaEngine();\n\n // 重新创建跨 sheet 公式处理器,使其绑定新的 FormulaEngine 实例\n if (this.crossSheetHandler) {\n try {\n this.crossSheetHandler.destroy();\n } catch (error) {\n console.error('Failed to destroy CrossSheetFormulaHandler before rebuild:', error);\n }\n }\n this.crossSheetHandler = new CrossSheetFormulaHandler(this.formulaEngine, this.sheet.getSheetManager(), this);\n\n // 基于传入的 sheets 重新注册所有工作表\n sheets.forEach((sheetDefine: ISheetDefine) => {\n const sheetKey = sheetDefine.sheetKey;\n const worksheetInstance = this.sheet.workSheetInstances.get(sheetKey);\n if (!worksheetInstance || !worksheetInstance.tableInstance) {\n // 如果还没有对应的 WorkSheet 实例,跳过,后续按需再补充\n return;\n }\n\n const normalizedData = this.normalizeSheetData(worksheetInstance.getData(), worksheetInstance.tableInstance);\n this.addSheet(sheetKey, normalizedData, sheetDefine.sheetTitle);\n });\n } catch (error) {\n console.error('Failed to rebuild formulas from sheets:', error);\n }\n }\n\n /**\n * 强制重新计算所有公式 (MIT兼容 - 简化实现)\n */\n rebuildAndRecalculate(): void {\n try {\n // 简化实现:FormulaEngine自动处理重新计算\n console.warn('rebuildAndRecalculate operation not required in MIT version');\n } catch (error) {\n console.error('Failed to rebuild and recalculate:', error);\n }\n }\n\n /**\n * 清空所有内容 (MIT兼容)\n */\n clearContent(): void {\n try {\n this.release();\n this.initializeFormulaEngine();\n } catch (error) {\n console.error('Failed to clear content:', error);\n }\n }\n\n /**\n * 销毁FormulaManager (MIT兼容)\n */\n release(): void {\n this.formulaRangeSelector?.release();\n this.cellHighlightManager?.release();\n this.crossSheetHandler?.destroy();\n try {\n if (this.formulaEngine) {\n this.formulaEngine.release();\n }\n } catch (error) {\n console.error('Failed to destroy FormulaEngine:', error);\n } finally {\n this.sheetMapping.clear();\n this.reverseSheetMapping.clear();\n this.isInitialized = false;\n this.nextSheetId = 0;\n this.formulaRangeSelector = null;\n this.cellHighlightManager = null;\n }\n }\n\n /**\n * 导出状态用于调试 (MIT兼容)\n */\n exportState(): Record<string, unknown> {\n return {\n isInitialized: this.isInitialized,\n sheets: Array.from(this.sheetMapping.entries()),\n functions: this.getAvailableFunctions(),\n crossSheetHandler: this.crossSheetHandler ? this.crossSheetHandler.getHandlerStatus() : null,\n stats: null // FormulaEngine不提供统计信息\n };\n }\n\n /**\n * 导出指定工作表中的所有公式 (MIT兼容)\n * @param sheetKey 工作表键\n * @returns 公式数据 (A1表示法的单元格引用 -> 公式内容)\n */\n exportFormulas(sheetKey: string): Record<string, string> {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine导出公式\n return this.formulaEngine.exportFormulas(sheetKey);\n } catch (error) {\n console.error(`Failed to export formulas for sheet ${sheetKey}:`, error);\n return {};\n }\n }\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('FormulaManager not initialized');\n }\n }\n\n /**\n * 获取所有工作表信息 (MIT兼容)\n */\n getAllSheets(): Array<{ key: string; id: number; title: string }> {\n try {\n // 使用FormulaEngine获取所有工作表\n return this.formulaEngine.getAllSheets();\n } catch (error) {\n console.error('Failed to get all sheets:', error);\n return [];\n }\n }\n\n /**\n * 设置活动工作表 (MIT兼容)\n * @param sheetKey 工作表键\n */\n setActiveSheet(sheetKey: string): void {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine设置活动工作表\n this.formulaEngine.setActiveSheet(sheetKey);\n } catch (error) {\n console.error(`Failed to set active sheet ${sheetKey}:`, error);\n throw new Error(`Failed to set active sheet: ${sheetKey}`);\n }\n }\n\n /**\n * 获取活动工作表 (MIT兼容)\n */\n getActiveSheet(): string | null {\n this.ensureInitialized();\n\n try {\n // 使用FormulaEngine获取活动工作表\n return this.formulaEngine.getActiveSheet();\n } catch (error) {\n console.error('Failed to get active sheet:', error);\n return null;\n }\n }\n\n /**\n * 复制/移动单元格范围 - 简化版本 (MIT兼容)\n * @param sourceSheet 源工作表\n * @param sourceRange 源范围\n * @param targetSheet 目标工作表\n * @param targetRow 目标行\n * @param targetCol 目标列\n */\n copyRange(\n sourceSheet: string,\n sourceRange: { startRow: number; startCol: number; endRow: number; endCol: number },\n targetSheet: string,\n targetRow: number,\n targetCol: number\n ): void {\n this.ensureInitialized();\n\n try {\n // 简单的数据复制实现\n for (let row = sourceRange.startRow; row <= sourceRange.endRow; row++) {\n for (let col = sourceRange.startCol; col <= sourceRange.endCol; col++) {\n const sourceCell = { sheet: sourceSheet, row, col };\n const targetCell = {\n sheet: targetSheet,\n row: targetRow + (row - sourceRange.startRow),\n col: targetCol + (col - sourceRange.startCol)\n };\n\n const value = this.getCellValue(sourceCell).value;\n if (value !== null && value !== undefined) {\n this.setCellContent(targetCell, value);\n }\n }\n }\n } catch (error) {\n console.error('Failed to copy range:', error);\n throw new Error('Failed to copy cell range');\n }\n }\n\n /**\n * 检查是否为跨sheet引用\n */\n private hasCrossSheetReference(formula: string): boolean {\n return formula.includes('!') || formula.includes('!');\n }\n\n /**\n * 获取跨sheet依赖关系\n */\n getCrossSheetDependencies(): Map<string, string[]> {\n return this.crossSheetHandler.getCrossSheetDependencies();\n }\n\n /**\n * 验证跨sheet公式\n */\n validateCrossSheetFormula(cell: FormulaCell) {\n return this.crossSheetHandler.validateCrossSheetFormula(cell);\n }\n\n /**\n * 验证所有跨sheet公式\n */\n validateAllCrossSheetFormulas() {\n return this.crossSheetHandler.validateAllCrossSheetFormulas();\n }\n\n /**\n * 强制重新计算所有跨sheet公式\n */\n async recalculateAllCrossSheetFormulas(): Promise<void> {\n await this.crossSheetHandler.recalculateAllCrossSheetFormulas();\n }\n\n /**\n * 更新跨sheet公式处理器选项\n */\n updateCrossSheetOptions(options: Partial<CrossSheetFormulaOptions>): void {\n this.crossSheetHandler.updateOptions(options);\n }\n}\n"]}
|