@visactor/vtable-sheet 1.21.1 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/core/WorkSheet.d.ts +2 -1
- package/cjs/core/WorkSheet.js +46 -9
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/formula/formula-engine.d.ts +13 -0
- package/cjs/formula/formula-engine.js +206 -3
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +6 -6
- package/cjs/managers/formula-manager.js +61 -8
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/ts-types/sheet.d.ts +0 -1
- package/cjs/ts-types/sheet.js.map +1 -1
- package/dist/vtable-sheet.js +796 -187
- package/dist/vtable-sheet.min.js +1 -1
- package/es/core/WorkSheet.d.ts +2 -1
- package/es/core/WorkSheet.js +46 -9
- package/es/core/WorkSheet.js.map +1 -1
- package/es/formula/formula-engine.d.ts +13 -0
- package/es/formula/formula-engine.js +206 -3
- package/es/formula/formula-engine.js.map +1 -1
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +6 -6
- package/es/managers/formula-manager.js +61 -8
- package/es/managers/formula-manager.js.map +1 -1
- package/es/ts-types/sheet.d.ts +0 -1
- package/es/ts-types/sheet.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +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"]}
|
|
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 this.sheetData.set(sheetId, sheetData);\n\n return sheetId;\n }\n updateSheetData(sheetKey: string, data: unknown[][]): void {\n const sheetId = this.sheets.get(sheetKey);\n if (sheetId !== undefined && sheetId !== null) {\n this.sheetData.set(sheetId, data);\n }\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 /**\n * 获取单元格的公式字符串\n */\n getFormulaString(cell: FormulaCell): string | null {\n const cellKey = this.getCellKey(cell);\n return this.formulaCells.get(cellKey) || null;\n }\n\n /**\n * 清除指定单元格的依赖关系\n */\n private clearDependencies(cellKey: 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 // 清除该单元格的依赖记录\n this.dependencies.delete(cellKey);\n }\n\n /**\n * 设置单元格内容但不更新依赖关系(用于批量操作)\n */\n private setCellContentWithoutDependencyUpdate(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 let processedValue = value;\n\n // 处理空值\n if (processedValue === null || processedValue === undefined) {\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 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 // 检查是否包含#REF!错误\n if (expression.includes('#REF!')) {\n return { value: '#REF!', error: undefined };\n }\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 /**\n * 调整公式引用 - 当插入或删除行/列时 (MIT兼容)\n * @param sheetKey 工作表键\n * @param type 调整类型 ('insert' | 'delete')\n * @param dimension 维度 ('row' | 'column')\n * @param index 插入/删除的位置索引\n * @param count 插入/删除的数量\n */\n adjustFormulaReferences(\n sheetKey: string,\n type: 'insert' | 'delete',\n dimension: 'row' | 'column',\n index: number,\n count: number,\n totalColCount: number,\n totalRowCount: number\n ): { adjustedCells: FormulaCell[]; movedCells: FormulaCell[] } {\n try {\n const adjustedFormulas: Array<{ cell: FormulaCell; oldFormula: string; newFormula: string }> = [];\n const movedFormulas: Array<{ oldCellKey: string; newCell: FormulaCell; formula: string }> = [];\n const deletedCells: Set<string> = new Set();\n\n // 第一步:收集被删除的单元格\n if (type === 'delete') {\n for (let i = 0; i < count; i++) {\n if (dimension === 'row') {\n // 收集被删除行的所有单元格\n for (let col = 0; col < totalColCount; col++) {\n // 假设最大1000列\n const deletedCell = { sheet: sheetKey, row: index + i, col };\n const deletedCellKey = this.getCellKey(deletedCell);\n deletedCells.add(deletedCellKey);\n }\n } else if (dimension === 'column') {\n // 收集被删除列的所有单元格\n for (let row = 0; row < totalRowCount; row++) {\n // 假设最大100万行\n const deletedCell = { sheet: sheetKey, row, col: index + i };\n const deletedCellKey = this.getCellKey(deletedCell);\n deletedCells.add(deletedCellKey);\n }\n }\n }\n }\n\n // 第二步:处理公式单元格\n for (const [cellKey, formula] of Array.from(this.formulaCells.entries())) {\n const cell = this.parseCellKey(cellKey);\n if (!cell || cell.sheet !== sheetKey) {\n continue; // 跳过其他工作表的公式\n }\n\n // 检查公式单元格本身是否需要移动\n const newCell = { ...cell };\n let cellNeedsMove = false;\n\n if (dimension === 'row') {\n if (type === 'insert' && cell.row >= index) {\n // 插入行:在插入点之后的单元格需要向后移动\n newCell.row = cell.row + count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.row > index) {\n // 删除行:在删除点之后的单元格需要向前移动\n newCell.row = cell.row - count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.row >= index && cell.row < index + count) {\n // 删除的行:这些公式单元格将被删除\n this.formulaCells.delete(cellKey);\n continue;\n }\n } else if (dimension === 'column') {\n if (type === 'insert' && cell.col >= index) {\n // 插入列:在插入点之后的单元格需要向后移动\n newCell.col = cell.col + count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.col > index) {\n // 删除列:在删除点之后的单元格需要向前移动\n newCell.col = cell.col - count;\n cellNeedsMove = true;\n } else if (type === 'delete' && cell.col >= index && cell.col < index + count) {\n // 删除的列:这些公式单元格将被删除\n this.formulaCells.delete(cellKey);\n continue;\n }\n }\n\n // 调整公式引用,传入被删除的单元格信息\n const newFormula = this.adjustFormulaReference(formula, type, dimension, index, count);\n\n if (cellNeedsMove) {\n // 如果单元格位置发生变化,需要移动公式\n // 注意:公式中的引用已经根据操作类型调整了,这是正确的\n movedFormulas.push({ oldCellKey: cellKey, newCell, formula: newFormula });\n // 删除旧的公式条目和依赖关系\n this.formulaCells.delete(cellKey);\n this.clearDependencies(cellKey);\n } else if (newFormula !== formula) {\n // 如果只有公式引用发生变化,更新原单元格\n adjustedFormulas.push({ cell, oldFormula: formula, newFormula });\n // 清除旧的依赖关系,将在批量更新时重新建立\n this.clearDependencies(cellKey);\n }\n }\n\n // 处理移动的公式\n for (const { newCell, formula } of movedFormulas) {\n const newCellKey = this.getCellKey(newCell);\n this.formulaCells.set(newCellKey, formula);\n // 重新建立依赖关系\n this.updateDependencies(newCellKey, formula);\n // 更新单元格内容但不重新计算依赖(因为已经更新了)\n this.setCellContentWithoutDependencyUpdate(newCell, formula);\n }\n\n // 批量更新调整后的公式\n for (const { cell, newFormula } of adjustedFormulas) {\n const cellKey = this.getCellKey(cell);\n // 更新公式存储\n this.formulaCells.set(cellKey, newFormula);\n // 更新依赖关系\n this.updateDependencies(cellKey, newFormula);\n // 更新单元格内容但不重新计算依赖(因为已经更新了)\n this.setCellContentWithoutDependencyUpdate(cell, newFormula);\n }\n\n const totalChanges = adjustedFormulas.length + movedFormulas.length;\n if (totalChanges > 0) {\n // console.log(\n // `Adjusted ${adjustedFormulas.length} formulas and moved ${movedFormulas.length} ` +\n // `formulas for ${type} ${dimension} at ${index}`\n // );\n }\n\n // 返回所有受影响的单元格\n const adjustedCells = adjustedFormulas.map(item => item.cell);\n const movedCells = movedFormulas.map(item => item.newCell);\n\n return { adjustedCells, movedCells };\n } catch (error) {\n console.error(`Failed to adjust formula references for ${type} ${dimension} at ${index}:`, error);\n return { adjustedCells: [], movedCells: [] };\n }\n }\n\n /**\n * 调整单个公式引用 (MIT兼容)\n * @param formula 原公式\n * @param type 调整类型 ('insert' | 'delete')\n * @param dimension 维度 ('row' | 'column')\n * @param index 插入/删除的位置索引\n * @param count 插入/删除的数量\n * @returns 调整后的公式\n */\n private adjustFormulaReference(\n formula: string,\n type: 'insert' | 'delete',\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): string {\n if (!formula || !formula.startsWith('=')) {\n return formula;\n }\n\n const expression = formula.substring(1);\n\n // 使用正则表达式匹配单元格引用 (A1, B2, 等) 和范围引用 (A1:B2)\n const cellRefRegex = /([A-Z]+)([0-9]+)/g;\n const rangeRefRegex = /([A-Z]+[0-9]+):([A-Z]+[0-9]+)/g;\n\n let newExpression = expression;\n let match: RegExpExecArray | null;\n const replacements: Array<{ start: number; end: number; replacement: string }> = [];\n\n // 首先处理范围引用\n while ((match = rangeRefRegex.exec(expression)) !== null) {\n const fullRangeMatch = match[0];\n const startCell = match[1];\n const endCell = match[2];\n\n if (type === 'delete') {\n // 检查范围是否包含被删除的单元格\n const rangeContainsDeletedCells = this.rangeContainsDeletedCells(startCell, endCell, dimension, index, count);\n\n if (rangeContainsDeletedCells) {\n // 范围包含被删除的单元格,需要调整范围\n const newRange = this.adjustRangeForDeletion(startCell, endCell, dimension, index, count);\n if (newRange !== fullRangeMatch) {\n replacements.push({\n start: match.index,\n end: match.index + fullRangeMatch.length,\n replacement: newRange\n });\n }\n }\n }\n }\n\n // 重置正则表达式,避免与范围引用冲突\n cellRefRegex.lastIndex = 0;\n\n while ((match = cellRefRegex.exec(expression)) !== null) {\n const fullMatch = match[0];\n const colLetters = match[1];\n const rowNumber = parseInt(match[2], 10);\n\n // 检查这个单元格引用是否已经被范围引用处理过\n const currentMatchIndex = match.index;\n const isPartOfRange = replacements.some(\n replacement => currentMatchIndex >= replacement.start && currentMatchIndex < replacement.end\n );\n\n if (isPartOfRange) {\n continue;\n }\n\n let needsAdjustment = false;\n let newRowNumber = rowNumber;\n let newColLetters = colLetters;\n const isDeletedCell = false;\n\n if (dimension === 'row') {\n // Convert 1-based row number to 0-based for comparison\n const zeroBasedRowNumber = rowNumber - 1;\n\n if (type === 'insert' && zeroBasedRowNumber >= index) {\n // 插入行:在插入点之后的行需要向后移动\n newRowNumber = rowNumber + count;\n needsAdjustment = true;\n } else if (type === 'delete' && zeroBasedRowNumber >= index) {\n // 删除行:在删除点及之后的行需要向前移动\n if (zeroBasedRowNumber >= index + count) {\n // 完全在删除范围之后的行\n newRowNumber = rowNumber - count;\n needsAdjustment = true;\n } else if (zeroBasedRowNumber >= index && zeroBasedRowNumber < index + count) {\n // 在删除范围内的行:需要调整到删除前的位置\n newRowNumber = index; // 调整到删除位置(即原来的位置-1)\n needsAdjustment = true;\n }\n }\n } else if (dimension === 'column') {\n const colIndex = this.columnLettersToIndex(colLetters);\n\n if (type === 'insert' && colIndex >= index) {\n // 插入列:在插入点之后的列需要向后移动\n newColLetters = this.indexToColumnLetters(colIndex + count);\n needsAdjustment = true;\n } else if (type === 'delete' && colIndex >= index) {\n // 删除列:在删除点及之后的列需要向前移动\n if (colIndex >= index + count) {\n // 完全在删除范围之后的列\n newColLetters = this.indexToColumnLetters(colIndex - count);\n needsAdjustment = true;\n } else if (colIndex >= index && colIndex < index + count) {\n // 在删除范围内的列:需要调整到删除前的位置\n newColLetters = this.indexToColumnLetters(index); // 调整到删除位置\n needsAdjustment = true;\n }\n }\n }\n if (needsAdjustment) {\n let replacement: string;\n if (dimension === 'row' && newRowNumber === index) {\n // 行被调整到删除位置,表示该行被删除\n replacement = '#REF!';\n } else if (\n dimension === 'column' &&\n this.indexToColumnLetters(this.columnLettersToIndex(newColLetters)) === this.indexToColumnLetters(index)\n ) {\n // 列被调整到删除位置,表示该列被删除\n replacement = '#REF!';\n } else {\n replacement = newColLetters + newRowNumber;\n }\n replacements.push({\n start: match.index,\n end: match.index + fullMatch.length,\n replacement: replacement\n });\n }\n }\n\n // 按位置倒序排序,以便从后向前替换\n replacements.sort((a, b) => b.start - a.start);\n\n // 执行替换\n for (const { start, end, replacement } of replacements) {\n newExpression = newExpression.substring(0, start) + replacement + newExpression.substring(end);\n }\n\n return '=' + newExpression;\n }\n\n /**\n * 将列字母转换为索引 (A=0, B=1, ..., Z=25, AA=26, 等) (MIT兼容)\n * @param letters 列字母\n * @returns 列索引\n */\n private columnLettersToIndex(letters: string): number {\n let index = 0;\n for (let i = 0; i < letters.length; i++) {\n index = index * 26 + (letters.charCodeAt(i) - 64); // A=1, B=2, etc.\n }\n return index - 1; // Convert to 0-based index\n }\n\n /**\n * 将列索引转换为字母 (0=A, 1=B, ..., 25=Z, 26=AA, 等) (MIT兼容)\n * @param index 列索引\n * @returns 列字母\n */\n private indexToColumnLetters(index: number): string {\n let letters = '';\n do {\n letters = String.fromCharCode(65 + (index % 26)) + letters;\n index = Math.floor(index / 26) - 1;\n } while (index >= 0);\n return letters;\n }\n\n /**\n * 检查范围是否包含被删除的单元格\n * @param startCell 范围起始单元格 (如 \"A1\")\n * @param endCell 范围结束单元格 (如 \"B2\")\n * @param dimension 删除维度 ('row' | 'column')\n * @param index 删除起始索引\n * @param count 删除数量\n * @param deletedCells 被删除的单元格集合\n * @param currentSheet 当前工作表\n * @returns 是否包含被删除的单元格\n */\n private rangeContainsDeletedCells(\n startCell: string,\n endCell: string,\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): boolean {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\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 if (dimension === 'row') {\n // 检查删除的行是否在范围内\n const deleteStartRow = index;\n const deleteEndRow = index + count - 1;\n\n // 检查是否有重叠\n if (deleteEndRow >= minRow && deleteStartRow <= maxRow) {\n return true;\n }\n } else if (dimension === 'column') {\n // 检查删除的列是否在范围内\n const deleteStartCol = index;\n const deleteEndCol = index + count - 1;\n\n // 检查是否有重叠\n if (deleteEndCol >= minCol && deleteStartCol <= maxCol) {\n return true;\n }\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * 调整范围引用以处理删除操作\n * @param startCell 范围起始单元格 (如 \"A1\")\n * @param endCell 范围结束单元格 (如 \"B2\")\n * @param dimension 删除维度 ('row' | 'column')\n * @param index 删除起始索引\n * @param count 删除数量\n * @param deletedCells 被删除的单元格集合\n * @param currentSheet 当前工作表\n * @returns 调整后的范围引用\n */\n private adjustRangeForDeletion(\n startCell: string,\n endCell: string,\n dimension: 'row' | 'column',\n index: number,\n count: number\n ): string {\n try {\n const start = this.parseA1Notation(startCell);\n const end = this.parseA1Notation(endCell);\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 let newMinRow = minRow;\n let newMaxRow = maxRow;\n let newMinCol = minCol;\n let newMaxCol = maxCol;\n\n if (dimension === 'row') {\n const deleteStartRow = index;\n const deleteEndRow = index + count - 1;\n\n // 调整起始行\n if (minRow >= deleteStartRow && minRow <= deleteEndRow) {\n // 起始行被删除 - 调整到删除前的位置\n newMinRow = deleteStartRow > 0 ? deleteStartRow - 1 : 0;\n } else if (minRow > deleteEndRow) {\n // 起始行在删除范围之后,需要向前移动\n newMinRow = minRow - count;\n if (newMinRow < 0) {\n newMinRow = 0; // 确保不为负数\n }\n }\n\n // 调整结束行\n if (maxRow >= deleteStartRow && maxRow <= deleteEndRow) {\n // 结束行被删除 - 调整到删除前的位置\n newMaxRow = deleteStartRow > 0 ? deleteStartRow - 1 : 0;\n } else if (maxRow > deleteEndRow) {\n // 结束行在删除范围之后,需要向前移动\n newMaxRow = maxRow - count;\n if (newMaxRow < 0) {\n newMaxRow = 0; // 确保不为负数\n }\n }\n\n // 检查调整后的范围是否有效\n if (newMinRow > newMaxRow) {\n return '#REF!';\n }\n } else if (dimension === 'column') {\n const deleteStartCol = index;\n const deleteEndCol = index + count - 1;\n\n // 调整起始列\n if (minCol >= deleteStartCol && minCol <= deleteEndCol) {\n // 起始列被删除 - 调整到删除前的位置\n newMinCol = deleteStartCol > 0 ? deleteStartCol - 1 : 0;\n } else if (minCol > deleteEndCol) {\n // 起始列在删除范围之后,需要向前移动\n newMinCol = minCol - count;\n if (newMinCol < 0) {\n newMinCol = 0; // 确保不为负数\n }\n }\n\n // 调整结束列\n if (maxCol >= deleteStartCol && maxCol <= deleteEndCol) {\n // 结束列被删除 - 调整到删除前的位置\n newMaxCol = deleteStartCol > 0 ? deleteStartCol - 1 : 0;\n } else if (maxCol > deleteEndCol) {\n // 结束列在删除范围之后,需要向前移动\n newMaxCol = maxCol - count;\n if (newMaxCol < 0) {\n newMaxCol = 0; // 确保不为负数\n }\n }\n\n // 检查调整后的范围是否有效\n if (newMinCol > newMaxCol) {\n return '#REF!';\n }\n\n // 如果起始列或结束列是#REF!,或者整个范围无效,返回#REF!\n if (newMinCol === -1 || newMaxCol === -1) {\n return '#REF!';\n }\n }\n\n // 如果起始和结束都是#REF!,返回#REF!\n if (\n (dimension === 'row' && newMinRow === -1 && newMaxRow === -1) ||\n (dimension === 'column' && newMinCol === -1 && newMaxCol === -1)\n ) {\n return '#REF!';\n }\n\n // 构建新的范围引用\n let newStartCell: string;\n let newEndCell: string;\n\n if (dimension === 'row') {\n if (newMinRow === -1) {\n newStartCell = '#REF!';\n } else {\n newStartCell = this.getA1Notation(newMinRow, newMinCol);\n }\n\n if (newMaxRow === -1) {\n newEndCell = '#REF!';\n } else {\n newEndCell = this.getA1Notation(newMaxRow, newMaxCol);\n }\n } else {\n if (newMinCol === -1) {\n newStartCell = '#REF!';\n } else {\n newStartCell = this.getA1Notation(newMinRow, newMinCol);\n }\n\n if (newMaxCol === -1) {\n newEndCell = '#REF!';\n } else {\n newEndCell = this.getA1Notation(newMaxRow, newMaxCol);\n }\n }\n\n // 如果起始和结束相同,返回单个单元格引用\n if (newStartCell === newEndCell) {\n return newStartCell;\n }\n\n return `${newStartCell}:${newEndCell}`;\n } catch {\n return '#REF!';\n }\n }\n}\n\nclass FormulaError {\n constructor(public message: string, public type: 'REF' | 'VALUE' | 'DIV0' | 'NAME' | 'NA' = 'VALUE') {}\n}\n"]}
|
package/cjs/index.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import VTableSheet from './components/vtable-sheet';
|
|
|
2
2
|
import type { ISheetDefine, IVTableSheetOptions } from './ts-types';
|
|
3
3
|
import * as TYPES from './ts-types';
|
|
4
4
|
import * as VTable from './vtable';
|
|
5
|
-
export declare const version = "1.
|
|
5
|
+
export declare const version = "1.22.0";
|
|
6
6
|
export { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };
|
package/cjs/index.js
CHANGED
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,QAAQ,CAAC;AAEhC,IAAA,4BAAY,GAAE,CAAC","file":"index.js","sourcesContent":["import VTableSheet from './components/vtable-sheet';\nimport type { ISheetDefine, IVTableSheetOptions } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,QAAQ,CAAC;AAEhC,IAAA,4BAAY,GAAE,CAAC","file":"index.js","sourcesContent":["import VTableSheet from './components/vtable-sheet';\nimport type { ISheetDefine, IVTableSheetOptions } from './ts-types';\nimport * as TYPES from './ts-types';\nimport * as VTable from './vtable';\nimport { importStyles } from './styles/style-manager';\nexport const version = \"1.22.0\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
|