@visactor/vtable-sheet 1.20.0-alpha.3 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +173 -0
  2. package/cjs/components/vtable-sheet.d.ts +2 -0
  3. package/cjs/components/vtable-sheet.js +45 -13
  4. package/cjs/components/vtable-sheet.js.map +1 -1
  5. package/cjs/core/WorkSheet.d.ts +1 -0
  6. package/cjs/core/WorkSheet.js +32 -7
  7. package/cjs/core/WorkSheet.js.map +1 -1
  8. package/cjs/core/table-plugins.js.map +1 -1
  9. package/cjs/event/event-manager.d.ts +7 -8
  10. package/cjs/event/event-manager.js +2 -11
  11. package/cjs/event/event-manager.js.map +1 -1
  12. package/cjs/formula/formula-autocomplete.js.map +1 -1
  13. package/cjs/formula/formula-editor.js.map +1 -1
  14. package/cjs/formula/formula-engine.d.ts +102 -0
  15. package/cjs/formula/formula-engine.js +1028 -0
  16. package/cjs/formula/formula-engine.js.map +1 -0
  17. package/cjs/formula/formula-helper.js +1 -1
  18. package/cjs/formula/formula-helper.js.map +1 -1
  19. package/cjs/formula/formula-range-selector.d.ts +5 -2
  20. package/cjs/formula/formula-range-selector.js +70 -15
  21. package/cjs/formula/formula-range-selector.js.map +1 -1
  22. package/cjs/formula/formula-ui-manager.js +7 -4
  23. package/cjs/formula/formula-ui-manager.js.map +1 -1
  24. package/cjs/formula/index.js +1 -2
  25. package/cjs/index.d.ts +1 -1
  26. package/cjs/index.js +1 -1
  27. package/cjs/index.js.map +1 -1
  28. package/cjs/managers/formula-manager.d.ts +19 -16
  29. package/cjs/managers/formula-manager.js +71 -183
  30. package/cjs/managers/formula-manager.js.map +1 -1
  31. package/cjs/managers/menu-manager.js.map +1 -1
  32. package/cjs/tools/env.js.map +1 -1
  33. package/cjs/ts-types/event.d.ts +77 -68
  34. package/cjs/ts-types/event.js +6 -1
  35. package/cjs/ts-types/event.js.map +1 -1
  36. package/dist/vtable-sheet.js +73155 -109724
  37. package/dist/vtable-sheet.min.js +1 -853
  38. package/es/components/vtable-sheet.d.ts +2 -0
  39. package/es/components/vtable-sheet.js +46 -12
  40. package/es/components/vtable-sheet.js.map +1 -1
  41. package/es/core/WorkSheet.d.ts +1 -0
  42. package/es/core/WorkSheet.js +32 -5
  43. package/es/core/WorkSheet.js.map +1 -1
  44. package/es/core/table-plugins.js.map +1 -1
  45. package/es/event/event-manager.d.ts +7 -8
  46. package/es/event/event-manager.js +2 -11
  47. package/es/event/event-manager.js.map +1 -1
  48. package/es/formula/formula-autocomplete.js.map +1 -1
  49. package/es/formula/formula-editor.js.map +1 -1
  50. package/es/formula/formula-engine.d.ts +102 -0
  51. package/es/formula/formula-engine.js +1020 -0
  52. package/es/formula/formula-engine.js.map +1 -0
  53. package/es/formula/formula-helper.js +1 -1
  54. package/es/formula/formula-helper.js.map +1 -1
  55. package/es/formula/formula-range-selector.d.ts +5 -2
  56. package/es/formula/formula-range-selector.js +70 -15
  57. package/es/formula/formula-range-selector.js.map +1 -1
  58. package/es/formula/formula-ui-manager.js +7 -4
  59. package/es/formula/formula-ui-manager.js.map +1 -1
  60. package/es/formula/index.js +1 -2
  61. package/es/index.d.ts +1 -1
  62. package/es/index.js +1 -1
  63. package/es/index.js.map +1 -1
  64. package/es/managers/formula-manager.d.ts +19 -16
  65. package/es/managers/formula-manager.js +72 -184
  66. package/es/managers/formula-manager.js.map +1 -1
  67. package/es/managers/menu-manager.js.map +1 -1
  68. package/es/tools/env.js.map +1 -1
  69. package/es/ts-types/event.d.ts +77 -68
  70. package/es/ts-types/event.js +6 -1
  71. package/es/ts-types/event.js.map +1 -1
  72. package/package.json +6 -7
  73. package/cjs/test/formula-complete.test.d.ts +0 -1
  74. package/cjs/test/formula-complete.test.js +0 -42
  75. package/cjs/test/formula-complete.test.js.map +0 -1
  76. package/es/test/formula-complete.test.d.ts +0 -1
  77. package/es/test/formula-complete.test.js +0 -36
  78. package/es/test/formula-complete.test.js.map +0 -1
