@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/formula/formula-engine.ts"],"names":[],"mappings":"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","file":"formula-engine.js","sourcesContent":["/**\n * 嵌套公式计算引擎 - 清理版本\n * 支持函数嵌套调用和完整的依赖关系\n */\n\nimport type { FormulaCell, FormulaResult } from '../ts-types/formula';\nimport { supportedFunctions } from './formula-helper';\n\nexport interface FormulaEngineConfig {\n precisionRounding?: number;\n caseSensitive?: boolean;\n ignoreWhiteSpace?: 'standard' | 'any';\n nullDate?: { year: number; month: number; day: number };\n dateFormats?: string[];\n timeFormats?: string[];\n}\n\nexport class FormulaEngine {\n private sheets: Map<string, number> = new Map();\n private reverseSheets: Map<number, string> = new Map();\n private sheetData: Map<number, unknown[][]> = new Map();\n private formulaCells: Map<string, string> = new Map();\n private dependencies: Map<string, Set<string>> = new Map();\n private dependents: Map<string, Set<string>> = new Map();\n private nextSheetId = 0;\n private activeSheetKey: string | null = null;\n\n constructor(_config: FormulaEngineConfig = {}) {\n // 配置暂时不使用,保持兼容性\n }\n\n /**\n * 设置活动工作表\n * @param sheetKey 工作表键\n */\n setActiveSheet(sheetKey: string): void {\n if (this.sheets.has(sheetKey)) {\n this.activeSheetKey = sheetKey;\n }\n }\n\n /**\n * 获取活动工作表\n * @returns 活动工作表键\n */\n getActiveSheet(): string | null {\n return this.activeSheetKey;\n }\n\n addSheet(sheetKey: string, data?: unknown[][]): number {\n if (this.sheets.has(sheetKey)) {\n return this.sheets.get(sheetKey) as number;\n }\n\n const sheetId = this.nextSheetId++;\n this.sheets.set(sheetKey, sheetId);\n this.reverseSheets.set(sheetId, sheetKey);\n\n // 初始化工作表数据\n const sheetData = data || [['']];\n this.sheetData.set(sheetId, this.normalizeData(sheetData));\n\n return sheetId;\n }\n\n private normalizeData(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 getSheetId(sheetKey: string): number {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId === undefined) {\n return this.addSheet(sheetKey);\n }\n return sheetId;\n }\n\n setCellContent(cell: FormulaCell, value: unknown): void {\n if (!cell || cell.sheet === undefined || cell.row === undefined || cell.col === undefined) {\n throw new Error('Invalid cell parameter');\n }\n\n if (cell.row < 0 || cell.col < 0) {\n throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);\n }\n\n const sheetId = this.getSheetId(cell.sheet);\n\n if (!this.sheetData.has(sheetId)) {\n this.sheetData.set(sheetId, [['']]);\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet) {\n throw new Error(`Sheet data not found for ID: ${sheetId}`);\n }\n\n // 确保行存在\n while (sheet.length <= cell.row) {\n sheet.push([]);\n }\n\n // 确保列存在\n while (sheet[cell.row].length <= cell.col) {\n sheet[cell.row].push('');\n }\n\n // 处理值\n let processedValue = value;\n if (processedValue === undefined || processedValue === null) {\n processedValue = '';\n }\n\n // 只有字符串类型的值才需要检查是否为数字\n if (typeof processedValue === 'string' && !processedValue.startsWith('=')) {\n const numericValue = Number(processedValue);\n // 只有非空字符串且能转换为有效数字时才转换\n if (!isNaN(numericValue) && processedValue.trim() !== '') {\n processedValue = numericValue;\n }\n }\n\n // 更新单元格值\n sheet[cell.row][cell.col] = processedValue;\n\n // 如果是公式,更新依赖关系\n if (typeof processedValue === 'string' && processedValue.startsWith('=')) {\n const cellKey = this.getCellKey(cell);\n this.formulaCells.set(cellKey, processedValue);\n this.updateDependencies(cellKey, processedValue);\n // console.log(`Set formula ${cellKey}: ${processedValue}`);\n }\n\n // 重新计算受影响的单元格\n this.recalculateDependents(cell);\n }\n\n private getCellKey(cell: FormulaCell): string {\n return `${cell.sheet}!${this.getA1Notation(cell.row, cell.col)}`;\n }\n\n private getA1Notation(row: number, col: number): string {\n let columnStr = '';\n let tempCol = col;\n do {\n columnStr = String.fromCharCode(65 + (tempCol % 26)) + columnStr;\n tempCol = Math.floor(tempCol / 26) - 1;\n } while (tempCol >= 0);\n\n return columnStr + (row + 1);\n }\n\n private parseA1Notation(cellRef: string): { row: number; col: number } {\n const match = cellRef.match(/^([A-Z]+)([0-9]+)$/);\n if (!match) {\n throw new Error(`Invalid cell reference: ${cellRef}`);\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 { row: rowNumber - 1, col };\n }\n\n private parseCellKey(cellKey: string): FormulaCell | null {\n const parts = cellKey.split('!');\n if (parts.length !== 2) {\n return null;\n }\n\n const [sheet, a1Notation] = parts;\n try {\n const { row, col } = this.parseA1Notation(a1Notation);\n return { sheet, row, col };\n } catch {\n return null;\n }\n }\n\n calculateFormula(formula: string): { value: unknown; error?: string } {\n try {\n if (!formula.startsWith('=')) {\n return { value: formula, error: undefined };\n }\n\n const expression = formula.substring(1).trim();\n\n // 使用递归下降解析器\n const result = this.parseExpression(expression);\n return result;\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Calculation failed'\n };\n }\n }\n\n private parseExpression(expr: string): { value: unknown; error?: string } {\n expr = expr.trim();\n\n // 首先处理函数调用(最高优先级)\n const functionResult = this.tryParseFunction(expr);\n if (functionResult) {\n return functionResult;\n }\n\n // 处理比较运算符\n const comparisonResult = this.tryParseComparison(expr);\n if (comparisonResult) {\n return comparisonResult;\n }\n\n // 处理算术表达式\n return this.parseArithmetic(expr);\n }\n\n private tryParseComparison(expr: string): { value: unknown; error?: string } | null {\n const operators = ['>=', '<=', '<>', '>', '<', '='];\n\n for (const op of operators) {\n const index = expr.indexOf(op);\n if (index !== -1) {\n const leftExpr = expr.substring(0, index).trim();\n const rightExpr = expr.substring(index + op.length).trim();\n\n // 如果左边或右边为空,跳过这个运算符\n if (!leftExpr || !rightExpr) {\n continue;\n }\n\n const leftResult = this.parseExpression(leftExpr);\n const rightResult = this.parseExpression(rightExpr);\n\n if (leftResult.error || rightResult.error) {\n return { value: null, error: 'Comparison operands error' };\n }\n\n // 尝试转换为数字进行比较\n const leftVal = Number(leftResult.value);\n const rightVal = Number(rightResult.value);\n\n let result = false;\n if (!isNaN(leftVal) && !isNaN(rightVal)) {\n // 数值比较\n switch (op) {\n case '>=': {\n result = leftVal >= rightVal;\n break;\n }\n case '<=': {\n result = leftVal <= rightVal;\n break;\n }\n case '<>': {\n result = leftVal !== rightVal;\n break;\n }\n case '>': {\n result = leftVal > rightVal;\n break;\n }\n case '<': {\n result = leftVal < rightVal;\n break;\n }\n case '=': {\n result = leftVal === rightVal;\n break;\n }\n }\n } else {\n // 字符串比较\n const leftStr = String(leftResult.value);\n const rightStr = String(rightResult.value);\n switch (op) {\n case '>=': {\n result = leftStr >= rightStr;\n break;\n }\n case '<=': {\n result = leftStr <= rightStr;\n break;\n }\n case '<>': {\n result = leftStr !== rightStr;\n break;\n }\n case '>': {\n result = leftStr > rightStr;\n break;\n }\n case '<': {\n result = leftStr < rightStr;\n break;\n }\n case '=': {\n result = leftStr === rightStr;\n break;\n }\n }\n }\n\n return { value: result, error: undefined };\n }\n }\n\n return null;\n }\n\n private parseArithmetic(expr: string): { value: unknown; error?: string } {\n try {\n // 首先处理函数调用\n const functionResult = this.tryParseFunction(expr);\n if (functionResult) {\n return functionResult;\n }\n\n // 处理字符串\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { value: expr.slice(1, -1), error: undefined };\n }\n\n // 处理单元格引用(包括带工作表前缀的引用,如 Sheet1!A1)\n if (/^([A-Za-z0-9_]+!)?[A-Z]+[0-9]+$/.test(expr)) {\n return { value: this.getCellValueByA1(expr), error: undefined };\n }\n\n // 处理数字\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { value: Number(expr), error: undefined };\n }\n\n // 处理范围引用(包括带工作表前缀的范围,如 Sheet1!A2:A4)\n if (/^([A-Za-z0-9_]+!)?[A-Z]+[0-9]+:[A-Z]+[0-9]+$/.test(expr)) {\n const values = this.getRangeValuesFromExpr(expr);\n return { value: values, error: undefined };\n }\n\n // 处理算术表达式(包含+、-、*、/)\n if (expr.includes('+') || expr.includes('-') || expr.includes('*') || expr.includes('/')) {\n return this.evaluateArithmeticWithFunctions(expr);\n }\n\n // 如果都不匹配,返回原始值\n return { value: expr, error: undefined };\n } catch (error) {\n return { value: null, error: error instanceof Error ? error.message : 'Arithmetic parsing failed' };\n }\n }\n\n private tryParseFunction(expr: string): { value: unknown; error?: string } | null {\n // 更精确地匹配函数调用 - 确保是整个表达式且括号平衡\n // 首先检查是否以函数名开头\n const funcStartMatch = expr.match(/^([A-Z]+)\\s*\\(/i);\n if (!funcStartMatch) {\n return null;\n }\n\n const funcName = funcStartMatch[1].toUpperCase();\n\n // 找到匹配的右括号\n let depth = 1;\n let argsEnd = funcStartMatch[0].length - 1; // 位置在左括号\n\n for (let i = funcStartMatch[0].length; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++;\n } else if (expr[i] === ')') {\n depth--;\n if (depth === 0) {\n argsEnd = i;\n break;\n }\n }\n }\n\n if (depth !== 0) {\n return null; // 没有找到匹配的右括号\n }\n\n // 确保这是整个表达式(没有剩余字符)\n if (argsEnd + 1 !== expr.length) {\n return null; // 这不是一个完整的函数调用,后面还有其他内容\n }\n\n const argsStr = expr.substring(funcStartMatch[0].length, argsEnd);\n\n // 解析参数(处理嵌套)\n const args = this.parseArguments(argsStr);\n\n // 计算每个参数的值\n const argValues: unknown[] = [];\n for (const arg of args) {\n const result = this.parseExpression(arg);\n if (result.error) {\n return { value: null, error: `Argument error in ${funcName}: ${result.error}` };\n }\n argValues.push(result.value);\n }\n\n // 执行函数\n return this.executeFunction(funcName, argValues);\n }\n\n private parseArguments(argsStr: string): string[] {\n const args: string[] = [];\n let current = '';\n let depth = 0;\n let inQuotes = false;\n\n for (let i = 0; i < argsStr.length; i++) {\n const char = argsStr[i];\n\n if (char === '\"' && (i === 0 || argsStr[i - 1] !== '\\\\')) {\n inQuotes = !inQuotes;\n }\n\n if (!inQuotes) {\n if (char === '(') {\n depth++;\n }\n if (char === ')') {\n depth--;\n }\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n continue;\n }\n }\n\n current += char;\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n // 如果只有一个参数且包含函数调用,需要特殊处理\n if (args.length === 1 && args[0].includes('(') && args[0].includes(')')) {\n // 检查是否可能是多个参数被错误解析\n const singleArg = args[0];\n\n // 尝试重新解析,考虑函数嵌套\n const reArgs: string[] = [];\n let reCurrent = '';\n let reDepth = 0;\n let reInQuotes = false;\n\n for (let i = 0; i < singleArg.length; i++) {\n const char = singleArg[i];\n\n if (char === '\"' && (i === 0 || singleArg[i - 1] !== '\\\\')) {\n reInQuotes = !reInQuotes;\n }\n\n if (!reInQuotes) {\n if (char === '(') {\n reDepth++;\n }\n if (char === ')') {\n reDepth--;\n }\n\n if (char === ',' && reDepth === 0) {\n reArgs.push(reCurrent.trim());\n reCurrent = '';\n continue;\n }\n }\n\n reCurrent += char;\n }\n\n if (reCurrent.trim()) {\n reArgs.push(reCurrent.trim());\n }\n\n // 如果重新解析得到多个参数,使用重新解析的结果\n if (reArgs.length > 1) {\n return reArgs;\n }\n }\n\n return args;\n }\n\n private executeFunction(funcName: string, args: unknown[]): { value: unknown; error?: string } {\n try {\n switch (funcName) {\n // 数学函数\n case 'SUM':\n return this.calculateSum(args);\n case 'AVERAGE':\n return this.calculateAverage(args);\n case 'MAX':\n return this.calculateMax(args);\n case 'MIN':\n return this.calculateMin(args);\n case 'ABS':\n return this.calculateAbs(args);\n case 'ROUND':\n return this.calculateRound(args);\n case 'INT':\n return this.calculateInt(args);\n case 'RAND':\n return this.calculateRand(args);\n\n // 统计函数\n case 'COUNT':\n return this.calculateCount(args);\n case 'COUNTA':\n return this.calculateCountA(args);\n case 'STDEV':\n return this.calculateStdev(args);\n case 'VAR':\n return this.calculateVar(args);\n case 'MEDIAN':\n return this.calculateMedian(args);\n case 'PRODUCT':\n return this.calculateProduct(args);\n\n // 逻辑函数\n case 'IF':\n return this.calculateIf(args);\n case 'AND':\n return this.calculateAnd(args);\n case 'OR':\n return this.calculateOr(args);\n case 'NOT':\n return this.calculateNot(args);\n\n // 日期函数\n case 'TODAY':\n return this.calculateToday(args);\n case 'NOW':\n return this.calculateNow(args);\n\n default:\n return { value: null, error: `Unknown function: ${funcName}` };\n }\n } catch (error) {\n return { value: null, error: error instanceof Error ? error.message : 'Function execution failed' };\n }\n }\n\n // 函数实现\n private calculateSum(args: unknown[]): { value: unknown; error?: string } {\n let total = 0;\n for (const arg of this.flattenArgsWithRanges(args)) {\n const num = Number(arg);\n if (!isNaN(num)) {\n total += num;\n }\n }\n return { value: total, error: undefined };\n }\n\n private calculateAverage(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args).filter(arg => !isNaN(Number(arg)));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n const sum = values.reduce((acc: number, val) => acc + Number(val), 0);\n return { value: Number(sum) / Number(values.length), error: undefined };\n }\n\n private calculateMax(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args)\n .filter(arg => !isNaN(Number(arg)))\n .map(arg => Number(arg));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n return { value: Math.max(...values), error: undefined };\n }\n\n private calculateMin(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgsWithRanges(args)\n .filter(arg => !isNaN(Number(arg)))\n .map(arg => Number(arg));\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n return { value: Math.min(...values), error: undefined };\n }\n\n private calculateAbs(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'ABS requires exactly 1 argument' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'ABS argument must be a number' };\n }\n return { value: Math.abs(num), error: undefined };\n }\n\n private calculateRound(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1 || args.length > 2) {\n return { value: null, error: 'ROUND requires 1 or 2 arguments' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'ROUND argument must be a number' };\n }\n const digits = args.length === 2 ? Number(args[1]) : 0;\n if (isNaN(digits)) {\n return { value: null, error: 'ROUND digits must be a number' };\n }\n const factor = Math.pow(10, digits);\n return { value: Math.round(num * factor) / factor, error: undefined };\n }\n\n private calculateInt(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'INT requires exactly 1 argument' };\n }\n const num = Number(args[0]);\n if (isNaN(num)) {\n return { value: null, error: 'INT argument must be a number' };\n }\n return { value: Math.floor(num), error: undefined };\n }\n\n private calculateRand(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'RAND requires no arguments' };\n }\n return { value: Math.random(), error: undefined };\n }\n\n private calculateCount(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args);\n let count = 0;\n for (const value of values) {\n // COUNT only counts numeric values, excluding empty strings, null, undefined\n if (value !== '' && value !== null && value !== undefined) {\n const num = Number(value);\n if (!isNaN(num)) {\n count++;\n }\n }\n }\n return { value: count, error: undefined };\n }\n\n private calculateCountA(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args);\n let count = 0;\n for (const value of values) {\n if (value !== null && value !== undefined && value !== '') {\n count++;\n }\n }\n return { value: count, error: undefined };\n }\n\n private calculateStdev(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length < 2) {\n return { value: 0, error: undefined };\n }\n\n // Calculate mean\n const mean = values.reduce((sum, val) => sum + val, 0) / values.length;\n\n // Calculate variance\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1);\n\n // Return standard deviation\n return { value: Math.sqrt(variance), error: undefined };\n }\n\n private calculateVar(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length < 2) {\n return { value: 0, error: undefined };\n }\n\n // Calculate mean\n const mean = values.reduce((sum, val) => sum + val, 0) / values.length;\n\n // Calculate variance (sample variance - divide by n-1 like STDEV)\n const variance = values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / (values.length - 1);\n\n return { value: variance, error: undefined };\n }\n\n private calculateMedian(args: unknown[]): { value: unknown; error?: string } {\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n\n // Sort the values\n const sortedValues = values.sort((a, b) => a - b);\n\n if (sortedValues.length % 2 === 0) {\n // Even number of values - return average of middle two\n const mid1 = sortedValues[sortedValues.length / 2 - 1];\n const mid2 = sortedValues[sortedValues.length / 2];\n return { value: (mid1 + mid2) / 2, error: undefined };\n }\n // Odd number of values - return middle value\n return { value: sortedValues[Math.floor(sortedValues.length / 2)], error: undefined };\n }\n\n private calculateProduct(args: unknown[]): { value: unknown; error?: string } {\n let product = 1;\n const values = this.flattenArgs(args)\n .filter(arg => !isNaN(Number(arg)) && arg !== '' && arg !== null && arg !== undefined)\n .map(arg => Number(arg));\n\n if (values.length === 0) {\n return { value: 0, error: undefined };\n }\n\n for (const value of values) {\n product *= value;\n }\n\n return { value: product, error: undefined };\n }\n\n private calculateIf(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 3) {\n return { value: null, error: 'IF requires exactly 3 arguments' };\n }\n\n // 第一个参数是条件\n const condition = this.isTruthy(args[0]);\n\n // 返回对应的结果\n return { value: condition ? args[1] : args[2], error: undefined };\n }\n\n private calculateAnd(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1) {\n return { value: null, error: 'AND requires at least 1 argument' };\n }\n for (const arg of args) {\n if (!this.isTruthy(arg)) {\n return { value: false, error: undefined };\n }\n }\n return { value: true, error: undefined };\n }\n\n private calculateOr(args: unknown[]): { value: unknown; error?: string } {\n if (args.length < 1) {\n return { value: null, error: 'OR requires at least 1 argument' };\n }\n for (const arg of args) {\n if (this.isTruthy(arg)) {\n return { value: true, error: undefined };\n }\n }\n return { value: false, error: undefined };\n }\n\n private calculateNot(args: unknown[]): { value: unknown; error?: string } {\n if (args.length !== 1) {\n return { value: null, error: 'NOT requires exactly 1 argument' };\n }\n return { value: !this.isTruthy(args[0]), error: undefined };\n }\n\n private calculateToday(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'TODAY requires no arguments' };\n }\n return { value: new Date(), error: undefined };\n }\n\n private calculateNow(args: unknown[]): { value: unknown; error?: string } {\n if (args.length > 0) {\n return { value: null, error: 'NOW requires no arguments' };\n }\n return { value: new Date(), error: undefined };\n }\n\n private flattenArgs(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const arg of args) {\n if (Array.isArray(arg)) {\n result.push(...arg);\n } else {\n result.push(arg);\n }\n }\n return result;\n }\n\n private flattenArgsWithRanges(args: unknown[]): unknown[] {\n const result: unknown[] = [];\n for (const arg of args) {\n if (Array.isArray(arg)) {\n result.push(...arg);\n } else if (typeof arg === 'string' && arg.includes(':')) {\n // 处理范围引用,如 A2:A4\n try {\n const rangeValues = this.getRangeValuesFromExpr(arg);\n result.push(...rangeValues);\n } catch {\n // 如果范围解析失败,保持原样\n result.push(arg);\n }\n } else {\n result.push(arg);\n }\n }\n return result;\n }\n\n private isTruthy(value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (value === false || value === 0 || value === '') {\n return false;\n }\n if (value === true) {\n return true;\n }\n\n // 处理字符串\n if (typeof value === 'string') {\n if (value.toLowerCase() === 'false') {\n return false;\n }\n if (value.toLowerCase() === 'true') {\n return true;\n }\n }\n\n const num = Number(value);\n if (!isNaN(num)) {\n return num !== 0;\n }\n\n return true; // 非空值视为true\n }\n\n private evaluateArithmeticWithFunctions(expr: string): { value: unknown; error?: string } {\n try {\n // 这个函数处理包含函数调用的算术表达式,如 SUM(A2:A4)+AVERAGE(A2:A4)\n\n // 1. 首先找到所有的函数调用\n const functionMatches = [];\n const functionRegex = /[A-Z]+\\([^)]*\\)/g;\n let match;\n\n while ((match = functionRegex.exec(expr)) !== null) {\n functionMatches.push({\n match: match[0],\n start: match.index,\n end: match.index + match[0].length\n });\n }\n\n // 2. 计算每个函数的值\n let processedExpr = expr;\n const functionValues = [];\n\n for (const funcMatch of functionMatches) {\n const funcResult = this.parseExpression(funcMatch.match);\n if (funcResult.error) {\n return { value: null, error: `Error in function ${funcMatch.match}: ${funcResult.error}` };\n }\n functionValues.push(funcResult.value);\n // 用占位符替换函数调用,避免重复处理\n processedExpr = processedExpr.replace(funcMatch.match, `__FUNC_${functionValues.length - 1}__`);\n }\n\n // 3. 处理剩余的单元格引用\n const cellRefs = processedExpr.match(/[A-Z]+[0-9]+/g) || [];\n for (const cellRef of cellRefs) {\n const value = this.getCellValueByA1(cellRef);\n processedExpr = processedExpr.replace(cellRef, String(value));\n }\n\n // 4. 将占位符替换回实际值\n for (let i = 0; i < functionValues.length; i++) {\n processedExpr = processedExpr.replace(`__FUNC_${i}__`, String(functionValues[i]));\n }\n\n // 5. 计算最终的算术表达式\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const result = Function('\"use strict\"; return (' + processedExpr + ')')();\n return { value: result, error: undefined };\n } catch (error) {\n return { value: null, error: 'Basic arithmetic evaluation failed' };\n }\n }\n\n private evaluateBasicArithmetic(expr: string): { value: unknown; error?: string } {\n try {\n // 如果表达式还包含函数调用,不应该在这里处理\n if (/[A-Z]+\\s*\\(/.test(expr)) {\n return { value: null, error: 'Expression contains function calls' };\n }\n\n // 替换单元格引用为实际值\n let processedExpr = expr;\n\n // 处理单元格引用\n const cellRefs = processedExpr.match(/[A-Z]+[0-9]+/g) || [];\n for (const cellRef of cellRefs) {\n const value = this.getCellValueByA1(cellRef);\n processedExpr = processedExpr.replace(cellRef, String(value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const result = Function('\"use strict\"; return (' + processedExpr + ')')();\n return { value: result, error: undefined };\n } catch (error) {\n return { value: null, error: 'Basic arithmetic evaluation failed' };\n }\n }\n\n private getCellValueByA1(a1Notation: string): unknown {\n try {\n let sheetKey = this.activeSheetKey || this.reverseSheets.get(0) || 'Sheet1';\n let cellRef = a1Notation;\n\n // 检查是否包含工作表前缀\n if (a1Notation.includes('!')) {\n const parts = a1Notation.split('!');\n if (parts.length === 2) {\n sheetKey = parts[0];\n cellRef = parts[1];\n }\n }\n\n const { row, col } = this.parseA1Notation(cellRef);\n const cell: FormulaCell = { sheet: sheetKey, row, col };\n return this.getCellValue(cell).value;\n } catch {\n return 0;\n }\n }\n\n private getRangeValuesFromExpr(expr: string): unknown[] {\n try {\n if (!expr.includes(':')) {\n return [this.getCellValueByA1(expr)];\n }\n\n // 解析范围引用,可能包含工作表前缀,如 DataSheet!A2:A4\n let sheetKey = this.activeSheetKey || this.reverseSheets.get(0) || 'Sheet1';\n let rangeExpr = expr;\n\n // 检查是否包含工作表前缀\n if (expr.includes('!')) {\n const parts = expr.split('!');\n if (parts.length === 2) {\n sheetKey = parts[0];\n rangeExpr = parts[1];\n }\n }\n\n const [start, end] = rangeExpr.split(':');\n const startCell = this.parseA1Notation(start.trim());\n const endCell = this.parseA1Notation(end.trim());\n\n const values: unknown[] = [];\n\n for (let row = startCell.row; row <= endCell.row; row++) {\n for (let col = startCell.col; col <= endCell.col; col++) {\n const cell: FormulaCell = { sheet: sheetKey, row, col };\n values.push(this.getCellValue(cell).value);\n }\n }\n\n return values;\n } catch {\n return [];\n }\n }\n\n // 公共方法\n getCellValue(cell: FormulaCell): FormulaResult {\n try {\n const sheetId = this.sheets.get(cell.sheet);\n if (sheetId === undefined) {\n return { value: '', error: undefined };\n }\n\n const sheet = this.sheetData.get(sheetId);\n\n if (!sheet || !sheet[cell.row] || sheet[cell.row][cell.col] === undefined || sheet[cell.row][cell.col] === null) {\n return { value: '', error: undefined };\n }\n\n const value = sheet[cell.row][cell.col];\n\n // 如果是公式,计算其结果\n if (typeof value === 'string' && value.startsWith('=')) {\n const result = this.calculateFormula(value);\n return result;\n }\n\n // 如果是公式错误\n if (value instanceof FormulaError) {\n return { value: null, error: value.message };\n }\n\n return { value, error: undefined };\n } catch (error) {\n return {\n value: null,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n getCellFormula(cell: FormulaCell): string | undefined {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.get(cellKey);\n }\n\n isCellFormula(cell: FormulaCell): boolean {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.has(cellKey);\n }\n\n getCellDependents(cell: FormulaCell): FormulaCell[] {\n const cellKey = this.getCellKey(cell);\n const dependents = this.dependents.get(cellKey);\n\n if (!dependents) {\n return [];\n }\n\n const result: FormulaCell[] = [];\n for (const dependent of dependents) {\n const parsed = this.parseCellKey(dependent);\n if (parsed) {\n result.push(parsed);\n }\n }\n\n return result;\n }\n\n getCellPrecedents(cell: FormulaCell): FormulaCell[] {\n const cellKey = this.getCellKey(cell);\n const dependencies = this.dependencies.get(cellKey);\n\n if (!dependencies) {\n return [];\n }\n\n const result: FormulaCell[] = [];\n for (const dependency of dependencies) {\n const parsed = this.parseCellKey(dependency);\n if (parsed) {\n result.push(parsed);\n }\n }\n\n return result;\n }\n\n getAvailableFunctions(): string[] {\n return [...supportedFunctions];\n }\n\n // 新增方法:验证公式语法(仅语法验证,不计算)\n validateFormula(formula: string): { isValid: boolean; error?: string } {\n try {\n // 仅进行语法验证,不进行实际计算\n if (!formula.startsWith('=')) {\n return { isValid: true }; // 非公式总是有效的\n }\n\n const expression = formula.substring(1).trim();\n if (!expression) {\n return { isValid: false, error: 'Empty expression' };\n }\n\n // 基本语法检查\n this.validateExpressionStructure(expression);\n\n // 验证函数名是否有效\n this.validateFunctionNames(expression);\n\n return { isValid: true };\n } catch (error) {\n return {\n isValid: false,\n error: error instanceof Error ? error.message : 'Invalid formula syntax'\n };\n }\n }\n\n private validateFunctionNames(expr: string): void {\n // 匹配函数调用模式\n const functionPattern = /([A-Z]+)\\s*\\(/gi;\n let match;\n\n while ((match = functionPattern.exec(expr)) !== null) {\n const funcName = match[1].toUpperCase();\n if (!supportedFunctions.includes(funcName)) {\n throw new Error(`Unknown function: ${funcName}`);\n }\n }\n }\n\n private validateExpressionStructure(expr: string): void {\n // 检查括号是否匹配\n const openParenCount = (expr.match(/\\(/g) || []).length;\n const closeParenCount = (expr.match(/\\)/g) || []).length;\n if (openParenCount !== closeParenCount) {\n throw new Error('Unmatched parentheses');\n }\n\n // 检查引号是否匹配\n const doubleQuoteCount = (expr.match(/\"/g) || []).length;\n if (doubleQuoteCount % 2 !== 0) {\n throw new Error('Unmatched quotes');\n }\n\n // 检查是否有未完成的操作符\n if (expr.match(/[+\\-*/^&%<>=]$/)) {\n throw new Error('Expression ends with operator');\n }\n\n // 检查是否有连续的逗号\n if (expr.match(/,,/)) {\n throw new Error('Consecutive commas');\n }\n\n // 检查是否有未完成的函数参数\n if (expr.match(/\\([^)]*,\\s*\\)/) || expr.match(/,\\s*\\)/) || expr.match(/\\(\\s*\\)/)) {\n throw new Error('Invalid function arguments');\n }\n\n // 检查是否有连续的操作符 (如 1++1)\n if (expr.match(/[+\\-*/^&%][+\\-*/^&%]/)) {\n throw new Error('Basic arithmetic evaluation failed');\n }\n }\n\n release(): void {\n this.sheets.clear();\n this.reverseSheets.clear();\n this.sheetData.clear();\n this.formulaCells.clear();\n this.dependencies.clear();\n this.dependents.clear();\n this.nextSheetId = 0;\n }\n\n // 新增方法:导出公式\n exportFormulas(sheetKey: string): Record<string, string> {\n const result: Record<string, string> = {};\n const sheetId = this.sheets.get(sheetKey);\n\n if (sheetId === undefined) {\n return result;\n }\n\n // 遍历所有公式单元格\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey, formula] = entry;\n const cell = this.parseCellKey(cellKey);\n if (cell && cell.sheet === sheetKey) {\n const a1Notation = this.getA1Notation(cell.row, cell.col);\n result[a1Notation] = formula;\n }\n }\n\n return result;\n }\n\n // 新增方法:获取所有工作表\n getAllSheets(): Array<{ key: string; id: number; name: string }> {\n const result: Array<{ key: string; id: number; name: string }> = [];\n\n for (const entry of Array.from(this.sheets.entries())) {\n const [sheetKey, sheetId] = entry;\n result.push({\n key: sheetKey,\n id: sheetId,\n name: sheetKey // 使用key作为名称\n });\n }\n\n return result;\n }\n\n // 新增方法:按依赖关系对公式进行排序\n sortFormulasByDependency(sheetKey: string, formulas: Record<string, string>): [string, string][] {\n try {\n // 创建临时依赖图用于排序\n const tempDependencies = new Map<string, Set<string>>();\n const tempDependents = new Map<string, Set<string>>();\n\n // 分析所有公式的依赖关系\n for (const [cellRef, formula] of Object.entries(formulas)) {\n const cellKey = `${sheetKey}!${cellRef}`;\n const dependencies = this.extractCellReferences(formula, sheetKey);\n\n tempDependencies.set(cellKey, new Set(dependencies));\n\n // 建立反向依赖关系\n for (const dep of dependencies) {\n const depDependents = tempDependents.get(dep) || new Set();\n depDependents.add(cellKey);\n tempDependents.set(dep, depDependents);\n }\n }\n\n // 使用拓扑排序\n const visited = new Set<string>();\n const tempVisited = new Set<string>();\n const result: [string, string][] = [];\n\n const visit = (cellKey: string): void => {\n if (visited.has(cellKey)) {\n return;\n }\n if (tempVisited.has(cellKey)) {\n console.warn(`Circular dependency detected involving cell ${cellKey}`);\n return;\n }\n\n tempVisited.add(cellKey);\n\n const deps = tempDependencies.get(cellKey) || new Set();\n for (const dep of deps) {\n if (tempDependencies.has(dep)) {\n // 只访问也是公式的依赖\n visit(dep);\n }\n }\n\n tempVisited.delete(cellKey);\n visited.add(cellKey);\n\n // 提取单元格引用(移除工作表前缀)\n const cellRef = cellKey.substring(sheetKey.length + 1);\n const formula = formulas[cellRef];\n if (formula) {\n result.push([cellRef, formula]);\n }\n };\n\n // 访问所有公式单元格\n for (const cellKey of tempDependencies.keys()) {\n if (!visited.has(cellKey)) {\n visit(cellKey);\n }\n }\n\n return result;\n } catch (error) {\n console.warn(`Failed to sort formulas by dependency for sheet ${sheetKey}:`, error);\n // 如果排序失败,返回原始顺序\n return Object.entries(formulas);\n }\n }\n\n // 新增方法:删除工作表\n removeSheet(sheetKey: string): void {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId === undefined) {\n return;\n }\n\n // 不能删除最后一个sheet\n if (this.sheets.size <= 1) {\n throw new Error('Cannot remove the last sheet');\n }\n\n // 删除工作表数据\n this.sheetData.delete(sheetId);\n this.sheets.delete(sheetKey);\n this.reverseSheets.delete(sheetId);\n\n // 删除相关的公式和依赖关系\n const keysToRemove: string[] = [];\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey] = entry;\n if (cellKey.startsWith(`${sheetKey}!`)) {\n keysToRemove.push(cellKey);\n }\n }\n\n for (const cellKey of keysToRemove) {\n this.formulaCells.delete(cellKey);\n this.dependencies.delete(cellKey);\n this.dependents.delete(cellKey);\n }\n\n // 清理依赖关系中的引用\n for (const entry of Array.from(this.dependencies.entries())) {\n const [cellKey, deps] = entry;\n const newDeps = new Set<string>();\n for (const dep of deps) {\n if (!dep.startsWith(`${sheetKey}!`)) {\n newDeps.add(dep);\n }\n }\n if (newDeps.size === 0) {\n this.dependencies.delete(cellKey);\n } else {\n this.dependencies.set(cellKey, newDeps);\n }\n }\n\n for (const entry of Array.from(this.dependents.entries())) {\n const [cellKey, dependents] = entry;\n const newDependents = new Set<string>();\n for (const dep of dependents) {\n if (!dep.startsWith(`${sheetKey}!`)) {\n newDependents.add(dep);\n }\n }\n if (newDependents.size === 0) {\n this.dependents.delete(cellKey);\n } else {\n this.dependents.set(cellKey, newDependents);\n }\n }\n }\n\n // 新增方法:重命名工作表\n renameSheet(oldKey: string, newKey: string): void {\n const sheetId = this.sheets.get(oldKey);\n if (sheetId === undefined) {\n throw new Error(`Sheet not found: ${oldKey}`);\n }\n\n if (this.sheets.has(newKey)) {\n throw new Error(`Sheet already exists: ${newKey}`);\n }\n\n // 更新工作表映射\n this.sheets.delete(oldKey);\n this.sheets.set(newKey, sheetId);\n this.reverseSheets.set(sheetId, newKey);\n\n // 更新公式单元格的键\n const formulaEntriesToUpdate: [string, string][] = [];\n for (const entry of Array.from(this.formulaCells.entries())) {\n const [cellKey, formula] = entry;\n if (cellKey.startsWith(`${oldKey}!`)) {\n const newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n formulaEntriesToUpdate.push([newCellKey, formula]);\n this.formulaCells.delete(cellKey);\n }\n }\n\n for (const [newCellKey, formula] of formulaEntriesToUpdate) {\n this.formulaCells.set(newCellKey, formula);\n }\n\n // 更新依赖关系的键\n const dependencyEntriesToUpdate: [string, Set<string>][] = [];\n for (const entry of Array.from(this.dependencies.entries())) {\n const [cellKey, deps] = entry;\n let newCellKey = cellKey;\n const newDeps = new Set<string>();\n\n if (cellKey.startsWith(`${oldKey}!`)) {\n newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n }\n\n for (const dep of deps) {\n if (dep.startsWith(`${oldKey}!`)) {\n newDeps.add(dep.replace(`${oldKey}!`, `${newKey}!`));\n } else {\n newDeps.add(dep);\n }\n }\n\n if (newCellKey !== cellKey || !this.areSetsEqual(newDeps, deps)) {\n dependencyEntriesToUpdate.push([newCellKey, newDeps]);\n this.dependencies.delete(cellKey);\n }\n }\n\n for (const [newCellKey, newDeps] of dependencyEntriesToUpdate) {\n this.dependencies.set(newCellKey, newDeps);\n }\n\n // 更新被依赖关系的键\n const dependentEntriesToUpdate: [string, Set<string>][] = [];\n for (const entry of Array.from(this.dependents.entries())) {\n const [cellKey, dependents] = entry;\n let newCellKey = cellKey;\n const newDependents = new Set<string>();\n\n if (cellKey.startsWith(`${oldKey}!`)) {\n newCellKey = cellKey.replace(`${oldKey}!`, `${newKey}!`);\n }\n\n for (const dep of dependents) {\n if (dep.startsWith(`${oldKey}!`)) {\n newDependents.add(dep.replace(`${oldKey}!`, `${newKey}!`));\n } else {\n newDependents.add(dep);\n }\n }\n\n if (newCellKey !== cellKey || !this.areSetsEqual(newDependents, dependents)) {\n dependentEntriesToUpdate.push([newCellKey, newDependents]);\n this.dependents.delete(cellKey);\n }\n }\n\n for (const [newCellKey, newDependents] of dependentEntriesToUpdate) {\n this.dependents.set(newCellKey, newDependents);\n }\n }\n\n // 辅助方法:比较两个Set是否相等\n private areSetsEqual(set1: Set<string>, set2: Set<string>): boolean {\n if (set1.size !== set2.size) {\n return false;\n }\n for (const item of set1) {\n if (!set2.has(item)) {\n return false;\n }\n }\n return true;\n }\n\n // 依赖关系管理\n private updateDependencies(cellKey: string, formula: string): void {\n // 清除旧的依赖关系\n const oldDeps = this.dependencies.get(cellKey) || new Set();\n for (const dep of oldDeps) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.delete(cellKey);\n if (depDependents.size === 0) {\n this.dependents.delete(dep);\n } else {\n this.dependents.set(dep, depDependents);\n }\n }\n\n // 从cellKey中提取当前工作表上下文\n const currentSheet = this.parseCellKey(cellKey)?.sheet || 'Sheet1';\n\n // 提取新的依赖关系,传入当前工作表上下文\n const dependencies = this.extractCellReferences(formula, currentSheet);\n this.dependencies.set(cellKey, new Set(dependencies));\n\n // 建立新的依赖关系\n for (const dep of dependencies) {\n const depDependents = this.dependents.get(dep) || new Set();\n depDependents.add(cellKey);\n this.dependents.set(dep, depDependents);\n }\n }\n\n private extractCellReferences(formula: string, currentSheet: string = 'Sheet1'): string[] {\n if (!formula || typeof formula !== 'string' || !formula.startsWith('=')) {\n return [];\n }\n\n const expression = formula.substring(1).trim();\n const references: string[] = [];\n\n try {\n this.extractReferencesFromExpression(expression, references, currentSheet);\n } catch (error) {\n console.warn('Failed to extract cell references:', error);\n }\n\n return [...new Set(references)];\n }\n\n private extractReferencesFromExpression(expr: string, references: string[], currentSheet: string = 'Sheet1'): void {\n // 移除字符串字面量,避免误匹配\n let cleanExpr = expr.replace(/\"[^\"]*\"/g, '');\n cleanExpr = cleanExpr.replace(/'[^']*'/g, '');\n\n // 匹配单元格引用 (A1, B2, Sheet1!A1, 等)\n const cellRefPattern = /(?:([A-Za-z0-9_]+)!)?([A-Z]+[0-9]+)(?::([A-Z]+[0-9]+))?/g;\n let match;\n\n while ((match = cellRefPattern.exec(cleanExpr)) !== null) {\n const sheetName = match[1] || currentSheet; // 使用当前工作表上下文,而不是默认Sheet1\n const startCell = match[2];\n const endCell = match[3];\n\n if (endCell) {\n // 范围引用,如 A1:B2 - 需要展开为所有单个单元格\n const expandedRefs = this.expandRangeToCells(sheetName, startCell, endCell);\n references.push(...expandedRefs);\n } else {\n // 单个单元格引用,如 A1\n references.push(`${sheetName}!${startCell}`);\n }\n }\n\n // 也匹配单独的单元格引用\n const singleCellPattern = /[A-Z]+[0-9]+/g;\n const singleMatches = cleanExpr.match(singleCellPattern) || [];\n for (const match of singleMatches) {\n if (!references.some(ref => ref.endsWith(match))) {\n references.push(`${currentSheet}!${match}`); // 使用当前工作表上下文\n }\n }\n }\n\n private expandRangeToCells(sheetName: string, startCell: string, endCell: string): string[] {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\n\n const cells: string[] = [];\n\n // 确保start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n cells.push(`${sheetName}!${this.getA1Notation(row, col)}`);\n }\n }\n\n return cells;\n } catch {\n // 如果解析失败,返回原始范围\n return [`${sheetName}!${startCell}:${endCell}`];\n }\n }\n\n private recalculateDependents(changedCell: FormulaCell): void {\n this.recalculateDependentsWithTracking(changedCell, new Set<string>());\n }\n\n private recalculateDependentsWithTracking(changedCell: FormulaCell, visited: Set<string>): void {\n const cellKey = this.getCellKey(changedCell);\n\n // 防止循环依赖导致的无限递归\n if (visited.has(cellKey)) {\n return;\n }\n\n const dependents = this.dependents.get(cellKey);\n\n if (!dependents || dependents.size === 0) {\n return;\n }\n\n // 按依赖顺序重新计算\n const sortedDependents = this.sortCellsByDependency([...dependents]);\n\n for (const dependentKey of sortedDependents) {\n this.recalculateSingleCellWithTracking(dependentKey, visited);\n }\n }\n\n private recalculateSingleCellWithTracking(cellKey: string, visited: Set<string>): void {\n // 防止循环依赖导致的无限递归\n if (visited.has(cellKey)) {\n return;\n }\n\n const formula = this.formulaCells.get(cellKey);\n if (!formula) {\n return;\n }\n\n const cell = this.parseCellKey(cellKey);\n if (!cell) {\n return;\n }\n\n // 重新计算公式并更新值\n const result = this.calculateFormula(formula);\n if (result.error) {\n return;\n }\n\n const sheetId = this.sheets.get(cell.sheet);\n if (sheetId === undefined) {\n return;\n }\n\n const sheet = this.sheetData.get(sheetId);\n if (!sheet || !sheet[cell.row] || sheet[cell.row][cell.col] === undefined) {\n return;\n }\n\n const oldValue = sheet[cell.row][cell.col];\n const newValue = result.value;\n sheet[cell.row][cell.col] = newValue;\n\n // 如果值发生了变化,递归重新计算其依赖\n if (oldValue !== newValue) {\n // 将当前单元格添加到访问集合中,防止循环\n visited.add(cellKey);\n this.recalculateDependentsWithTracking(cell, visited);\n // 从访问集合中移除,允许在其他路径中重新访问\n visited.delete(cellKey);\n }\n }\n\n private sortCellsByDependency(cells: string[]): string[] {\n const visited = new Set<string>();\n const tempVisited = new Set<string>();\n const result: string[] = [];\n\n const visit = (cell: string): void => {\n if (visited.has(cell)) {\n return;\n }\n if (tempVisited.has(cell)) {\n console.warn(`Circular dependency detected involving cell ${cell}`);\n return;\n }\n\n tempVisited.add(cell);\n\n const deps = this.dependencies.get(cell) || new Set();\n for (const dep of deps) {\n if (cells.includes(dep)) {\n visit(dep);\n }\n }\n\n tempVisited.delete(cell);\n visited.add(cell);\n result.push(cell);\n };\n\n for (const cell of cells) {\n if (!visited.has(cell)) {\n visit(cell);\n }\n }\n\n return result;\n }\n}\n\nclass FormulaError {\n constructor(public message: string) {}\n}\n"]}
@@ -61,6 +61,6 @@ function detectFunctionParameterPosition(formula, cursorPosition) {
61
61
  Object.defineProperty(exports, "__esModule", {
62
62
  value: !0
63
63
  }), exports.detectFunctionParameterPosition = exports.supportedFunctions = void 0,
64
- exports.supportedFunctions = [ "SUM", "AVERAGE", "MAX", "MIN", "COUNT", "COUNTA", "IF", "AND", "OR", "NOT", "ROUND", "FLOOR", "CEILING", "ABS", "SQRT", "POWER", "MOD", "INT", "RAND", "TODAY", "NOW", "YEAR", "MONTH", "DAY", "HOUR", "MINUTE", "SECOND" ],
64
+ exports.supportedFunctions = [ "SUM", "AVERAGE", "MAX", "MIN", "COUNT", "COUNTA", "STDEV", "VAR", "MEDIAN", "IF", "AND", "OR", "NOT", "ROUND", "FLOOR", "CEILING", "ABS", "SQRT", "POWER", "MOD", "INT", "RAND", "TODAY", "NOW", "YEAR", "MONTH", "DAY", "HOUR", "MINUTE", "SECOND" ],
65
65
  exports.detectFunctionParameterPosition = detectFunctionParameterPosition;
66
66
  //# sourceMappingURL=formula-helper.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-helper.ts"],"names":[],"mappings":"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","file":"formula-helper.js","sourcesContent":["export const supportedFunctions = [\n 'SUM',\n 'AVERAGE',\n 'MAX',\n 'MIN',\n 'COUNT',\n 'COUNTA',\n 'IF',\n 'AND',\n 'OR',\n 'NOT',\n 'ROUND',\n 'FLOOR',\n 'CEILING',\n 'ABS',\n 'SQRT',\n 'POWER',\n 'MOD',\n 'INT',\n 'RAND',\n 'TODAY',\n 'NOW',\n 'YEAR',\n 'MONTH',\n 'DAY',\n 'HOUR',\n 'MINUTE',\n 'SECOND'\n];\n\n/**\n * 查找匹配的右括号\n * @param formula 公式内容\n * @param openParenIndex 左括号的位置\n * @returns 匹配的右括号位置,若未找到则返回-1\n */\nfunction findMatchingCloseParen(formula: string, openParenIndex: number): number {\n let depth = 1; // 括号深度计数\n\n for (let i = openParenIndex + 1; i < formula.length; i++) {\n if (formula[i] === '(') {\n depth++;\n } else if (formula[i] === ')') {\n depth--;\n if (depth === 0) {\n return i; // 找到匹配的右括号\n }\n }\n }\n\n return -1; // 未找到匹配的右括号\n}\n\n/**\n * 检测函数参数位置\n * @param formula 公式内容\n * @param cursorPosition 光标位置\n * @returns 是否在函数参数位置\n */\nexport function detectFunctionParameterPosition(\n formula: string,\n cursorPosition: number\n): {\n inParamMode: boolean;\n functionParamPosition: {\n start: number;\n end: number;\n } | null;\n} {\n // 基本检查\n if (!formula.startsWith('=')) {\n return {\n inParamMode: false,\n functionParamPosition: null\n };\n }\n\n // 1. 先检查是否在函数参数位置\n // 匹配所有函数调用模式:FUNCTION_NAME(\n const functionRegex = /([A-Za-z]+)\\s*\\(/g;\n let match;\n let positionBeforeCursor = -1;\n\n // 查找距离光标最近的左括号\n while ((match = functionRegex.exec(formula)) !== null) {\n const functionName = match[1].toUpperCase();\n const functionStart = match.index;\n const openParenIndex = formula.indexOf('(', functionStart);\n\n // 如果光标在函数名之后,且这个函数比之前找到的更接近光标\n if (openParenIndex < cursorPosition && openParenIndex > positionBeforeCursor) {\n // 查找对应的右括号位置\n const closeParenIndex = findMatchingCloseParen(formula, openParenIndex);\n\n // 检查光标是否在函数参数位置(在左括号之后且在右括号之前或没有找到右括号)\n if (cursorPosition > openParenIndex && (closeParenIndex === -1 || cursorPosition <= closeParenIndex)) {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: openParenIndex + 1,\n end: cursorPosition\n }\n };\n }\n\n // 如果光标正好在括号后面,也认为是参数位置\n if (cursorPosition === openParenIndex + 1) {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: openParenIndex + 1,\n end: cursorPosition\n }\n };\n }\n\n // 记录这个左括号位置,用于比较\n positionBeforeCursor = openParenIndex;\n }\n }\n\n // 2. 检查是否在操作符后面 - 也将此视为函数参数模式\n if (cursorPosition > 1 && cursorPosition <= formula.length) {\n const prevChar = formula[cursorPosition - 1];\n if (['+', '-', '*', '/', '=', '>', '<', '&', '|', '^', '(', ','].includes(prevChar)) {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: cursorPosition,\n end: cursorPosition\n }\n };\n }\n }\n\n // 3. 检查是否在公式开始位置 - 公式开始后也视为可能需要函数输入\n if (cursorPosition === 1 && formula[0] === '=') {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: cursorPosition,\n end: cursorPosition\n }\n };\n }\n\n // 默认情况,不在任何特殊位置\n return {\n inParamMode: false,\n functionParamPosition: null\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-helper.ts"],"names":[],"mappings":"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","file":"formula-helper.js","sourcesContent":["export const supportedFunctions = [\n 'SUM',\n 'AVERAGE',\n 'MAX',\n 'MIN',\n 'COUNT',\n 'COUNTA',\n 'STDEV',\n 'VAR',\n 'MEDIAN',\n 'IF',\n 'AND',\n 'OR',\n 'NOT',\n 'ROUND',\n 'FLOOR',\n 'CEILING',\n 'ABS',\n 'SQRT',\n 'POWER',\n 'MOD',\n 'INT',\n 'RAND',\n 'TODAY',\n 'NOW',\n 'YEAR',\n 'MONTH',\n 'DAY',\n 'HOUR',\n 'MINUTE',\n 'SECOND'\n];\n\n/**\n * 查找匹配的右括号\n * @param formula 公式内容\n * @param openParenIndex 左括号的位置\n * @returns 匹配的右括号位置,若未找到则返回-1\n */\nfunction findMatchingCloseParen(formula: string, openParenIndex: number): number {\n let depth = 1; // 括号深度计数\n\n for (let i = openParenIndex + 1; i < formula.length; i++) {\n if (formula[i] === '(') {\n depth++;\n } else if (formula[i] === ')') {\n depth--;\n if (depth === 0) {\n return i; // 找到匹配的右括号\n }\n }\n }\n\n return -1; // 未找到匹配的右括号\n}\n\n/**\n * 检测函数参数位置\n * @param formula 公式内容\n * @param cursorPosition 光标位置\n * @returns 是否在函数参数位置\n */\nexport function detectFunctionParameterPosition(\n formula: string,\n cursorPosition: number\n): {\n inParamMode: boolean;\n functionParamPosition: {\n start: number;\n end: number;\n } | null;\n} {\n // 基本检查\n if (!formula.startsWith('=')) {\n return {\n inParamMode: false,\n functionParamPosition: null\n };\n }\n\n // 1. 先检查是否在函数参数位置\n // 匹配所有函数调用模式:FUNCTION_NAME(\n const functionRegex = /([A-Za-z]+)\\s*\\(/g;\n let match;\n let positionBeforeCursor = -1;\n\n // 查找距离光标最近的左括号\n while ((match = functionRegex.exec(formula)) !== null) {\n const functionName = match[1].toUpperCase();\n const functionStart = match.index;\n const openParenIndex = formula.indexOf('(', functionStart);\n\n // 如果光标在函数名之后,且这个函数比之前找到的更接近光标\n if (openParenIndex < cursorPosition && openParenIndex > positionBeforeCursor) {\n // 查找对应的右括号位置\n const closeParenIndex = findMatchingCloseParen(formula, openParenIndex);\n\n // 检查光标是否在函数参数位置(在左括号之后且在右括号之前或没有找到右括号)\n if (cursorPosition > openParenIndex && (closeParenIndex === -1 || cursorPosition <= closeParenIndex)) {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: openParenIndex + 1,\n end: cursorPosition\n }\n };\n }\n\n // 如果光标正好在括号后面,也认为是参数位置\n if (cursorPosition === openParenIndex + 1) {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: openParenIndex + 1,\n end: cursorPosition\n }\n };\n }\n\n // 记录这个左括号位置,用于比较\n positionBeforeCursor = openParenIndex;\n }\n }\n\n // 2. 检查是否在操作符后面 - 也将此视为函数参数模式\n if (cursorPosition > 1 && cursorPosition <= formula.length) {\n const prevChar = formula[cursorPosition - 1];\n if (['+', '-', '*', '/', '=', '>', '<', '&', '|', '^', '(', ','].includes(prevChar)) {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: cursorPosition,\n end: cursorPosition\n }\n };\n }\n }\n\n // 3. 检查是否在公式开始位置 - 公式开始后也视为可能需要函数输入\n if (cursorPosition === 1 && formula[0] === '=') {\n return {\n inParamMode: true,\n functionParamPosition: {\n start: cursorPosition,\n end: cursorPosition\n }\n };\n }\n\n // 默认情况,不在任何特殊位置\n return {\n inParamMode: false,\n functionParamPosition: null\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { FormulaManager } from '../managers/formula-manager';
2
- import type { CellRange, CellValueChangedEvent } from '../ts-types';
2
+ import type { CellValueChangedEvent } from '../ts-types';
3
3
  export interface FunctionParamPosition {
4
4
  start: number;
5
5
  end: number;
@@ -10,10 +10,13 @@ export declare class FormulaRangeSelector {
10
10
  selectionsToA1Notation(selections: any[], addressFromCoord: (row: number, col: number) => string): string;
11
11
  insertA1ReferenceInFunction(formulaInput: HTMLInputElement, a1Notation: string, isCtrlAddSelection: boolean): void;
12
12
  private findCurrentArgumentPosition;
13
- handleSelectionChanged(selections: CellRange[], formulaInput: HTMLInputElement, isCtrlAddSelection: boolean, addressFromCoord: (row: number, col: number) => string): void;
13
+ private handleSelectionChanged;
14
14
  handleCellValueChanged(event: CellValueChangedEvent): void;
15
15
  handleSelectionChangedForRangeMode(event: any): void;
16
16
  private hasFormulaDependents;
17
+ private updateDependentCellsCascade;
18
+ private getAllDependentsRecursive;
19
+ private sortCellsByDependencyOrder;
17
20
  private ensureCursorVisible;
18
21
  release(): void;
19
22
  }
@@ -134,31 +134,37 @@ class FormulaRangeSelector {
134
134
  row: event.row,
135
135
  col: event.col
136
136
  });
137
- null === (_b = activeWorkSheet.tableInstance) || void 0 === _b || _b.changeCellValue(event.col, event.row, result.value, !0, !1),
137
+ null === (_b = activeWorkSheet.tableInstance) || void 0 === _b || _b.changeCellValue(event.col, event.row, result.value, !1, !1),
138
138
  this.formulaManager.formulaWorkingOnCell = null;
139
139
  } catch (error) {
140
140
  null === (_c = activeWorkSheet.tableInstance) || void 0 === _c || _c.changeCellValue(event.col, event.row, "#ERROR!", !0, !1),
141
141
  this.formulaManager.formulaWorkingOnCell = null;
142
- } else formulaManager.setCellContent({
142
+ } else {
143
+ formulaManager.setCellContent({
144
+ sheet: activeWorkSheet.getKey(),
145
+ row: event.row,
146
+ col: event.col
147
+ }, newValue);
148
+ this.hasFormulaDependents({
149
+ sheet: activeWorkSheet.getKey(),
150
+ row: event.row,
151
+ col: event.col
152
+ }) && this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {
153
+ sheet: activeWorkSheet.getKey(),
154
+ row: event.row,
155
+ col: event.col
156
+ });
157
+ }
158
+ const formulaThrottle = formula_throttle_1.FormulaThrottle.getInstance();
159
+ this.hasFormulaDependents({
143
160
  sheet: activeWorkSheet.getKey(),
144
161
  row: event.row,
145
162
  col: event.col
146
- }, newValue);
147
- const formulaThrottle = formula_throttle_1.FormulaThrottle.getInstance();
148
- if (this.hasFormulaDependents({
163
+ }) ? (this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {
149
164
  sheet: activeWorkSheet.getKey(),
150
165
  row: event.row,
151
166
  col: event.col
152
- })) {
153
- formulaManager.getCellDependents({
154
- sheet: activeWorkSheet.getKey(),
155
- row: event.row,
156
- col: event.col
157
- }).forEach((dependent => {
158
- const result = formulaManager.getCellValue(dependent);
159
- activeWorkSheet && activeWorkSheet.setCellValue(dependent.row, dependent.col, result.value);
160
- })), formulaThrottle.immediateRebuildAndRecalculate(formulaManager);
161
- } else formulaThrottle.throttledRebuildAndRecalculate(formulaManager);
167
+ }), formulaThrottle.immediateRebuildAndRecalculate(formulaManager)) : formulaThrottle.throttledRebuildAndRecalculate(formulaManager);
162
168
  } catch (error) {}