@@ -156,15 +156,18 @@ class FormulaUIManager {
156
156
  } else this.clearFormula();
157
157
  }
158
158
  handleFormulaInput(event) {
159
- var _a;
160
159
  const activeWorkSheet = this.sheet.getActiveSheet();
161
160
  if (!activeWorkSheet) return;
162
161
  const editingCell = activeWorkSheet.editingCell;
163
162
  if (!editingCell) return;
164
163
  const input = event.target, value = input.value;
165
- this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor || this.sheet.getActiveSheet().tableInstance.startEditCell(editingCell.col, editingCell.row, value),
166
- (null === (_a = this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor) || void 0 === _a ? void 0 : _a.getInputElement) && (this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor.getInputElement().value = value,
167
- input.focus()), value.startsWith("=") && this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value),
164
+ this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor || this.sheet.getActiveSheet().tableInstance.startEditCell(editingCell.col, editingCell.row, value);
165
+ const editingEditor = this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor;
166
+ if (editingEditor && "getInputElement" in editingEditor && "function" == typeof editingEditor.getInputElement) {
167
+ const inputElement = editingEditor.getInputElement();
168
+ inputElement && (inputElement.value = value, input.focus());
169
+ }
170
+ value.startsWith("=") && this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value),
168
171
  event.isFormulaInsertion || (this.sheet.formulaManager.inputIsParamMode = (0, formula_helper_1.detectFunctionParameterPosition)(value, this.sheet.formulaManager.lastKnownCursorPosInFormulaInput),
169
172
  value.startsWith("=") ? (this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value),
170
173
  this.isFormulaBarShowingResult = !1, this.sheet.formulaManager.setCellContent({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-ui-manager.ts"],"names":[],"mappings":"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","file":"formula-ui-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\n/**\n * 公式UI管理器\n * 封装公式编辑、显示等UI相关功能\n */\nexport class FormulaUIManager {\n private sheet: VTableSheet;\n private formulaBarElement: HTMLElement | null = null;\n formulaInput: HTMLInputElement | null = null;\n isFormulaBarShowingResult = false;\n\n private isEnterKeyPressed = false;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n }\n\n /**\n * 创建公式栏\n */\n createFormulaBar(): HTMLElement {\n // SVG图标常量\n const cancelIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 ' +\n '6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>' +\n '</svg>';\n const confirmIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>' +\n '</svg>';\n\n const formulaBar = document.createElement('div');\n formulaBar.className = 'vtable-sheet-formula-bar';\n\n // 创建单元格地址显示\n const cellAddressBox = document.createElement('div');\n cellAddressBox.className = 'vtable-sheet-cell-address';\n cellAddressBox.textContent = '';\n formulaBar.appendChild(cellAddressBox);\n\n // 创建fx标志\n const formulaIcon = document.createElement('div');\n formulaIcon.className = 'vtable-sheet-formula-icon';\n formulaIcon.textContent = 'fx';\n formulaIcon.title = '插入函数';\n formulaBar.appendChild(formulaIcon);\n\n // 创建公式输入框\n const formulaInput = document.createElement('input');\n this.formulaInput = formulaInput;\n formulaInput.className = 'vtable-sheet-formula-input';\n formulaInput.placeholder = '输入公式...';\n // 光标有可能被改变的事件监听。 用于记录光标位置。\n const events = ['click', 'mouseup', 'keyup', 'select', 'input', 'focus'];\n events.forEach(eventType => {\n formulaInput.addEventListener(eventType, e => {\n const cursorPos = formulaInput.selectionStart;\n if (cursorPos !== null && cursorPos !== undefined) {\n console.log('event', e, 'old', this.sheet.formulaManager.lastKnownCursorPosInFormulaInput, 'new', cursorPos);\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput = cursorPos;\n this.sheet.formulaManager.inputingElement = formulaInput;\n }\n });\n });\n formulaInput.addEventListener('input', e => this.handleFormulaInput(e));\n formulaInput.addEventListener('keydown', e => this.handleFormulaKeydown(e));\n formulaInput.addEventListener('focus', () => {\n this.activateFormulaBar();\n // 当获得焦点时,显示公式而不是计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const editingCell = activeWorkSheet.editingCell;\n if (editingCell && !this.sheet.formulaManager.formulaWorkingOnCell) {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: editingCell.sheet,\n row: editingCell.row,\n col: editingCell.col\n });\n if (formula) {\n this.sheet.formulaManager.formulaWorkingOnCell = editingCell;\n // 显示公式\n const displayFormula = formula.startsWith('=') ? formula : `=${formula}`;\n formulaInput.value = displayFormula;\n // 触发高亮\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(displayFormula);\n\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(formulaInput.value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n // this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n }\n }\n }\n });\n\n formulaInput.addEventListener('blur', () => {\n console.log('blur', formulaInput.selectionStart);\n if (this.sheet.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n this.deactivateFormulaBar();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n // 当失去焦点时,如果没有确认修改,恢复显示计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const selection = activeWorkSheet.getSelection();\n if (selection) {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n activeWorkSheet.tableInstance?.changeCellValue(\n selection.startCol,\n selection.startRow,\n result.error ? '#ERROR!' : result.value\n );\n }\n }\n });\n\n formulaBar.appendChild(formulaInput);\n\n // 创建操作按钮容器\n const formulaActions = document.createElement('div');\n formulaActions.className = 'vtable-sheet-formula-actions';\n\n // 创建取消按钮\n const cancelButton = document.createElement('button');\n cancelButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-cancel';\n cancelButton.innerHTML = cancelIcon;\n cancelButton.title = '取消';\n cancelButton.addEventListener('click', () => this.cancelFormulaEdit());\n formulaActions.appendChild(cancelButton);\n\n // 创建确认按钮\n const confirmButton = document.createElement('button');\n confirmButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-confirm';\n confirmButton.innerHTML = confirmIcon;\n confirmButton.title = '确认';\n confirmButton.addEventListener('click', () => this.confirmFormulaEdit());\n formulaActions.appendChild(confirmButton);\n\n formulaBar.appendChild(formulaActions);\n this.formulaBarElement = formulaBar;\n\n return formulaBar;\n }\n\n /**\n * 激活公式栏\n */\n activateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.add('active');\n }\n }\n\n /**\n * 取消激活公式栏\n */\n deactivateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.remove('active');\n }\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n /**\n * 取消公式编辑\n */\n cancelFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n this.updateFormulaBar(); // 重置为原始值\n }\n }\n\n /**\n * 确认公式编辑\n */\n confirmFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (formulaInput && activeWorkSheet) {\n const selection = activeWorkSheet.editingCell;\n if (!selection) {\n return;\n }\n\n const value = formulaInput.value;\n\n // 应用与按Enter键相同的逻辑\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(selection.row, selection.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(selection.row, selection.col, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(selection.col, selection.row, '#CYCLE!');\n formulaInput.value = '';\n formulaInput.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n },\n value\n );\n\n // 获取计算结果\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n });\n\n activeWorkSheet.setCellValue(selection.row, selection.col, result.value);\n } catch (error) {\n console.warn('Formula confirmation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(selection.row, selection.col, '#ERROR!');\n }\n } else {\n activeWorkSheet.setCellValue(selection.row, selection.col, value);\n }\n }\n }\n\n /**\n * 更新公式栏\n */\n updateFormulaBar(): void {\n if (!this.formulaBarElement) {\n return;\n }\n\n // 如果没有活动的sheet或者没有选中的单元格,则清空公式栏\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n this.clearFormula();\n return;\n }\n\n const selection = activeWorkSheet.getSelection();\n if (!selection) {\n this.clearFormula();\n return;\n }\n\n try {\n // 边界检查\n const rowCount = activeWorkSheet.getRowCount();\n const colCount = activeWorkSheet.getColumnCount();\n\n if (\n selection.startRow < 0 ||\n selection.startRow >= rowCount ||\n selection.startCol < 0 ||\n selection.startCol >= colCount\n ) {\n this.clearFormula();\n return;\n }\n\n // 更新单元格地址\n const cellAddressBox = this.formulaBarElement.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = activeWorkSheet.addressFromCoord(selection.startRow, selection.startCol);\n }\n\n // 更新公式输入框\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n // 检查是否在函数参数模式下,如果是则不覆盖公式输入框内容\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (this.sheet.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n // 如果公式栏正在显示计算结果,不覆盖内容\n if (this.isFormulaBarShowingResult) {\n return;\n }\n\n try {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n\n if (formula) {\n const displayFormula = formula.startsWith('=') ? formula : '=' + formula;\n formulaInput.value = displayFormula;\n } else {\n const cellValue = activeWorkSheet.getCellValue(selection.startRow, selection.startCol);\n formulaInput.value = cellValue !== undefined && cellValue !== null ? String(cellValue) : '';\n }\n console.log('222 formulaInput.value', formulaInput.value);\n } catch (e) {\n console.warn('Error updating formula input:', e);\n formulaInput.value = '';\n }\n }\n } catch (e) {\n console.error('Error in updateFormulaBar:', e);\n this.clearFormula();\n }\n }\n\n /**\n * 处理公式输入\n * @param event 事件\n */\n private handleFormulaInput(event: Event): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n const input = event.target as HTMLInputElement;\n const value = input.value;\n //如果编辑器不存在,则开启编辑单元格\n if (!this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor) {\n this.sheet.getActiveSheet().tableInstance.startEditCell(editingCell.col, editingCell.row, value);\n }\n //将值同步到编辑器输入框\n if (this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor?.getInputElement) {\n (\n this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor.getInputElement() as HTMLInputElement\n ).value = value;\n input.focus();\n }\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n }\n // 如果是公式插入事件,不进行公式计算\n if ((event as any).isFormulaInsertion) {\n return;\n }\n // 检测函数参数位置\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n // 开始新的公式输入,重置标志\n this.isFormulaBarShowingResult = false;\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n } else {\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n // //当前input框内是否为公式,并且检查公式的完整性。如果不是完整的,那么不退出编辑状态,且等待用户输入其他内容,或者等待用户进行框选点选单元格设定计算选取\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n }\n\n /**\n * 处理公式输入框键盘事件\n * @param event 事件\n */\n private handleFormulaKeydown(event: KeyboardEvent): void {\n console.log('handleFormulaKeydown');\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n\n const input = event.target as HTMLInputElement;\n\n if (event.key === 'Enter') {\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n\n const value = input.value;\n\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(editingCell.row, editingCell.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#CYCLE!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n input.value = '';\n input.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n\n // 计算结果并仅写入结果展示(不写入公式文本到单元格显示)\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n });\n\n activeWorkSheet.tableInstance?.changeCellValue(\n editingCell.col,\n editingCell.row,\n result.error ? '#ERROR!' : result.value\n );\n\n // // 在公式栏中显示计算结果\n // input.value = result.error ? '#ERROR!' : String(result.value);\n this.isFormulaBarShowingResult = true;\n console.log('isFormulaBarShowingResult', true);\n input.blur();\n setTimeout(() => {\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n activeWorkSheet.tableInstance.clearSelected();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n activeWorkSheet.tableInstance.selectCell(editingCell.col, editingCell.row);\n }, 0);\n } catch (error) {\n console.warn('Formula evaluation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, '#ERROR!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#ERROR!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 普通值,直接设置\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, value);\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, value);\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n\n // 不自动移动到下一行,保持当前位置\n this.isEnterKeyPressed = true;\n\n // 阻止默认行为\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /**\n * 清除单元格地址和公式输入框\n */\n clearFormula(): void {\n const cellAddressBox = this.formulaBarElement?.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = '';\n }\n\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n formulaInput.value = '';\n }\n }\n\n release(): void {\n this.formulaBarElement = null;\n this.formulaInput = null;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-ui-manager.ts"],"names":[],"mappings":"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","file":"formula-ui-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\n/**\n * 公式UI管理器\n * 封装公式编辑、显示等UI相关功能\n */\nexport class FormulaUIManager {\n private sheet: VTableSheet;\n private formulaBarElement: HTMLElement | null = null;\n formulaInput: HTMLInputElement | null = null;\n isFormulaBarShowingResult = false;\n\n private isEnterKeyPressed = false;\n\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n }\n\n /**\n * 创建公式栏\n */\n createFormulaBar(): HTMLElement {\n // SVG图标常量\n const cancelIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 ' +\n '6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>' +\n '</svg>';\n const confirmIcon =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\">' +\n '<path fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>' +\n '</svg>';\n\n const formulaBar = document.createElement('div');\n formulaBar.className = 'vtable-sheet-formula-bar';\n\n // 创建单元格地址显示\n const cellAddressBox = document.createElement('div');\n cellAddressBox.className = 'vtable-sheet-cell-address';\n cellAddressBox.textContent = '';\n formulaBar.appendChild(cellAddressBox);\n\n // 创建fx标志\n const formulaIcon = document.createElement('div');\n formulaIcon.className = 'vtable-sheet-formula-icon';\n formulaIcon.textContent = 'fx';\n formulaIcon.title = '插入函数';\n formulaBar.appendChild(formulaIcon);\n\n // 创建公式输入框\n const formulaInput = document.createElement('input');\n this.formulaInput = formulaInput;\n formulaInput.className = 'vtable-sheet-formula-input';\n formulaInput.placeholder = '输入公式...';\n // 光标有可能被改变的事件监听。 用于记录光标位置。\n const events = ['click', 'mouseup', 'keyup', 'select', 'input', 'focus'];\n events.forEach(eventType => {\n formulaInput.addEventListener(eventType, e => {\n const cursorPos = formulaInput.selectionStart;\n if (cursorPos !== null && cursorPos !== undefined) {\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput = cursorPos;\n this.sheet.formulaManager.inputingElement = formulaInput;\n }\n });\n });\n formulaInput.addEventListener('input', e => this.handleFormulaInput(e));\n formulaInput.addEventListener('keydown', e => this.handleFormulaKeydown(e));\n formulaInput.addEventListener('focus', () => {\n this.activateFormulaBar();\n // 当获得焦点时,显示公式而不是计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const editingCell = activeWorkSheet.editingCell;\n if (editingCell && !this.sheet.formulaManager.formulaWorkingOnCell) {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: editingCell.sheet,\n row: editingCell.row,\n col: editingCell.col\n });\n if (formula) {\n this.sheet.formulaManager.formulaWorkingOnCell = editingCell;\n // 显示公式\n const displayFormula = formula.startsWith('=') ? formula : `=${formula}`;\n formulaInput.value = displayFormula;\n // 触发高亮\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(displayFormula);\n\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(formulaInput.value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n // this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n }\n }\n }\n });\n\n formulaInput.addEventListener('blur', () => {\n if (this.sheet.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n this.deactivateFormulaBar();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n // 当失去焦点时,如果没有确认修改,恢复显示计算值\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (activeWorkSheet) {\n const selection = activeWorkSheet.getSelection();\n if (selection) {\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n activeWorkSheet.tableInstance?.changeCellValue(\n selection.startCol,\n selection.startRow,\n result.error ? '#ERROR!' : result.value\n );\n }\n }\n });\n\n formulaBar.appendChild(formulaInput);\n\n // 创建操作按钮容器\n const formulaActions = document.createElement('div');\n formulaActions.className = 'vtable-sheet-formula-actions';\n\n // 创建取消按钮\n const cancelButton = document.createElement('button');\n cancelButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-cancel';\n cancelButton.innerHTML = cancelIcon;\n cancelButton.title = '取消';\n cancelButton.addEventListener('click', () => this.cancelFormulaEdit());\n formulaActions.appendChild(cancelButton);\n\n // 创建确认按钮\n const confirmButton = document.createElement('button');\n confirmButton.className = 'vtable-sheet-formula-button vtable-sheet-formula-confirm';\n confirmButton.innerHTML = confirmIcon;\n confirmButton.title = '确认';\n confirmButton.addEventListener('click', () => this.confirmFormulaEdit());\n formulaActions.appendChild(confirmButton);\n\n formulaBar.appendChild(formulaActions);\n this.formulaBarElement = formulaBar;\n\n return formulaBar;\n }\n\n /**\n * 激活公式栏\n */\n activateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.add('active');\n }\n }\n\n /**\n * 取消激活公式栏\n */\n deactivateFormulaBar(): void {\n const formulaBar = this.formulaBarElement;\n if (formulaBar) {\n formulaBar.classList.remove('active');\n }\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n /**\n * 取消公式编辑\n */\n cancelFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n this.updateFormulaBar(); // 重置为原始值\n }\n }\n\n /**\n * 确认公式编辑\n */\n confirmFormulaEdit(): void {\n const formulaInput = this.formulaInput;\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (formulaInput && activeWorkSheet) {\n const selection = activeWorkSheet.editingCell;\n if (!selection) {\n return;\n }\n\n const value = formulaInput.value;\n\n // 应用与按Enter键相同的逻辑\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(selection.row, selection.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(selection.row, selection.col, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(selection.col, selection.row, '#CYCLE!');\n formulaInput.value = '';\n formulaInput.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n },\n value\n );\n\n // 获取计算结果\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: selection.row,\n col: selection.col\n });\n\n activeWorkSheet.setCellValue(selection.row, selection.col, result.value);\n } catch (error) {\n console.warn('Formula confirmation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(selection.row, selection.col, '#ERROR!');\n }\n } else {\n activeWorkSheet.setCellValue(selection.row, selection.col, value);\n }\n }\n }\n\n /**\n * 更新公式栏\n */\n updateFormulaBar(): void {\n if (!this.formulaBarElement) {\n return;\n }\n\n // 如果没有活动的sheet或者没有选中的单元格,则清空公式栏\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n this.clearFormula();\n return;\n }\n\n const selection = activeWorkSheet.getSelection();\n if (!selection) {\n this.clearFormula();\n return;\n }\n\n try {\n // 边界检查\n const rowCount = activeWorkSheet.getRowCount();\n const colCount = activeWorkSheet.getColumnCount();\n\n if (\n selection.startRow < 0 ||\n selection.startRow >= rowCount ||\n selection.startCol < 0 ||\n selection.startCol >= colCount\n ) {\n this.clearFormula();\n return;\n }\n\n // 更新单元格地址\n const cellAddressBox = this.formulaBarElement.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = activeWorkSheet.addressFromCoord(selection.startRow, selection.startCol);\n }\n\n // 更新公式输入框\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n // 检查是否在函数参数模式下,如果是则不覆盖公式输入框内容\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (this.sheet.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n // 如果公式栏正在显示计算结果,不覆盖内容\n if (this.isFormulaBarShowingResult) {\n return;\n }\n\n try {\n const formula = this.sheet.formulaManager.getCellFormula({\n sheet: activeWorkSheet.getKey(),\n row: selection.startRow,\n col: selection.startCol\n });\n\n if (formula) {\n const displayFormula = formula.startsWith('=') ? formula : '=' + formula;\n formulaInput.value = displayFormula;\n } else {\n const cellValue = activeWorkSheet.getCellValue(selection.startRow, selection.startCol);\n formulaInput.value = cellValue !== undefined && cellValue !== null ? String(cellValue) : '';\n }\n } catch (e) {\n console.warn('Error updating formula input:', e);\n formulaInput.value = '';\n }\n }\n } catch (e) {\n console.error('Error in updateFormulaBar:', e);\n this.clearFormula();\n }\n }\n\n /**\n * 处理公式输入\n * @param event 事件\n */\n private handleFormulaInput(event: Event): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n const input = event.target as HTMLInputElement;\n const value = input.value;\n //如果编辑器不存在,则开启编辑单元格\n if (!this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor) {\n this.sheet.getActiveSheet().tableInstance.startEditCell(editingCell.col, editingCell.row, value);\n }\n //将值同步到编辑器输入框\n const editingEditor = this.sheet.getActiveSheet().tableInstance.editorManager.editingEditor;\n if (editingEditor && 'getInputElement' in editingEditor && typeof editingEditor.getInputElement === 'function') {\n const inputElement = editingEditor.getInputElement() as HTMLInputElement;\n if (inputElement) {\n inputElement.value = value;\n input.focus();\n }\n }\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n }\n // 如果是公式插入事件,不进行公式计算\n if ((event as any).isFormulaInsertion) {\n return;\n }\n // 检测函数参数位置\n this.sheet.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n value,\n this.sheet.formulaManager.lastKnownCursorPosInFormulaInput\n );\n\n // 如果是公式,高亮引用的单元格\n if (value.startsWith('=')) {\n this.sheet.formulaManager.cellHighlightManager.highlightFormulaCells(value);\n // 开始新的公式输入,重置标志\n this.isFormulaBarShowingResult = false;\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n } else {\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n }\n\n // //当前input框内是否为公式,并且检查公式的完整性。如果不是完整的,那么不退出编辑状态,且等待用户输入其他内容,或者等待用户进行框选点选单元格设定计算选取\n // const formulaIfCorrect = this.sheet.formulaManager.isFormulaComplete(value);\n // if (formulaIfCorrect) {\n // this.sheet.formulaManager.formulaWorkingOnCell = null;\n // } else {\n this.sheet.formulaManager.formulaWorkingOnCell = activeWorkSheet.editingCell;\n // }\n }\n\n /**\n * 处理公式输入框键盘事件\n * @param event 事件\n */\n private handleFormulaKeydown(event: KeyboardEvent): void {\n const activeWorkSheet = this.sheet.getActiveSheet();\n if (!activeWorkSheet) {\n return;\n }\n\n const input = event.target as HTMLInputElement;\n\n if (event.key === 'Enter') {\n const editingCell = activeWorkSheet.editingCell;\n if (!editingCell) {\n return;\n }\n\n const value = input.value;\n\n if (value.startsWith('=') && value.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(editingCell.row, editingCell.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(value)) {\n console.warn('Circular reference detected:', value, 'contains', currentCellAddress);\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, '#CYCLE!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#CYCLE!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n input.value = '';\n input.blur();\n return;\n }\n\n // 设置公式内容\n this.sheet.formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n },\n value\n );\n\n // 计算结果并仅写入结果展示(不写入公式文本到单元格显示)\n const result = this.sheet.formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: editingCell.row,\n col: editingCell.col\n });\n\n activeWorkSheet.tableInstance?.changeCellValue(\n editingCell.col,\n editingCell.row,\n result.error ? '#ERROR!' : result.value\n );\n\n // // 在公式栏中显示计算结果\n // input.value = result.error ? '#ERROR!' : String(result.value);\n this.isFormulaBarShowingResult = true;\n input.blur();\n setTimeout(() => {\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n activeWorkSheet.tableInstance.clearSelected();\n this.sheet.formulaManager.cellHighlightManager.clearHighlights();\n activeWorkSheet.tableInstance.selectCell(editingCell.col, editingCell.row);\n }, 0);\n } catch (error) {\n console.warn('Formula evaluation error:', error);\n // 显示错误状态\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, '#ERROR!');\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, '#ERROR!');\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 普通值,直接设置\n activeWorkSheet.setCellValue(editingCell.row, editingCell.col, value);\n activeWorkSheet.tableInstance?.changeCellValue(editingCell.col, editingCell.row, value);\n this.sheet.formulaManager.formulaWorkingOnCell = null;\n }\n\n // 不自动移动到下一行,保持当前位置\n this.isEnterKeyPressed = true;\n\n // 阻止默认行为\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /**\n * 清除单元格地址和公式输入框\n */\n clearFormula(): void {\n const cellAddressBox = this.formulaBarElement?.querySelector('.vtable-sheet-cell-address');\n if (cellAddressBox) {\n cellAddressBox.textContent = '';\n }\n\n const formulaInput = this.formulaInput;\n if (formulaInput) {\n formulaInput.value = '';\n }\n }\n\n release(): void {\n this.formulaBarElement = null;\n this.formulaInput = null;\n }\n}\n"]}
@@ -19,5 +19,4 @@ Object.defineProperty(exports, "__esModule", {
19
19
  value: !0
20
20
  }), __exportStar(require("./formula-editor"), exports), __exportStar(require("./formula-autocomplete"), exports),
21
21
  __exportStar(require("./formula-range-selector"), exports), __exportStar(require("./formula-ui-manager"), exports),
22
- __exportStar(require("./cell-highlight-manager"), exports);
23
- //# sourceMappingURL=index.js.map
22
+ __exportStar(require("./cell-highlight-manager"), exports);
package/cjs/index.d.ts CHANGED
@@ -2,5 +2,5 @@ import VTableSheet from './components/vtable-sheet';
2
2
  import type { ISheetDefine, IVTableSheetOptions } from './ts-types';
3
3
  import * as TYPES from './ts-types';
4
4
  import * as VTable from './vtable';
5
- export declare const version = "1.20.0-alpha.3";
5
+ export declare const version = "1.20.0";
6
6
  export { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };
package/cjs/index.js CHANGED
@@ -47,4 +47,4 @@ exports.VTable = VTable;
47
47
 
48
48
  const style_manager_1 = require("./styles/style-manager");
49
49
 
50
- exports.version = "1.20.0-alpha.3", (0, style_manager_1.importStyles)();
50
+ exports.version = "1.20.0", (0, style_manager_1.importStyles)();
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,gBAAgB,CAAC;AAExC,IAAA,4BAAY,GAAE,CAAC","file":"index.js","sourcesContent":["import VTableSheet from './components/vtable-sheet';\nimport type { ISheetDefine, IVTableSheetOptions } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.20.0-alpha.3\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
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 } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.20.0\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
@@ -6,7 +6,7 @@ import { CellHighlightManager } from '../formula';
6
6
  import type * as VTable from '@visactor/vtable';
7
7
  export declare class FormulaManager {
8
8
  sheet: VTableSheet;
9
- private hyperFormula;
9
+ private formulaEngine;
10
10
  private sheetMapping;
11
11
  private reverseSheetMapping;
12
12
  private isInitialized;
@@ -27,14 +27,13 @@ export declare class FormulaManager {
27
27
  get formulaWorkingOnCell(): FormulaCell | null;
28
28
  set formulaWorkingOnCell(value: FormulaCell | null);
29
29
  constructor(sheet: VTableSheet);
30
- private initializeHyperFormula;
31
- addSheet(sheetKey: string, normalizedData?: any[][]): number;
32
- normalizeSheetData(data: any[][], tableInstance: VTable.ListTable): any[][];
30
+ private initializeFormulaEngine;
31
+ addSheet(sheetKey: string, normalizedData?: unknown[][]): number;
32
+ normalizeSheetData(data: unknown[][], tableInstance: VTable.ListTable): unknown[][];
33
33
  removeSheet(sheetKey: string): void;
34
34
  renameSheet(oldKey: string, newKey: string): void;
35
- private getSheetId;
36
- private getHasHeader;
37
- setCellContent(cell: FormulaCell, value: any): void;
35
+ getSheetId(sheetKey: string): number;
36
+ setCellContent(cell: FormulaCell, value: unknown): void;
38
37
  getCellValue(cell: FormulaCell): FormulaResult;
39
38
  getCellFormula(cell: FormulaCell): string | undefined;
40
39
  isCellFormula(cell: FormulaCell): boolean;
@@ -42,14 +41,15 @@ export declare class FormulaManager {
42
41
  getCellPrecedents(cell: FormulaCell): FormulaCell[];
43
42
  batchUpdate(changes: Array<{
44
43
  cell: FormulaCell;
45
- value: any;
44
+ value: unknown;
46
45
  }>): void;
47
- addRows(sheetKey: string, rowIndex: number, numberOfRows?: number): void;
48
- removeRows(sheetKey: string, rowIndex: number, numberOfRows?: number): void;
49
- addColumns(sheetKey: string, columnIndex: number, numberOfColumns?: number): void;
50
- removeColumns(sheetKey: string, columnIndex: number, numberOfColumns?: number): void;
51
- getSheetSerialized(sheetKey: string): any[][];
52
- setSheetContent(sheetKey: string, normalizedData: any[][]): void;
46
+ addRows(_sheetKey: string, rowIndex: number, numberOfRows?: number): void;
47
+ removeRows(_sheetKey: string, rowIndex: number, numberOfRows?: number): void;
48
+ addColumns(_sheetKey: string, columnIndex: number, numberOfColumns?: number): void;
49
+ removeColumns(_sheetKey: string, columnIndex: number, numberOfColumns?: number): void;
50
+ getSheetSerialized(sheetKey: string): unknown[][];
51
+ sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][];
52
+ setSheetContent(sheetKey: string, _normalizedData: unknown[][]): void;
53
53
  hasCircularReference(): boolean;
54
54
  getAvailableFunctions(): string[];
55
55
  validateFormula(formula: string): {
@@ -58,7 +58,7 @@ export declare class FormulaManager {
58
58
  };
59
59
  isFormulaComplete(formula: string): boolean;
60
60
  calculateFormula(formula: string): {
61
- value: any;
61
+ value: unknown;
62
62
  error?: string;
63
63
  };
64
64
  suspendEvaluation(): void;
@@ -66,13 +66,16 @@ export declare class FormulaManager {
66
66
  rebuildAndRecalculate(): void;
67
67
  clearContent(): void;
68
68
  release(): void;
69
- exportState(): any;
69
+ exportState(): Record<string, unknown>;
70
+ exportFormulas(sheetKey: string): Record<string, string>;
70
71
  private ensureInitialized;
71
72
  getAllSheets(): Array<{
72
73
  key: string;
73
74
  id: number;
74
75
  name: string;
75
76
  }>;
77
+ setActiveSheet(sheetKey: string): void;
78
+ getActiveSheet(): string | null;
76
79
  copyRange(sourceSheet: string, sourceRange: {
77
80
  startRow: number;
78
81
  startCol: number;