163
169
  }
164
170
  handleSelectionChangedForRangeMode(event) {
@@ -184,6 +190,55 @@ class FormulaRangeSelector {
184
190
  return !1;
185
191
  }
186
192
  }
193
+ updateDependentCellsCascade(activeWorkSheet, formulaManager, changedCell) {
194
+ var _a;
195
+ try {
196
+ const allDependents = this.getAllDependentsRecursive(formulaManager, changedCell);
197
+ if (0 === allDependents.length) return;
198
+ const sortedDependents = this.sortCellsByDependencyOrder(formulaManager, allDependents);
199
+ for (const dependent of sortedDependents) {
200
+ const result = formulaManager.getCellValue(dependent);
201
+ result && activeWorkSheet && (null === (_a = activeWorkSheet.tableInstance) || void 0 === _a || _a.changeCellValue(dependent.col, dependent.row, result.value, !1, !1));
202
+ }
203
+ } catch (error) {}
204
+ }
205
+ getAllDependentsRecursive(formulaManager, cell, visited = new Set) {
206
+ const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;
207
+ if (visited.has(cellKey)) return [];
208
+ visited.add(cellKey);
209
+ const directDependents = formulaManager.getCellDependents(cell);
210
+ let allDependents = [ ...directDependents ];
211
+ for (const dependent of directDependents) {
212
+ const indirectDependents = this.getAllDependentsRecursive(formulaManager, dependent, visited);
213
+ allDependents = allDependents.concat(indirectDependents);
214
+ }
215
+ return allDependents;
216
+ }
217
+ sortCellsByDependencyOrder(formulaManager, cells) {
218
+ const dependencyGraph = new Map;
219
+ for (const cell of cells) {
220
+ const cellKey = `${cell.sheet}!${cell.row},${cell.col}`, precedents = formulaManager.getCellPrecedents(cell), dependencies = new Set;
221
+ for (const precedent of precedents) {
222
+ const precedentKey = `${precedent.sheet}!${precedent.row},${precedent.col}`;
223
+ dependencies.add(precedentKey);
224
+ }
225
+ dependencyGraph.set(cellKey, dependencies);
226
+ }
227
+ const sorted = [], visited = new Set, visiting = new Set, visit = cell => {
228
+ const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;
229
+ if (visited.has(cellKey)) return;
230
+ if (visiting.has(cellKey)) return;
231
+ visiting.add(cellKey);
232
+ const dependencies = dependencyGraph.get(cellKey) || new Set;
233
+ for (const depKey of Array.from(dependencies)) {
234
+ const depCell = cells.find((c => `${c.sheet}!${c.row},${c.col}` === depKey));
235
+ depCell && visit(depCell);
236
+ }
237
+ visiting.delete(cellKey), visited.add(cellKey), sorted.push(cell);
238
+ };
239
+ for (const cell of cells) visited.has(`${cell.sheet}!${cell.row},${cell.col}`) || visit(cell);
240
+ return sorted;
241
+ }
187
242
  ensureCursorVisible(input, cursorPos) {
188
243
  const tempSpan = document.createElement("span"), inputStyle = window.getComputedStyle(input);
189
244
  tempSpan.style.font = inputStyle.font, tempSpan.style.letterSpacing = inputStyle.letterSpacing,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-range-selector.ts"],"names":[],"mappings":"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","file":"formula-range-selector.js","sourcesContent":["/**\n * 公式范围选择器\n * 实现Excel风格的公式输入体验:用户输入\"=sum(\"后,选择单元格范围自动插入A1引用\n */\n\nimport { FormulaThrottle } from './formula-throttle';\nimport type { FormulaManager } from '../managers/formula-manager';\nimport type { CellRange, CellValueChangedEvent, FormulaCell } from '../ts-types';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\nexport interface FunctionParamPosition {\n start: number;\n end: number;\n}\n\nexport class FormulaRangeSelector {\n private formulaManager: FormulaManager;\n constructor(formulaManager: FormulaManager) {\n this.formulaManager = formulaManager;\n }\n\n /**\n * 将选择范围转换为A1格式\n * @param selections 选择范围数组\n * @param addressFromCoord 坐标转地址函数\n * @returns A1格式字符串\n */\n selectionsToA1Notation(selections: any[], addressFromCoord: (row: number, col: number) => string): string {\n if (!selections || selections.length === 0) {\n return '';\n }\n\n const ranges: string[] = [];\n\n for (const range of selections) {\n const startAddr = addressFromCoord(range.startRow, range.startCol);\n const endAddr = addressFromCoord(range.endRow, range.endCol);\n\n // 如果是单个单元格(start和end相同)\n if (range.startRow === range.endRow && range.startCol === range.endCol) {\n ranges.push(startAddr);\n } else {\n // 如果是范围,使用冒号分隔\n ranges.push(`${startAddr}:${endAddr}`);\n }\n }\n\n return ranges.join(',');\n }\n\n insertA1ReferenceInFunction(formulaInput: HTMLInputElement, a1Notation: string, isCtrlAddSelection: boolean): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n const currentValue = formulaInput.value;\n const cursorPos = this.formulaManager.lastKnownCursorPosInFormulaInput;\n\n // 找到当前光标所处的参数位置\n const argPosition = this.findCurrentArgumentPosition(currentValue, cursorPos);\n\n // 在函数参数位置插入或替换A1引用\n let newValue;\n\n if (argPosition) {\n if (isCtrlAddSelection) {\n // Ctrl模式:追加而非替换\n const currentArg = currentValue.substring(argPosition.start, argPosition.end).trim();\n\n if (currentArg) {\n // 如果当前参数不为空,追加逗号和新引用\n newValue =\n currentValue.slice(0, argPosition.end) +\n (currentValue[argPosition.end - 1] === ',' ? ' ' : ', ') +\n a1Notation +\n currentValue.slice(argPosition.end);\n } else {\n // 如果当前参数为空,直接插入新引用\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 替换模式:完全替换当前参数\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 防止newValue未定义\n newValue = currentValue;\n }\n\n formulaInput.value = newValue;\n // 首先设置公式内容\n this.formulaManager.setCellContent(\n {\n sheet: this.formulaManager.sheet.getActiveSheet().getKey(),\n row: this.formulaManager.sheet.getActiveSheet().editingCell.row,\n col: this.formulaManager.sheet.getActiveSheet().editingCell.col\n },\n newValue\n );\n // 设置光标位置到插入内容之后\n const newCursorPos = isCtrlAddSelection\n ? this.formulaManager.lastKnownCursorPosInFormulaInput + (newValue.length - currentValue.length)\n : argPosition\n ? argPosition.start + a1Notation.length\n : cursorPos;\n\n formulaInput.setSelectionRange(newCursorPos, newCursorPos);\n setTimeout(() => {\n // 确保光标位置在可视区域内\n this.ensureCursorVisible(formulaInput, newCursorPos);\n });\n // 更新函数参数位置\n this.formulaManager.inputIsParamMode.functionParamPosition = {\n start: newCursorPos,\n end: newCursorPos\n };\n\n // 触发输入事件以更新高亮\n const inputEvent = new Event('input', { bubbles: true });\n Object.defineProperty(inputEvent, 'isFormulaInsertion', { value: true });\n formulaInput.dispatchEvent(inputEvent);\n }\n /**\n * 找到光标所在的参数位置\n * @param formula 公式文本\n * @param cursorPos 光标位置\n * @returns 参数的起始和结束位置\n */\n private findCurrentArgumentPosition(formula: string, cursorPos: number): { start: number; end: number } | null {\n // 首先检查光标是否在操作符后面\n if (cursorPos > 1 && cursorPos <= formula.length) {\n const prevChar = formula[cursorPos - 1];\n if (['+', '-', '*', '/', '=', '>', '<', '&', '|', '^'].includes(prevChar)) {\n // 光标在操作符后面,将光标位置视为参数的起始和结束位置\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n }\n\n // 检查公式是否包含括号\n if (!formula.includes('(')) {\n return null;\n }\n\n // 从后向前查找最接近光标的左括号\n let lastOpenParenBeforeCursor = -1;\n let nestLevel = 0;\n let inQuote = false;\n\n // 第一阶段:找到光标所在的函数调用\n for (let i = 0; i < cursorPos; i++) {\n const char = formula[i];\n\n // 处理引号内的内容\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n\n // 如果在引号内,忽略所有特殊字符\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n lastOpenParenBeforeCursor = i;\n } else if (char === ')') {\n nestLevel--;\n }\n }\n\n // 如果没有找到左括号或者光标不在任何括号内\n if (lastOpenParenBeforeCursor === -1 || nestLevel <= 0) {\n // 检查是否在公式开始位置\n if (formula.startsWith('=') && cursorPos === 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n return null;\n }\n\n // 特殊处理:光标恰好在左括号后面\n if (cursorPos === lastOpenParenBeforeCursor + 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 特殊处理:光标在逗号后面\n if (cursorPos > 0 && formula[cursorPos - 1] === ',') {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 找到当前参数的起始位置\n let argumentStart = lastOpenParenBeforeCursor + 1;\n let argumentEnd = cursorPos;\n\n // 重置状态\n nestLevel = 1; // 从左括号开始,嵌套级别为1\n inQuote = false;\n\n // 从找到的左括号位置向光标方向扫描,找到当前参数的起始位置\n for (let i = argumentStart; i < cursorPos; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n if (nestLevel === 0) {\n // 如果回到了函数最外层,则这个右括号后面的内容不再是当前函数的参数\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 如果是当前函数层级的参数分隔符,更新参数开始位置\n argumentStart = i + 1;\n }\n }\n\n // 重置状态,准备从光标位置向后扫描\n nestLevel = 0;\n inQuote = false;\n\n // 重新计算光标位置的嵌套级别\n for (let i = 0; i < cursorPos; i++) {\n if (formula[i] === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (formula[i] === '(') {\n nestLevel++;\n }\n if (formula[i] === ')') {\n nestLevel--;\n }\n }\n\n // 从光标位置向后查找参数结束位置\n argumentEnd = formula.length;\n for (let i = cursorPos; i < formula.length; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n // 如果回到了当前函数的右括号\n if (nestLevel === 0) {\n argumentEnd = i;\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 找到下一个同级参数的分隔符\n argumentEnd = i;\n break;\n }\n }\n\n // 处理空参数的情况\n const paramContentBefore = formula.substring(argumentStart, cursorPos).trim();\n const paramContentAfter = formula.substring(cursorPos, argumentEnd).trim();\n\n if (paramContentBefore === '' && cursorPos === argumentStart) {\n // 光标在参数起始位置,且参数为空\n return {\n start: argumentStart,\n end: argumentStart\n };\n }\n\n if (paramContentAfter === '' && cursorPos < argumentEnd) {\n // 光标后面到结束位置都是空白\n argumentEnd = cursorPos;\n }\n\n return {\n start: argumentStart,\n end: argumentEnd\n };\n }\n /**\n * 处理单元格选择变化\n * @param selections 当前选择范围\n * @param formulaInput 公式输入框\n * @param addressFromCoord 坐标转地址函数\n */\n handleSelectionChanged(\n selections: CellRange[],\n formulaInput: HTMLInputElement,\n isCtrlAddSelection: boolean,\n addressFromCoord: (row: number, col: number) => string\n ): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode || !selections || selections.length === 0) {\n return;\n }\n\n const a1Notation = this.selectionsToA1Notation(selections, addressFromCoord);\n if (a1Notation) {\n this.insertA1ReferenceInFunction(formulaInput, a1Notation, isCtrlAddSelection);\n }\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 事件\n */\n handleCellValueChanged(event: CellValueChangedEvent): void {\n console.log('handleCellValueChanged', event);\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaManager = this.formulaManager.sheet.formulaManager;\n\n if (!activeWorkSheet || this.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n try {\n // 检查新输入的值是否为公式\n const newValue = event.newValue;\n if (typeof newValue === 'string' && newValue.startsWith('=') && newValue.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(event.row, event.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(newValue)) {\n console.warn('Circular reference detected:', newValue, 'contains', currentCellAddress);\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#CYCLE!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n return;\n }\n\n // 首先设置公式内容\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 获取计算结果\n const result = formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // // 检查当前单元格是否正在编辑(是否在公式栏中编辑)\n // const formulaInput = this.formulaManager.inputingElement;\n // const isEditing = document.activeElement === formulaInput;\n\n // 更新单元格显示 - 如果正在编辑则显示公式,否则显示计算结果\n // activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, isEditing ? newValue : result.value);\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, result.value, true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n } catch (error) {\n console.warn('Formula processing error:', error);\n // 显示错误状态\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#ERROR!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 非公式值,同步到HyperFormula\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n }\n\n // 使用FormulaThrottle来优化公式重新计算\n const formulaThrottle = FormulaThrottle.getInstance();\n // 判断是否需要立即更新\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n if (needImmediateUpdate) {\n // 更新依赖的公式\n const dependents = formulaManager.getCellDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n // 重新计算依赖该单元格的所有公式\n dependents.forEach(dependent => {\n const result = formulaManager.getCellValue(dependent);\n if (activeWorkSheet) {\n activeWorkSheet.setCellValue(dependent.row, dependent.col, result.value);\n }\n });\n // 立即执行完整重新计算\n formulaThrottle.immediateRebuildAndRecalculate(formulaManager);\n } else {\n // 使用节流方式进行公式计算\n formulaThrottle.throttledRebuildAndRecalculate(formulaManager);\n }\n\n // // 如果当前编辑的单元格就是选中的单元格,更新 fx 输入框\n // const selection = this.activeWorkSheet.getSelection();\n // if (selection && selection.startRow === event.row && selection.startCol === event.col) {\n // this.updateFormulaBar();\n // }\n } catch (error) {\n console.error('Error in handleCellValueChanged:', error);\n }\n }\n\n /**\n * 处理范围选择模式下的单元格选中事件\n */\n handleSelectionChangedForRangeMode(event: any): void {\n console.log('handleSelectionChangedForRangeMode', event);\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaWorkingOnCell = this.formulaManager.formulaWorkingOnCell;\n const formulaManager = this.formulaManager.sheet.formulaManager;\n if (!activeWorkSheet || !formulaWorkingOnCell) {\n return;\n }\n\n // const formulaInput = this.formulaInput;\n const formulaInput = this.formulaManager.inputingElement;\n // if (!formulaInput || this.formulaManager.isUpdatingFromFormula) {\n // return;\n // }\n // TODO 尝试全部去掉isUpdatingFromFormula的判断和赋值\n if (!formulaInput) {\n return;\n }\n\n // 不依赖 event.type 字符串,selection-end 已在上层绑定,这里直接处理\n\n this.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n if (document.activeElement !== formulaInput) {\n formulaInput.focus();\n }\n\n // 获取所有选择范围(支持Ctrl/Cmd多选)\n const selections = activeWorkSheet.getMultipleSelections();\n const todoSelection = selections[selections.length - 1];\n let isCtrlAddSelection = false;\n if (selections?.length > formulaManager.lastSelectionRangesOfHandling?.length) {\n isCtrlAddSelection = true;\n }\n formulaManager.lastSelectionRangesOfHandling = selections;\n if (!selections || selections.length === 0) {\n return;\n }\n\n // 排除当前编辑单元格,避免形成自引用导致 #CYCLE!\n const editCell = formulaManager.formulaWorkingOnCell;\n // const safeSelections = selections\n // .map(selection => this.excludeEditCellFromSelection(selection, editCell?.row || 0, editCell?.col || 0))\n // .filter(selection => selection.startRow >= 0 && selection.startCol >= 0); // 过滤掉无效选择\n const safeSelections = this.formulaManager.sheet.excludeEditCellFromSelection(\n todoSelection,\n editCell?.row || 0,\n editCell?.col || 0\n );\n\n this.handleSelectionChanged([safeSelections], formulaInput, isCtrlAddSelection, (row: number, col: number) =>\n activeWorkSheet!.addressFromCoord(row, col)\n );\n\n // 写入后不再刷新公式栏,以免覆盖刚插入的引用\n }\n\n /**\n * 检查单元格是否有公式依赖\n * @param cell 单元格\n * @returns 是否有公式依赖\n */\n private hasFormulaDependents(cell: FormulaCell): boolean {\n try {\n const dependents = this.formulaManager.getCellDependents(cell);\n return dependents.length > 0;\n } catch (error) {\n console.warn('Error checking formula dependents:', error);\n return false;\n }\n }\n\n /**\n * 确保光标位置在输入框的可视区域内\n * @param input 输入框元素\n * @param cursorPos 光标位置\n */\n private ensureCursorVisible(input: HTMLInputElement, cursorPos: number): void {\n // 创建一个临时元素来计算光标位置\n const tempSpan = document.createElement('span');\n const inputStyle = window.getComputedStyle(input);\n\n // 复制输入框的样式到临时元素\n tempSpan.style.font = inputStyle.font;\n tempSpan.style.letterSpacing = inputStyle.letterSpacing;\n tempSpan.style.position = 'absolute';\n tempSpan.style.visibility = 'hidden';\n tempSpan.style.whiteSpace = 'pre';\n\n // 设置文本内容为光标位置前的文本\n tempSpan.textContent = input.value.substring(0, cursorPos);\n document.body.appendChild(tempSpan);\n\n // 计算光标位置\n const cursorOffset = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n // 计算可视区域\n const inputScrollLeft = input.scrollLeft;\n const inputWidth = input.clientWidth;\n const paddingLeft = parseFloat(inputStyle.paddingLeft);\n const paddingRight = parseFloat(inputStyle.paddingRight);\n const visibleWidth = inputWidth - paddingLeft - paddingRight;\n\n // 调整滚动位置确保光标可见\n if (cursorOffset < inputScrollLeft + paddingLeft) {\n // 光标在可视区域左侧\n input.scrollLeft = Math.max(0, cursorOffset - paddingLeft);\n } else if (cursorOffset > inputScrollLeft + visibleWidth) {\n // 光标在可视区域右侧\n input.scrollLeft = cursorOffset - visibleWidth + paddingRight;\n }\n }\n\n release(): void {\n //do nothing\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-range-selector.ts"],"names":[],"mappings":"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","file":"formula-range-selector.js","sourcesContent":["/**\n * 公式范围选择器\n * 实现Excel风格的公式输入体验:用户输入\"=sum(\"后,选择单元格范围自动插入A1引用\n */\n\nimport { FormulaThrottle } from './formula-throttle';\nimport type { FormulaManager } from '../managers/formula-manager';\nimport type { CellRange, CellValueChangedEvent, FormulaCell } from '../ts-types';\nimport { detectFunctionParameterPosition } from './formula-helper';\n\nexport interface FunctionParamPosition {\n start: number;\n end: number;\n}\n\nexport class FormulaRangeSelector {\n private formulaManager: FormulaManager;\n constructor(formulaManager: FormulaManager) {\n this.formulaManager = formulaManager;\n }\n\n /**\n * 将选择范围转换为A1格式\n * @param selections 选择范围数组\n * @param addressFromCoord 坐标转地址函数\n * @returns A1格式字符串\n */\n selectionsToA1Notation(selections: any[], addressFromCoord: (row: number, col: number) => string): string {\n if (!selections || selections.length === 0) {\n return '';\n }\n\n const ranges: string[] = [];\n\n for (const range of selections) {\n const startAddr = addressFromCoord(range.startRow, range.startCol);\n const endAddr = addressFromCoord(range.endRow, range.endCol);\n\n // 如果是单个单元格(start和end相同)\n if (range.startRow === range.endRow && range.startCol === range.endCol) {\n ranges.push(startAddr);\n } else {\n // 如果是范围,使用冒号分隔\n ranges.push(`${startAddr}:${endAddr}`);\n }\n }\n\n return ranges.join(',');\n }\n\n insertA1ReferenceInFunction(formulaInput: HTMLInputElement, a1Notation: string, isCtrlAddSelection: boolean): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n const currentValue = formulaInput.value;\n const cursorPos = this.formulaManager.lastKnownCursorPosInFormulaInput;\n\n // 找到当前光标所处的参数位置\n const argPosition = this.findCurrentArgumentPosition(currentValue, cursorPos);\n\n // 在函数参数位置插入或替换A1引用\n let newValue;\n\n if (argPosition) {\n if (isCtrlAddSelection) {\n // Ctrl模式:追加而非替换\n const currentArg = currentValue.substring(argPosition.start, argPosition.end).trim();\n\n if (currentArg) {\n // 如果当前参数不为空,追加逗号和新引用\n newValue =\n currentValue.slice(0, argPosition.end) +\n (currentValue[argPosition.end - 1] === ',' ? ' ' : ', ') +\n a1Notation +\n currentValue.slice(argPosition.end);\n } else {\n // 如果当前参数为空,直接插入新引用\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 替换模式:完全替换当前参数\n newValue = currentValue.slice(0, argPosition.start) + a1Notation + currentValue.slice(argPosition.end);\n }\n } else {\n // 防止newValue未定义\n newValue = currentValue;\n }\n\n formulaInput.value = newValue;\n // 首先设置公式内容\n this.formulaManager.setCellContent(\n {\n sheet: this.formulaManager.sheet.getActiveSheet().getKey(),\n row: this.formulaManager.sheet.getActiveSheet().editingCell.row,\n col: this.formulaManager.sheet.getActiveSheet().editingCell.col\n },\n newValue\n );\n // 设置光标位置到插入内容之后\n const newCursorPos = isCtrlAddSelection\n ? this.formulaManager.lastKnownCursorPosInFormulaInput + (newValue.length - currentValue.length)\n : argPosition\n ? argPosition.start + a1Notation.length\n : cursorPos;\n\n formulaInput.setSelectionRange(newCursorPos, newCursorPos);\n setTimeout(() => {\n // 确保光标位置在可视区域内\n this.ensureCursorVisible(formulaInput, newCursorPos);\n });\n // 更新函数参数位置\n this.formulaManager.inputIsParamMode.functionParamPosition = {\n start: newCursorPos,\n end: newCursorPos\n };\n\n // 触发输入事件以更新高亮\n const inputEvent = new Event('input', { bubbles: true });\n Object.defineProperty(inputEvent, 'isFormulaInsertion', { value: true });\n formulaInput.dispatchEvent(inputEvent);\n }\n /**\n * 找到光标所在的参数位置\n * @param formula 公式文本\n * @param cursorPos 光标位置\n * @returns 参数的起始和结束位置\n */\n private findCurrentArgumentPosition(formula: string, cursorPos: number): { start: number; end: number } | null {\n // 首先检查光标是否在操作符后面\n if (cursorPos > 1 && cursorPos <= formula.length) {\n const prevChar = formula[cursorPos - 1];\n if (['+', '-', '*', '/', '=', '>', '<', '&', '|', '^'].includes(prevChar)) {\n // 光标在操作符后面,将光标位置视为参数的起始和结束位置\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n }\n\n // 检查公式是否包含括号\n if (!formula.includes('(')) {\n return null;\n }\n\n // 从后向前查找最接近光标的左括号\n let lastOpenParenBeforeCursor = -1;\n let nestLevel = 0;\n let inQuote = false;\n\n // 第一阶段:找到光标所在的函数调用\n for (let i = 0; i < cursorPos; i++) {\n const char = formula[i];\n\n // 处理引号内的内容\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n\n // 如果在引号内,忽略所有特殊字符\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n lastOpenParenBeforeCursor = i;\n } else if (char === ')') {\n nestLevel--;\n }\n }\n\n // 如果没有找到左括号或者光标不在任何括号内\n if (lastOpenParenBeforeCursor === -1 || nestLevel <= 0) {\n // 检查是否在公式开始位置\n if (formula.startsWith('=') && cursorPos === 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n return null;\n }\n\n // 特殊处理:光标恰好在左括号后面\n if (cursorPos === lastOpenParenBeforeCursor + 1) {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 特殊处理:光标在逗号后面\n if (cursorPos > 0 && formula[cursorPos - 1] === ',') {\n return {\n start: cursorPos,\n end: cursorPos\n };\n }\n\n // 找到当前参数的起始位置\n let argumentStart = lastOpenParenBeforeCursor + 1;\n let argumentEnd = cursorPos;\n\n // 重置状态\n nestLevel = 1; // 从左括号开始,嵌套级别为1\n inQuote = false;\n\n // 从找到的左括号位置向光标方向扫描,找到当前参数的起始位置\n for (let i = argumentStart; i < cursorPos; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n if (nestLevel === 0) {\n // 如果回到了函数最外层,则这个右括号后面的内容不再是当前函数的参数\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 如果是当前函数层级的参数分隔符,更新参数开始位置\n argumentStart = i + 1;\n }\n }\n\n // 重置状态,准备从光标位置向后扫描\n nestLevel = 0;\n inQuote = false;\n\n // 重新计算光标位置的嵌套级别\n for (let i = 0; i < cursorPos; i++) {\n if (formula[i] === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (formula[i] === '(') {\n nestLevel++;\n }\n if (formula[i] === ')') {\n nestLevel--;\n }\n }\n\n // 从光标位置向后查找参数结束位置\n argumentEnd = formula.length;\n for (let i = cursorPos; i < formula.length; i++) {\n const char = formula[i];\n\n if (char === '\"' && (i === 0 || formula[i - 1] !== '\\\\')) {\n inQuote = !inQuote;\n continue;\n }\n if (inQuote) {\n continue;\n }\n\n if (char === '(') {\n nestLevel++;\n } else if (char === ')') {\n nestLevel--;\n // 如果回到了当前函数的右括号\n if (nestLevel === 0) {\n argumentEnd = i;\n break;\n }\n } else if (char === ',' && nestLevel === 1) {\n // 找到下一个同级参数的分隔符\n argumentEnd = i;\n break;\n }\n }\n\n // 处理空参数的情况\n const paramContentBefore = formula.substring(argumentStart, cursorPos).trim();\n const paramContentAfter = formula.substring(cursorPos, argumentEnd).trim();\n\n if (paramContentBefore === '' && cursorPos === argumentStart) {\n // 光标在参数起始位置,且参数为空\n return {\n start: argumentStart,\n end: argumentStart\n };\n }\n\n if (paramContentAfter === '' && cursorPos < argumentEnd) {\n // 光标后面到结束位置都是空白\n argumentEnd = cursorPos;\n }\n\n return {\n start: argumentStart,\n end: argumentEnd\n };\n }\n /**\n * 处理单元格选择变化\n * @param selections 当前选择范围\n * @param formulaInput 公式输入框\n * @param addressFromCoord 坐标转地址函数\n */\n private handleSelectionChanged(\n selections: CellRange[],\n formulaInput: HTMLInputElement,\n isCtrlAddSelection: boolean,\n addressFromCoord: (row: number, col: number) => string\n ): void {\n if (!this.formulaManager.inputIsParamMode.inParamMode || !selections || selections.length === 0) {\n return;\n }\n\n const a1Notation = this.selectionsToA1Notation(selections, addressFromCoord);\n if (a1Notation) {\n this.insertA1ReferenceInFunction(formulaInput, a1Notation, isCtrlAddSelection);\n }\n }\n\n /**\n * 处理单元格值变更事件\n * @param event 事件\n */\n handleCellValueChanged(event: CellValueChangedEvent): void {\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaManager = this.formulaManager.sheet.formulaManager;\n\n if (!activeWorkSheet || this.formulaManager.formulaWorkingOnCell) {\n return;\n }\n\n try {\n // 检查新输入的值是否为公式\n const newValue = event.newValue;\n if (typeof newValue === 'string' && newValue.startsWith('=') && newValue.length > 1) {\n try {\n // 检查是否包含循环引用\n const currentCellAddress = activeWorkSheet.addressFromCoord(event.row, event.col);\n // 使用正则表达式来精确匹配单元格引用\n const cellRegex = new RegExp(`(^|[^A-Za-z0-9])${currentCellAddress}([^A-Za-z0-9]|$)`);\n if (cellRegex.test(newValue)) {\n console.warn('Circular reference detected:', newValue, 'contains', currentCellAddress);\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#CYCLE!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n return;\n }\n\n // 首先设置公式内容\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 获取计算结果\n const result = formulaManager.getCellValue({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // // 检查当前单元格是否正在编辑(是否在公式栏中编辑)\n // const formulaInput = this.formulaManager.inputingElement;\n // const isEditing = document.activeElement === formulaInput;\n\n // 更新单元格显示 - 如果正在编辑则显示公式,否则显示计算结果\n // activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, isEditing ? newValue : result.value);\n // 不触发事件,避免无限循环 - 我们将在updateDependentCellsCascade中处理所有依赖\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, result.value, false, false);\n this.formulaManager.formulaWorkingOnCell = null;\n } catch (error) {\n console.warn('Formula processing error:', error);\n // 显示错误状态\n activeWorkSheet.tableInstance?.changeCellValue(event.col, event.row, '#ERROR!', true, false);\n this.formulaManager.formulaWorkingOnCell = null;\n }\n } else {\n // 非公式值,同步到FormulaEngine (MIT兼容)\n formulaManager.setCellContent(\n {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n },\n newValue\n );\n\n // 检查是否需要级联更新依赖单元格\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n if (needImmediateUpdate) {\n // 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n }\n }\n\n // 使用FormulaThrottle来优化公式重新计算\n const formulaThrottle = FormulaThrottle.getInstance();\n\n // 判断是否需要立即更新(检查是否有依赖该单元格的公式)\n const needImmediateUpdate = this.hasFormulaDependents({\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n\n if (needImmediateUpdate) {\n // 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n this.updateDependentCellsCascade(activeWorkSheet, formulaManager, {\n sheet: activeWorkSheet.getKey(),\n row: event.row,\n col: event.col\n });\n // 立即执行完整重新计算\n formulaThrottle.immediateRebuildAndRecalculate(formulaManager);\n } else {\n // 使用节流方式进行公式计算(用于没有依赖的情况)\n formulaThrottle.throttledRebuildAndRecalculate(formulaManager);\n }\n\n // // 如果当前编辑的单元格就是选中的单元格,更新 fx 输入框\n // const selection = this.activeWorkSheet.getSelection();\n // if (selection && selection.startRow === event.row && selection.startCol === event.col) {\n // this.updateFormulaBar();\n // }\n } catch (error) {\n console.error('Error in handleCellValueChanged:', error);\n }\n }\n\n /**\n * 处理范围选择模式下的单元格选中事件\n */\n handleSelectionChangedForRangeMode(event: any): void {\n const activeWorkSheet = this.formulaManager.sheet.getActiveSheet();\n const formulaWorkingOnCell = this.formulaManager.formulaWorkingOnCell;\n const formulaManager = this.formulaManager.sheet.formulaManager;\n if (!activeWorkSheet || !formulaWorkingOnCell) {\n return;\n }\n\n // const formulaInput = this.formulaInput;\n const formulaInput = this.formulaManager.inputingElement;\n // if (!formulaInput || this.formulaManager.isUpdatingFromFormula) {\n // return;\n // }\n // TODO 尝试全部去掉isUpdatingFromFormula的判断和赋值\n if (!formulaInput) {\n return;\n }\n\n // 不依赖 event.type 字符串,selection-end 已在上层绑定,这里直接处理\n\n this.formulaManager.inputIsParamMode = detectFunctionParameterPosition(\n formulaInput.value,\n this.formulaManager.lastKnownCursorPosInFormulaInput\n );\n if (!this.formulaManager.inputIsParamMode.inParamMode) {\n return;\n }\n\n if (document.activeElement !== formulaInput) {\n formulaInput.focus();\n }\n\n // 获取所有选择范围(支持Ctrl/Cmd多选)\n const selections = activeWorkSheet.getMultipleSelections();\n const todoSelection = selections[selections.length - 1];\n let isCtrlAddSelection = false;\n if (selections?.length > formulaManager.lastSelectionRangesOfHandling?.length) {\n isCtrlAddSelection = true;\n }\n formulaManager.lastSelectionRangesOfHandling = selections;\n if (!selections || selections.length === 0) {\n return;\n }\n\n // 排除当前编辑单元格,避免形成自引用导致 #CYCLE!\n const editCell = formulaManager.formulaWorkingOnCell;\n // const safeSelections = selections\n // .map(selection => this.excludeEditCellFromSelection(selection, editCell?.row || 0, editCell?.col || 0))\n // .filter(selection => selection.startRow >= 0 && selection.startCol >= 0); // 过滤掉无效选择\n const safeSelections = this.formulaManager.sheet.excludeEditCellFromSelection(\n todoSelection,\n editCell?.row || 0,\n editCell?.col || 0\n );\n\n this.handleSelectionChanged([safeSelections], formulaInput, isCtrlAddSelection, (row: number, col: number) =>\n activeWorkSheet!.addressFromCoord(row, col)\n );\n\n // 写入后不再刷新公式栏,以免覆盖刚插入的引用\n }\n\n /**\n * 检查单元格是否有公式依赖\n * @param cell 单元格\n * @returns 是否有公式依赖\n */\n private hasFormulaDependents(cell: FormulaCell): boolean {\n try {\n const dependents = this.formulaManager.getCellDependents(cell);\n return dependents.length > 0;\n } catch (error) {\n console.warn('Error checking formula dependents:', error);\n return false;\n }\n }\n\n /**\n * 使用FormulaEngine的依赖管理进行级联更新 (MIT兼容)\n * @param activeWorkSheet 当前工作表\n * @param formulaManager 公式管理器\n * @param changedCell 发生变化的单元格\n */\n private updateDependentCellsCascade(\n activeWorkSheet: any,\n formulaManager: FormulaManager,\n changedCell: FormulaCell\n ): void {\n try {\n // 获取所有依赖该单元格的单元格(包括间接依赖)\n const allDependents = this.getAllDependentsRecursive(formulaManager, changedCell);\n\n if (allDependents.length === 0) {\n return;\n }\n\n // 按依赖顺序排序(确保依赖项先被更新)\n const sortedDependents = this.sortCellsByDependencyOrder(formulaManager, allDependents);\n\n // 批量更新所有依赖单元格\n for (const dependent of sortedDependents) {\n const result = formulaManager.getCellValue(dependent);\n if (result && activeWorkSheet) {\n // 更新单元格显示值,但不触发事件(避免无限循环)\n activeWorkSheet.tableInstance?.changeCellValue(\n dependent.col,\n dependent.row,\n result.value,\n false, // workOnEditableCell: allow editing any cell\n false // triggerEvent: don't fire events to avoid infinite loops\n );\n }\n }\n } catch (error) {\n console.error('Error in updateDependentCellsCascade:', error);\n }\n }\n\n /**\n * 递归获取所有依赖单元格(包括间接依赖)\n * @param formulaManager 公式管理器\n * @param cell 起始单元格\n * @param visited 已访问的单元格(防止循环)\n * @returns 所有依赖单元格\n */\n private getAllDependentsRecursive(\n formulaManager: FormulaManager,\n cell: FormulaCell,\n visited: Set<string> = new Set()\n ): FormulaCell[] {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n\n // 防止循环依赖\n if (visited.has(cellKey)) {\n return [];\n }\n visited.add(cellKey);\n\n const directDependents = formulaManager.getCellDependents(cell);\n let allDependents: FormulaCell[] = [...directDependents];\n\n // 递归获取间接依赖\n for (const dependent of directDependents) {\n const indirectDependents = this.getAllDependentsRecursive(formulaManager, dependent, visited);\n allDependents = allDependents.concat(indirectDependents);\n }\n\n return allDependents;\n }\n\n /**\n * 按依赖顺序对单元格进行排序\n * @param formulaManager 公式管理器\n * @param cells 要排序的单元格\n * @returns 排序后的单元格\n */\n private sortCellsByDependencyOrder(formulaManager: FormulaManager, cells: FormulaCell[]): FormulaCell[] {\n // 创建一个依赖图\n const dependencyGraph = new Map<string, Set<string>>();\n\n // 为每个单元格构建依赖关系\n for (const cell of cells) {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n const precedents = formulaManager.getCellPrecedents(cell);\n\n const dependencies = new Set<string>();\n for (const precedent of precedents) {\n const precedentKey = `${precedent.sheet}!${precedent.row},${precedent.col}`;\n dependencies.add(precedentKey);\n }\n\n dependencyGraph.set(cellKey, dependencies);\n }\n\n // 使用拓扑排序确保依赖项先被处理\n const sorted: FormulaCell[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (cell: FormulaCell) => {\n const cellKey = `${cell.sheet}!${cell.row},${cell.col}`;\n\n if (visited.has(cellKey)) {\n return;\n }\n\n if (visiting.has(cellKey)) {\n // 检测到循环依赖,跳过\n console.warn('Circular dependency detected:', cellKey);\n return;\n }\n\n visiting.add(cellKey);\n\n // 先访问依赖项\n const dependencies = dependencyGraph.get(cellKey) || new Set();\n for (const depKey of Array.from(dependencies)) {\n const depCell = cells.find(c => `${c.sheet}!${c.row},${c.col}` === depKey);\n if (depCell) {\n visit(depCell);\n }\n }\n\n visiting.delete(cellKey);\n visited.add(cellKey);\n sorted.push(cell);\n };\n\n // 对所有单元格进行排序\n for (const cell of cells) {\n if (!visited.has(`${cell.sheet}!${cell.row},${cell.col}`)) {\n visit(cell);\n }\n }\n\n return sorted;\n }\n\n /**\n * 确保光标位置在输入框的可视区域内\n * @param input 输入框元素\n * @param cursorPos 光标位置\n */\n private ensureCursorVisible(input: HTMLInputElement, cursorPos: number): void {\n // 创建一个临时元素来计算光标位置\n const tempSpan = document.createElement('span');\n const inputStyle = window.getComputedStyle(input);\n\n // 复制输入框的样式到临时元素\n tempSpan.style.font = inputStyle.font;\n tempSpan.style.letterSpacing = inputStyle.letterSpacing;\n tempSpan.style.position = 'absolute';\n tempSpan.style.visibility = 'hidden';\n tempSpan.style.whiteSpace = 'pre';\n\n // 设置文本内容为光标位置前的文本\n tempSpan.textContent = input.value.substring(0, cursorPos);\n document.body.appendChild(tempSpan);\n\n // 计算光标位置\n const cursorOffset = tempSpan.offsetWidth;\n document.body.removeChild(tempSpan);\n\n // 计算可视区域\n const inputScrollLeft = input.scrollLeft;\n const inputWidth = input.clientWidth;\n const paddingLeft = parseFloat(inputStyle.paddingLeft);\n const paddingRight = parseFloat(inputStyle.paddingRight);\n const visibleWidth = inputWidth - paddingLeft - paddingRight;\n\n // 调整滚动位置确保光标可见\n if (cursorOffset < inputScrollLeft + paddingLeft) {\n // 光标在可视区域左侧\n input.scrollLeft = Math.max(0, cursorOffset - paddingLeft);\n } else if (cursorOffset > inputScrollLeft + visibleWidth) {\n // 光标在可视区域右侧\n input.scrollLeft = cursorOffset - visibleWidth + paddingRight;\n }\n }\n\n release(): void {\n //do nothing\n }\n}\n"]}