@visactor/vtable-sheet 1.22.7 → 1.22.8-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/cjs/components/sheet-tab-event-handler.js +3 -2
  2. package/cjs/components/sheet-tab-event-handler.js.map +1 -1
  3. package/cjs/components/vtable-sheet.d.ts +2 -1
  4. package/cjs/components/vtable-sheet.js +9 -1
  5. package/cjs/components/vtable-sheet.js.map +1 -1
  6. package/cjs/core/WorkSheet.d.ts +1 -1
  7. package/cjs/core/WorkSheet.js.map +1 -1
  8. package/cjs/core/table-plugins.js +7 -5
  9. package/cjs/core/table-plugins.js.map +1 -1
  10. package/cjs/formula/cell-highlight-manager.d.ts +1 -0
  11. package/cjs/formula/cell-highlight-manager.js +27 -22
  12. package/cjs/formula/cell-highlight-manager.js.map +1 -1
  13. package/cjs/formula/cross-sheet-data-synchronizer.d.ts +48 -0
  14. package/cjs/formula/cross-sheet-data-synchronizer.js +159 -0
  15. package/cjs/formula/cross-sheet-data-synchronizer.js.map +1 -0
  16. package/cjs/formula/cross-sheet-formula-handler.d.ts +58 -0
  17. package/cjs/formula/cross-sheet-formula-handler.js +240 -0
  18. package/cjs/formula/cross-sheet-formula-handler.js.map +1 -0
  19. package/cjs/formula/cross-sheet-formula-manager.d.ts +52 -0
  20. package/cjs/formula/cross-sheet-formula-manager.js +235 -0
  21. package/cjs/formula/cross-sheet-formula-manager.js.map +1 -0
  22. package/cjs/formula/cross-sheet-formula-validator.d.ts +56 -0
  23. package/cjs/formula/cross-sheet-formula-validator.js +271 -0
  24. package/cjs/formula/cross-sheet-formula-validator.js.map +1 -0
  25. package/cjs/formula/formula-engine.d.ts +4 -1
  26. package/cjs/formula/formula-engine.js +132 -25
  27. package/cjs/formula/formula-engine.js.map +1 -1
  28. package/cjs/formula/formula-paste-processor.d.ts +3 -3
  29. package/cjs/formula/formula-paste-processor.js.map +1 -1
  30. package/cjs/formula/formula-reference-adjustor.d.ts +1 -1
  31. package/cjs/formula/formula-reference-adjustor.js.map +1 -1
  32. package/cjs/formula/index.d.ts +8 -0
  33. package/cjs/formula/index.js +40 -3
  34. package/cjs/formula/index.js.map +1 -1
  35. package/cjs/index.d.ts +1 -1
  36. package/cjs/index.js +1 -1
  37. package/cjs/index.js.map +1 -1
  38. package/cjs/managers/formula-manager.d.ts +17 -2
  39. package/cjs/managers/formula-manager.js +150 -12
  40. package/cjs/managers/formula-manager.js.map +1 -1
  41. package/cjs/styles/menu.js +2 -1
  42. package/cjs/styles/sheet-tab.js +1 -2
  43. package/cjs/tools/index.js +2 -1
  44. package/dist/vtable-sheet.js +11322 -331
  45. package/dist/vtable-sheet.min.js +1 -1
  46. package/es/components/sheet-tab-event-handler.js +3 -2
  47. package/es/components/sheet-tab-event-handler.js.map +1 -1
  48. package/es/components/vtable-sheet.d.ts +2 -1
  49. package/es/components/vtable-sheet.js +9 -1
  50. package/es/components/vtable-sheet.js.map +1 -1
  51. package/es/core/WorkSheet.d.ts +1 -1
  52. package/es/core/WorkSheet.js.map +1 -1
  53. package/es/core/table-plugins.js +7 -5
  54. package/es/core/table-plugins.js.map +1 -1
  55. package/es/formula/cell-highlight-manager.d.ts +1 -0
  56. package/es/formula/cell-highlight-manager.js +27 -22
  57. package/es/formula/cell-highlight-manager.js.map +1 -1
  58. package/es/formula/cross-sheet-data-synchronizer.d.ts +48 -0
  59. package/es/formula/cross-sheet-data-synchronizer.js +151 -0
  60. package/es/formula/cross-sheet-data-synchronizer.js.map +1 -0
  61. package/es/formula/cross-sheet-formula-handler.d.ts +58 -0
  62. package/es/formula/cross-sheet-formula-handler.js +236 -0
  63. package/es/formula/cross-sheet-formula-handler.js.map +1 -0
  64. package/es/formula/cross-sheet-formula-manager.d.ts +52 -0
  65. package/es/formula/cross-sheet-formula-manager.js +227 -0
  66. package/es/formula/cross-sheet-formula-manager.js.map +1 -0
  67. package/es/formula/cross-sheet-formula-validator.d.ts +56 -0
  68. package/es/formula/cross-sheet-formula-validator.js +263 -0
  69. package/es/formula/cross-sheet-formula-validator.js.map +1 -0
  70. package/es/formula/formula-engine.d.ts +4 -1
  71. package/es/formula/formula-engine.js +132 -25
  72. package/es/formula/formula-engine.js.map +1 -1
  73. package/es/formula/formula-paste-processor.d.ts +3 -3
  74. package/es/formula/formula-paste-processor.js.map +1 -1
  75. package/es/formula/formula-reference-adjustor.d.ts +1 -1
  76. package/es/formula/formula-reference-adjustor.js.map +1 -1
  77. package/es/formula/index.d.ts +8 -0
  78. package/es/formula/index.js +8 -0
  79. package/es/formula/index.js.map +1 -1
  80. package/es/index.d.ts +1 -1
  81. package/es/index.js +1 -1
  82. package/es/index.js.map +1 -1
  83. package/es/managers/formula-manager.d.ts +17 -2
  84. package/es/managers/formula-manager.js +152 -11
  85. package/es/managers/formula-manager.js.map +1 -1
  86. package/es/styles/menu.js +2 -1
  87. package/es/styles/sheet-tab.js +1 -2
  88. package/es/tools/index.js +2 -1
  89. package/package.json +5 -5
@@ -21,9 +21,9 @@ export interface FormulaPasteContext {
21
21
  };
22
22
  }
23
23
  export declare class FormulaPasteProcessor {
24
- static adjustFormulaForPaste(formula: string | number, context: FormulaPasteContext): string | number;
25
- static adjustFormulasForPaste(formulas: (string | number)[][], context: FormulaPasteContext): (string | number)[][];
26
- static adjustFormulasForPasteWithOffset(formulas: (string | number)[][], colOffset: number, rowOffset: number): (string | number)[][];
24
+ static adjustFormulaForPaste(formula: string, context: FormulaPasteContext): string;
25
+ static adjustFormulasForPaste(formulas: string[][], context: FormulaPasteContext): string[][];
26
+ static adjustFormulasForPasteWithOffset(formulas: string[][], colOffset: number, rowOffset: number): string[][];
27
27
  static needsFormulaAdjustment(value: any): boolean;
28
28
  static getFormulaReferences(formula: string): import("./formula-reference-adjustor").CellReference[];
29
29
  static validateFormulaReferences(formula: string, maxCol: number, maxRow: number): boolean;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-paste-processor.ts"],"names":[],"mappings":"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","file":"formula-paste-processor.js","sourcesContent":["/**\n * 公式粘贴处理器 - 处理公式在复制粘贴时的引用调整\n */\n\nimport { FormulaReferenceAdjustor } from './formula-reference-adjustor';\n\nexport interface FormulaPasteContext {\n sourceRange: {\n startCol: number;\n startRow: number;\n endCol: number;\n endRow: number;\n };\n targetRange: {\n startCol: number;\n startRow: number;\n endCol: number;\n endRow: number;\n };\n sourceCell: {\n col: number;\n row: number;\n };\n targetCell: {\n col: number;\n row: number;\n };\n}\n\nexport class FormulaPasteProcessor {\n /**\n * 处理单个公式的粘贴调整\n */\n static adjustFormulaForPaste(formula: string | number, context: FormulaPasteContext): string | number {\n if (!FormulaReferenceAdjustor.isFormula(formula)) {\n return formula;\n }\n\n // 计算相对偏移:目标位置相对于源位置的位移\n const colOffset = context.targetCell.col - context.sourceCell.col;\n const rowOffset = context.targetCell.row - context.sourceCell.row;\n\n // 调整公式引用\n return FormulaReferenceAdjustor.adjustFormulaReferences(formula, colOffset, rowOffset);\n }\n\n /**\n * 批量处理公式粘贴\n */\n static adjustFormulasForPaste(formulas: (string | number)[][], context: FormulaPasteContext): (string | number)[][] {\n // 计算整个范围的相对位移\n const colOffset = context.targetRange.startCol - context.sourceRange.startCol;\n const rowOffset = context.targetRange.startRow - context.sourceRange.startRow;\n\n return this.adjustFormulasForPasteWithOffset(formulas, colOffset, rowOffset);\n }\n\n /**\n * 使用指定偏移批量处理公式粘贴\n */\n static adjustFormulasForPasteWithOffset(\n formulas: (string | number)[][],\n colOffset: number,\n rowOffset: number\n ): (string | number)[][] {\n const result: (string | number)[][] = [];\n\n for (let row = 0; row < formulas.length; row++) {\n const newRow: (string | number)[] = [];\n for (let col = 0; col < formulas[row].length; col++) {\n const formula = formulas[row][col];\n\n if (FormulaReferenceAdjustor.isFormula(formula)) {\n // 对整个公式应用相同的相对位移\n const adjustedFormula = FormulaReferenceAdjustor.adjustFormulaReferences(formula, colOffset, rowOffset);\n newRow.push(adjustedFormula);\n } else {\n // 非公式内容保持不变\n newRow.push(formula);\n }\n }\n result.push(newRow);\n }\n\n return result;\n }\n\n /**\n * 检查是否需要公式调整\n */\n static needsFormulaAdjustment(value: any): boolean {\n return FormulaReferenceAdjustor.isFormula(value);\n }\n\n /**\n * 获取公式中的引用信息\n */\n static getFormulaReferences(formula: string) {\n return FormulaReferenceAdjustor.extractReferences(formula);\n }\n\n /**\n * 验证公式引用是否在有效范围内\n */\n static validateFormulaReferences(formula: string, maxCol: number, maxRow: number): boolean {\n const references = FormulaReferenceAdjustor.extractReferences(formula);\n\n for (const ref of references) {\n if (ref.col < 0 || ref.col > maxCol || ref.row < 0 || ref.row > maxRow) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 创建粘贴上下文\n */\n static createPasteContext(\n sourceStartCol: number,\n sourceStartRow: number,\n targetStartCol: number,\n targetStartRow: number,\n sourceCols: number,\n sourceRows: number,\n targetCols: number,\n targetRows: number\n ): FormulaPasteContext {\n return {\n sourceRange: {\n startCol: sourceStartCol,\n startRow: sourceStartRow,\n endCol: sourceStartCol + sourceCols - 1,\n endRow: sourceStartRow + sourceRows - 1\n },\n targetRange: {\n startCol: targetStartCol,\n startRow: targetStartRow,\n endCol: targetStartCol + targetCols - 1,\n endRow: targetStartRow + targetRows - 1\n },\n sourceCell: {\n col: sourceStartCol,\n row: sourceStartRow\n },\n targetCell: {\n col: targetStartCol,\n row: targetStartRow\n }\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-paste-processor.ts"],"names":[],"mappings":"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","file":"formula-paste-processor.js","sourcesContent":["/**\n * 公式粘贴处理器 - 处理公式在复制粘贴时的引用调整\n */\n\nimport { FormulaReferenceAdjustor } from './formula-reference-adjustor';\n\nexport interface FormulaPasteContext {\n sourceRange: {\n startCol: number;\n startRow: number;\n endCol: number;\n endRow: number;\n };\n targetRange: {\n startCol: number;\n startRow: number;\n endCol: number;\n endRow: number;\n };\n sourceCell: {\n col: number;\n row: number;\n };\n targetCell: {\n col: number;\n row: number;\n };\n}\n\nexport class FormulaPasteProcessor {\n /**\n * 处理单个公式的粘贴调整\n */\n static adjustFormulaForPaste(formula: string, context: FormulaPasteContext): string {\n if (!FormulaReferenceAdjustor.isFormula(formula)) {\n return formula;\n }\n\n // 计算相对偏移:目标位置相对于源位置的位移\n const colOffset = context.targetCell.col - context.sourceCell.col;\n const rowOffset = context.targetCell.row - context.sourceCell.row;\n\n // 调整公式引用(确保 formula 是字符串类型)\n return FormulaReferenceAdjustor.adjustFormulaReferences(formula, colOffset, rowOffset);\n }\n\n /**\n * 批量处理公式粘贴\n */\n static adjustFormulasForPaste(formulas: string[][], context: FormulaPasteContext): string[][] {\n // 计算整个范围的相对位移\n const colOffset = context.targetRange.startCol - context.sourceRange.startCol;\n const rowOffset = context.targetRange.startRow - context.sourceRange.startRow;\n\n return this.adjustFormulasForPasteWithOffset(formulas, colOffset, rowOffset);\n }\n\n /**\n * 使用指定偏移批量处理公式粘贴\n */\n static adjustFormulasForPasteWithOffset(formulas: string[][], colOffset: number, rowOffset: number): string[][] {\n const result: string[][] = [];\n\n for (let row = 0; row < formulas.length; row++) {\n const newRow: string[] = [];\n for (let col = 0; col < formulas[row].length; col++) {\n const formula = formulas[row][col];\n\n if (FormulaReferenceAdjustor.isFormula(formula)) {\n // 对整个公式应用相同的相对位移\n const adjustedFormula = FormulaReferenceAdjustor.adjustFormulaReferences(formula, colOffset, rowOffset);\n newRow.push(adjustedFormula);\n } else {\n // 非公式内容保持不变\n newRow.push(formula);\n }\n }\n result.push(newRow);\n }\n\n return result;\n }\n\n /**\n * 检查是否需要公式调整\n */\n static needsFormulaAdjustment(value: any): boolean {\n return FormulaReferenceAdjustor.isFormula(value);\n }\n\n /**\n * 获取公式中的引用信息\n */\n static getFormulaReferences(formula: string) {\n return FormulaReferenceAdjustor.extractReferences(formula);\n }\n\n /**\n * 验证公式引用是否在有效范围内\n */\n static validateFormulaReferences(formula: string, maxCol: number, maxRow: number): boolean {\n const references = FormulaReferenceAdjustor.extractReferences(formula);\n\n for (const ref of references) {\n if (ref.col < 0 || ref.col > maxCol || ref.row < 0 || ref.row > maxRow) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 创建粘贴上下文\n */\n static createPasteContext(\n sourceStartCol: number,\n sourceStartRow: number,\n targetStartCol: number,\n targetStartRow: number,\n sourceCols: number,\n sourceRows: number,\n targetCols: number,\n targetRows: number\n ): FormulaPasteContext {\n return {\n sourceRange: {\n startCol: sourceStartCol,\n startRow: sourceStartRow,\n endCol: sourceStartCol + sourceCols - 1,\n endRow: sourceStartRow + sourceRows - 1\n },\n targetRange: {\n startCol: targetStartCol,\n startRow: targetStartRow,\n endCol: targetStartCol + targetCols - 1,\n endRow: targetStartRow + targetRows - 1\n },\n sourceCell: {\n col: sourceStartCol,\n row: sourceStartRow\n },\n targetCell: {\n col: targetStartCol,\n row: targetStartRow\n }\n };\n }\n}\n"]}
@@ -17,7 +17,7 @@ export declare class FormulaReferenceAdjustor {
17
17
  static columnToNumber(col: string): number;
18
18
  static numberToColumn(num: number): string;
19
19
  static adjustCellReference(ref: CellReference, offset: ReferenceOffset): string;
20
- static adjustFormulaReferences(formula: string | number, colOffset: number, rowOffset: number): string | number;
20
+ static adjustFormulaReferences(formula: string, colOffset: number, rowOffset: number): string;
21
21
  static isFormula(value: any): boolean;
22
22
  static extractReferences(formula: string): CellReference[];
23
23
  static getFormulaReferenceBounds(formula: string): {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/formula-reference-adjustor.ts"],"names":[],"mappings":";;;AAmBA,MAAa,wBAAwB;IAOnC,MAAM,CAAC,kBAAkB,CAAC,GAAW;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QAED,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,IAA2B,CAAC;QAChC,IAAI,WAAW,IAAI,WAAW,EAAE;YAC9B,IAAI,GAAG,UAAU,CAAC;SACnB;aAAM,IAAI,WAAW,IAAI,CAAC,WAAW,EAAE;YACtC,IAAI,GAAG,WAAW,CAAC;SACpB;aAAM,IAAI,CAAC,WAAW,IAAI,WAAW,EAAE;YACtC,IAAI,GAAG,WAAW,CAAC;SACpB;aAAM;YACL,IAAI,GAAG,UAAU,CAAC;SACnB;QAED,OAAO;YACL,IAAI;YACJ,GAAG;YACH,GAAG;YACH,cAAc,EAAE,WAAW,GAAG,MAAM;YACpC,cAAc,EAAE,WAAW,GAAG,MAAM;YACpC,aAAa,EAAE,GAAG;SACnB,CAAC;IACJ,CAAC;IAKD,MAAM,CAAC,cAAc,CAAC,GAAW;QAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACpE;QACD,OAAO,MAAM,GAAG,CAAC,CAAC;IACpB,CAAC;IAKD,MAAM,CAAC,cAAc,CAAC,GAAW;QAC/B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE;YACZ,CAAC,EAAE,CAAC;YACJ,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;YACpE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;SACxB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAKD,MAAM,CAAC,mBAAmB,CAAC,GAAkB,EAAE,MAAuB;QACpE,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;QACrB,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;QAErB,QAAQ,GAAG,CAAC,IAAI,EAAE;YAChB,KAAK,UAAU;gBACb,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;gBAC3B,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;gBAC3B,MAAM;YACR,KAAK,WAAW;gBAEd,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;gBAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;gBACjB,MAAM;YACR,KAAK,WAAW;gBAEd,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;gBACjB,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;gBAC3B,MAAM;YACR,KAAK,UAAU;gBAEb,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;gBACjB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC;gBACjB,MAAM;SACT;QAGD,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,MAAM,GAAG,CAAC,CAAC;SACZ;QACD,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,MAAM,GAAG,CAAC,CAAC;SACZ;QAGD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE;YACvD,MAAM,IAAI,GAAG,CAAC;SACf;QACD,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE;YACvD,MAAM,IAAI,GAAG,CAAC;SACf;QACD,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC;QAErB,OAAO,MAAM,CAAC;IAChB,CAAC;IAQD,MAAM,CAAC,uBAAuB,CAAC,OAAwB,EAAE,SAAiB,EAAE,SAAiB;QAC3F,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,SAAS;SACrB,CAAC;QAEF,OAAO,OAAO,OAAO,KAAK,QAAQ;YAChC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE;gBAE3C,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEjD,IAAI,QAAQ,IAAI,MAAM,EAAE;wBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;wBAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACxD,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;qBAChC;oBACD,OAAO,KAAK,CAAC;iBACd;gBAGD,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,GAAG,EAAE;oBACP,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;iBAC9C;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;YACJ,CAAC,CAAC,OAAO,CAAC;IACd,CAAC;IAKD,MAAM,CAAC,SAAS,CAAC,KAAU;QACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAKD,MAAM,CAAC,iBAAiB,CAAC,OAAe;QACtC,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEnD,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAEtB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;oBACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEjD,IAAI,QAAQ,EAAE;wBACZ,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qBAC3B;oBACD,IAAI,MAAM,EAAE;wBACV,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;qBACzB;iBACF;qBAAM;oBACL,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAC3C,IAAI,GAAG,EAAE;wBACP,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACtB;iBACF;YACH,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAKD,MAAM,CAAC,yBAAyB,CAAC,OAAe;QAM9C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAC;SACb;QAED,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC;QACvB,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC;QAEvB,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC;;AAhOH,4DAiOC;AAhOyB,uCAAc,GAAG,0CAA0C,CAAC;AAC5D,0CAAiB,GAAG,0BAA0B,CAAC","file":"formula-reference-adjustor.js","sourcesContent":["/**\n * 公式引用调整器 - 实现Excel风格的公式复制粘贴功能\n * 处理公式中单元格引用的相对调整\n */\n\nexport interface CellReference {\n type: 'absolute' | 'relative' | 'mixed_row' | 'mixed_col';\n col: number; // 0-based column index\n row: number; // 0-based row index\n originalColRef: string; // 原始列引用,如 \"A\", \"$B\"\n originalRowRef: string; // 原始行引用,如 \"1\", \"$2\"\n fullReference: string; // 完整引用,如 \"A1\", \"$B$2\", \"A$1\"\n}\n\nexport interface ReferenceOffset {\n colOffset: number;\n rowOffset: number;\n}\n\nexport class FormulaReferenceAdjustor {\n private static readonly CELL_REF_REGEX = /(\\$?[A-Z]+\\$?\\d+(?::\\$?[A-Z]+\\$?\\d+)?)/gi;\n private static readonly SINGLE_CELL_REGEX = /(\\$?)([A-Z]+)(\\$?)(\\d+)/i;\n\n /**\n * 解析单元格引用\n */\n static parseCellReference(ref: string): CellReference | null {\n const match = ref.match(this.SINGLE_CELL_REGEX);\n if (!match) {\n return null;\n }\n\n const [, colAbsolute, colStr, rowAbsolute, rowStr] = match;\n const col = this.columnToNumber(colStr);\n const row = parseInt(rowStr, 10) - 1; // Convert to 0-based\n\n let type: CellReference['type'];\n if (colAbsolute && rowAbsolute) {\n type = 'absolute';\n } else if (colAbsolute && !rowAbsolute) {\n type = 'mixed_col';\n } else if (!colAbsolute && rowAbsolute) {\n type = 'mixed_row';\n } else {\n type = 'relative';\n }\n\n return {\n type,\n col,\n row,\n originalColRef: colAbsolute + colStr,\n originalRowRef: rowAbsolute + rowStr,\n fullReference: ref\n };\n }\n\n /**\n * 将列字母转换为数字 (A -> 0, B -> 1, ..., Z -> 25, AA -> 26, etc.)\n */\n static columnToNumber(col: string): number {\n let result = 0;\n for (let i = 0; i < col.length; i++) {\n result = result * 26 + (col.charCodeAt(i) - 'A'.charCodeAt(0) + 1);\n }\n return result - 1; // Convert to 0-based\n }\n\n /**\n * 将数字转换为列字母 (0 -> A, 1 -> B, ..., 25 -> Z, 26 -> AA, etc.)\n */\n static numberToColumn(num: number): string {\n let result = '';\n let n = num + 1; // Convert to 1-based\n while (n > 0) {\n n--;\n result = String.fromCharCode('A'.charCodeAt(0) + (n % 26)) + result;\n n = Math.floor(n / 26);\n }\n return result;\n }\n\n /**\n * 调整单元格引用\n */\n static adjustCellReference(ref: CellReference, offset: ReferenceOffset): string {\n let newCol = ref.col;\n let newRow = ref.row;\n\n switch (ref.type) {\n case 'relative':\n newCol += offset.colOffset;\n newRow += offset.rowOffset;\n break;\n case 'mixed_row':\n // 行绝对,列相对\n newCol += offset.colOffset;\n newRow = ref.row; // 行绝对引用,不改变\n break;\n case 'mixed_col':\n // 列绝对,行相对\n newCol = ref.col; // 列绝对引用,不改变\n newRow += offset.rowOffset;\n break;\n case 'absolute':\n // 绝对引用,不改变任何值\n newCol = ref.col;\n newRow = ref.row;\n break;\n }\n\n // 确保坐标在有效范围内\n if (newCol < 0) {\n newCol = 0;\n }\n if (newRow < 0) {\n newRow = 0;\n }\n\n // 构建新的引用字符串\n let result = '';\n if (ref.type === 'absolute' || ref.type === 'mixed_col') {\n result += '$';\n }\n result += this.numberToColumn(newCol);\n if (ref.type === 'absolute' || ref.type === 'mixed_row') {\n result += '$';\n }\n result += newRow + 1; // Convert back to 1-based\n\n return result;\n }\n\n /**\n * 调整公式中的引用\n * @param formula 原始公式\n * @param colOffset 列位移(目标列 - 源列)\n * @param rowOffset 行位移(目标行 - 源行)\n */\n static adjustFormulaReferences(formula: string | number, colOffset: number, rowOffset: number): string | number {\n const offset = {\n colOffset: colOffset,\n rowOffset: rowOffset\n };\n\n return typeof formula === 'string'\n ? formula.replace(this.CELL_REF_REGEX, match => {\n // 处理范围引用(如 A1:B2)\n if (match.includes(':')) {\n const parts = match.split(':');\n const startRef = this.parseCellReference(parts[0]);\n const endRef = this.parseCellReference(parts[1]);\n\n if (startRef && endRef) {\n const newStart = this.adjustCellReference(startRef, offset);\n const newEnd = this.adjustCellReference(endRef, offset);\n return `${newStart}:${newEnd}`;\n }\n return match; // 如果解析失败,保持原样\n }\n\n // 处理单个单元格引用\n const ref = this.parseCellReference(match);\n if (ref) {\n return this.adjustCellReference(ref, offset);\n }\n return match; // 如果解析失败,保持原样\n })\n : formula;\n }\n\n /**\n * 检查是否为公式\n */\n static isFormula(value: any): boolean {\n return typeof value === 'string' && value.startsWith('=');\n }\n\n /**\n * 提取公式中的引用\n */\n static extractReferences(formula: string): CellReference[] {\n const references: CellReference[] = [];\n const matches = formula.match(this.CELL_REF_REGEX);\n\n if (matches) {\n matches.forEach(match => {\n // 处理范围引用\n if (match.includes(':')) {\n const parts = match.split(':');\n const startRef = this.parseCellReference(parts[0]);\n const endRef = this.parseCellReference(parts[1]);\n\n if (startRef) {\n references.push(startRef);\n }\n if (endRef) {\n references.push(endRef);\n }\n } else {\n const ref = this.parseCellReference(match);\n if (ref) {\n references.push(ref);\n }\n }\n });\n }\n\n return references;\n }\n\n /**\n * 获取公式中的引用范围\n */\n static getFormulaReferenceBounds(formula: string): {\n minCol: number;\n maxCol: number;\n minRow: number;\n maxRow: number;\n } | null {\n const references = this.extractReferences(formula);\n if (references.length === 0) {\n return null;\n }\n\n let minCol = Infinity;\n let maxCol = -Infinity;\n let minRow = Infinity;\n let maxRow = -Infinity;\n\n references.forEach(ref => {\n minCol = Math.min(minCol, ref.col);\n maxCol = Math.max(maxCol, ref.col);\n minRow = Math.min(minRow, ref.row);\n maxRow = Math.max(maxRow, ref.row);\n });\n\n return {\n minCol,\n maxCol,\n minRow,\n maxRow\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/formula/formula-reference-adjustor.ts"],"names":[],"mappings":"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","file":"formula-reference-adjustor.js","sourcesContent":["/**\n * 公式引用调整器 - 实现Excel风格的公式复制粘贴功能\n * 处理公式中单元格引用的相对调整\n */\n\nexport interface CellReference {\n type: 'absolute' | 'relative' | 'mixed_row' | 'mixed_col';\n col: number; // 0-based column index\n row: number; // 0-based row index\n originalColRef: string; // 原始列引用,如 \"A\", \"$B\"\n originalRowRef: string; // 原始行引用,如 \"1\", \"$2\"\n fullReference: string; // 完整引用,如 \"A1\", \"$B$2\", \"A$1\"\n}\n\nexport interface ReferenceOffset {\n colOffset: number;\n rowOffset: number;\n}\n\nexport class FormulaReferenceAdjustor {\n private static readonly CELL_REF_REGEX = /(\\$?[A-Z]+\\$?\\d+(?::\\$?[A-Z]+\\$?\\d+)?)/gi;\n private static readonly SINGLE_CELL_REGEX = /(\\$?)([A-Z]+)(\\$?)(\\d+)/i;\n\n /**\n * 解析单元格引用\n */\n static parseCellReference(ref: string): CellReference | null {\n const match = ref.match(this.SINGLE_CELL_REGEX);\n if (!match) {\n return null;\n }\n\n const [, colAbsolute, colStr, rowAbsolute, rowStr] = match;\n const col = this.columnToNumber(colStr);\n const row = parseInt(rowStr, 10) - 1; // Convert to 0-based\n\n let type: CellReference['type'];\n if (colAbsolute && rowAbsolute) {\n type = 'absolute';\n } else if (colAbsolute && !rowAbsolute) {\n type = 'mixed_col';\n } else if (!colAbsolute && rowAbsolute) {\n type = 'mixed_row';\n } else {\n type = 'relative';\n }\n\n return {\n type,\n col,\n row,\n originalColRef: colAbsolute + colStr,\n originalRowRef: rowAbsolute + rowStr,\n fullReference: ref\n };\n }\n\n /**\n * 将列字母转换为数字 (A -> 0, B -> 1, ..., Z -> 25, AA -> 26, etc.)\n */\n static columnToNumber(col: string): number {\n let result = 0;\n for (let i = 0; i < col.length; i++) {\n result = result * 26 + (col.charCodeAt(i) - 'A'.charCodeAt(0) + 1);\n }\n return result - 1; // Convert to 0-based\n }\n\n /**\n * 将数字转换为列字母 (0 -> A, 1 -> B, ..., 25 -> Z, 26 -> AA, etc.)\n */\n static numberToColumn(num: number): string {\n let result = '';\n let n = num + 1; // Convert to 1-based\n while (n > 0) {\n n--;\n result = String.fromCharCode('A'.charCodeAt(0) + (n % 26)) + result;\n n = Math.floor(n / 26);\n }\n return result;\n }\n\n /**\n * 调整单元格引用\n */\n static adjustCellReference(ref: CellReference, offset: ReferenceOffset): string {\n let newCol = ref.col;\n let newRow = ref.row;\n\n switch (ref.type) {\n case 'relative':\n newCol += offset.colOffset;\n newRow += offset.rowOffset;\n break;\n case 'mixed_row':\n // 行绝对,列相对\n newCol += offset.colOffset;\n newRow = ref.row; // 行绝对引用,不改变\n break;\n case 'mixed_col':\n // 列绝对,行相对\n newCol = ref.col; // 列绝对引用,不改变\n newRow += offset.rowOffset;\n break;\n case 'absolute':\n // 绝对引用,不改变任何值\n newCol = ref.col;\n newRow = ref.row;\n break;\n }\n\n // 确保坐标在有效范围内\n if (newCol < 0) {\n newCol = 0;\n }\n if (newRow < 0) {\n newRow = 0;\n }\n\n // 构建新的引用字符串\n let result = '';\n if (ref.type === 'absolute' || ref.type === 'mixed_col') {\n result += '$';\n }\n result += this.numberToColumn(newCol);\n if (ref.type === 'absolute' || ref.type === 'mixed_row') {\n result += '$';\n }\n result += newRow + 1; // Convert back to 1-based\n\n return result;\n }\n\n /**\n * 调整公式中的引用\n * @param formula 原始公式\n * @param colOffset 列位移(目标列 - 源列)\n * @param rowOffset 行位移(目标行 - 源行)\n */\n static adjustFormulaReferences(formula: string, colOffset: number, rowOffset: number): string {\n const offset = {\n colOffset: colOffset,\n rowOffset: rowOffset\n };\n\n return typeof formula === 'string'\n ? formula.replace(this.CELL_REF_REGEX, match => {\n // 处理范围引用(如 A1:B2)\n if (match.includes(':')) {\n const parts = match.split(':');\n const startRef = this.parseCellReference(parts[0]);\n const endRef = this.parseCellReference(parts[1]);\n\n if (startRef && endRef) {\n const newStart = this.adjustCellReference(startRef, offset);\n const newEnd = this.adjustCellReference(endRef, offset);\n return `${newStart}:${newEnd}`;\n }\n return match; // 如果解析失败,保持原样\n }\n\n // 处理单个单元格引用\n const ref = this.parseCellReference(match);\n if (ref) {\n return this.adjustCellReference(ref, offset);\n }\n return match; // 如果解析失败,保持原样\n })\n : formula;\n }\n\n /**\n * 检查是否为公式\n */\n static isFormula(value: any): boolean {\n return typeof value === 'string' && value.startsWith('=');\n }\n\n /**\n * 提取公式中的引用\n */\n static extractReferences(formula: string): CellReference[] {\n const references: CellReference[] = [];\n const matches = formula.match(this.CELL_REF_REGEX);\n\n if (matches) {\n matches.forEach(match => {\n // 处理范围引用\n if (match.includes(':')) {\n const parts = match.split(':');\n const startRef = this.parseCellReference(parts[0]);\n const endRef = this.parseCellReference(parts[1]);\n\n if (startRef) {\n references.push(startRef);\n }\n if (endRef) {\n references.push(endRef);\n }\n } else {\n const ref = this.parseCellReference(match);\n if (ref) {\n references.push(ref);\n }\n }\n });\n }\n\n return references;\n }\n\n /**\n * 获取公式中的引用范围\n */\n static getFormulaReferenceBounds(formula: string): {\n minCol: number;\n maxCol: number;\n minRow: number;\n maxRow: number;\n } | null {\n const references = this.extractReferences(formula);\n if (references.length === 0) {\n return null;\n }\n\n let minCol = Infinity;\n let maxCol = -Infinity;\n let minRow = Infinity;\n let maxRow = -Infinity;\n\n references.forEach(ref => {\n minCol = Math.min(minCol, ref.col);\n maxCol = Math.max(maxCol, ref.col);\n minRow = Math.min(minRow, ref.row);\n maxRow = Math.max(maxRow, ref.row);\n });\n\n return {\n minCol,\n maxCol,\n minRow,\n maxRow\n };\n }\n}\n"]}
@@ -7,3 +7,11 @@ export { FormulaReferenceAdjustor } from './formula-reference-adjustor';
7
7
  export { FormulaPasteProcessor } from './formula-paste-processor';
8
8
  export type { CellReference, ReferenceOffset } from './formula-reference-adjustor';
9
9
  export type { FormulaPasteContext } from './formula-paste-processor';
10
+ export { CrossSheetFormulaManager } from './cross-sheet-formula-manager';
11
+ export { CrossSheetDataSynchronizer } from './cross-sheet-data-synchronizer';
12
+ export { CrossSheetFormulaValidator } from './cross-sheet-formula-validator';
13
+ export { CrossSheetFormulaHandler } from './cross-sheet-formula-handler';
14
+ export type { CrossSheetReference, CrossSheetDependency } from './cross-sheet-formula-manager';
15
+ export type { DataChangeEvent, SyncOptions } from './cross-sheet-data-synchronizer';
16
+ export type { ValidationError, ValidationResult, ValidationOptions } from './cross-sheet-formula-validator';
17
+ export type { CrossSheetFormulaOptions, FormulaCalculationResult } from './cross-sheet-formula-handler';
@@ -17,9 +17,10 @@ var __createBinding = this && this.__createBinding || (Object.create ? function(
17
17
 
18
18
  Object.defineProperty(exports, "__esModule", {
19
19
  value: !0
20
- }), exports.FormulaPasteProcessor = exports.FormulaReferenceAdjustor = void 0, __exportStar(require("./formula-editor"), exports),
21
- __exportStar(require("./formula-autocomplete"), exports), __exportStar(require("./formula-range-selector"), exports),
22
- __exportStar(require("./formula-ui-manager"), exports), __exportStar(require("./cell-highlight-manager"), exports);
20
+ }), exports.CrossSheetFormulaHandler = exports.CrossSheetFormulaValidator = exports.CrossSheetDataSynchronizer = exports.CrossSheetFormulaManager = exports.FormulaPasteProcessor = exports.FormulaReferenceAdjustor = void 0,
21
+ __exportStar(require("./formula-editor"), exports), __exportStar(require("./formula-autocomplete"), exports),
22
+ __exportStar(require("./formula-range-selector"), exports), __exportStar(require("./formula-ui-manager"), exports),
23
+ __exportStar(require("./cell-highlight-manager"), exports);
23
24
 
24
25
  var formula_reference_adjustor_1 = require("./formula-reference-adjustor");
25
26
 
@@ -38,4 +39,40 @@ Object.defineProperty(exports, "FormulaPasteProcessor", {
38
39
  return formula_paste_processor_1.FormulaPasteProcessor;
39
40
  }
40
41
  });
42
+
43
+ var cross_sheet_formula_manager_1 = require("./cross-sheet-formula-manager");
44
+
45
+ Object.defineProperty(exports, "CrossSheetFormulaManager", {
46
+ enumerable: !0,
47
+ get: function() {
48
+ return cross_sheet_formula_manager_1.CrossSheetFormulaManager;
49
+ }
50
+ });
51
+
52
+ var cross_sheet_data_synchronizer_1 = require("./cross-sheet-data-synchronizer");
53
+
54
+ Object.defineProperty(exports, "CrossSheetDataSynchronizer", {
55
+ enumerable: !0,
56
+ get: function() {
57
+ return cross_sheet_data_synchronizer_1.CrossSheetDataSynchronizer;
58
+ }
59
+ });
60
+
61
+ var cross_sheet_formula_validator_1 = require("./cross-sheet-formula-validator");
62
+
63
+ Object.defineProperty(exports, "CrossSheetFormulaValidator", {
64
+ enumerable: !0,
65
+ get: function() {
66
+ return cross_sheet_formula_validator_1.CrossSheetFormulaValidator;
67
+ }
68
+ });
69
+
70
+ var cross_sheet_formula_handler_1 = require("./cross-sheet-formula-handler");
71
+
72
+ Object.defineProperty(exports, "CrossSheetFormulaHandler", {
73
+ enumerable: !0,
74
+ get: function() {
75
+ return cross_sheet_formula_handler_1.CrossSheetFormulaHandler;
76
+ }
77
+ });
41
78
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,yDAAuC;AACvC,2DAAyC;AACzC,uDAAqC;AACrC,2DAAyC;AACzC,2EAAwE;AAA/D,sIAAA,wBAAwB,OAAA;AACjC,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA","file":"index.js","sourcesContent":["export * from './formula-editor';\nexport * from './formula-autocomplete';\nexport * from './formula-range-selector';\nexport * from './formula-ui-manager';\nexport * from './cell-highlight-manager';\nexport { FormulaReferenceAdjustor } from './formula-reference-adjustor';\nexport { FormulaPasteProcessor } from './formula-paste-processor';\nexport type { CellReference, ReferenceOffset } from './formula-reference-adjustor';\nexport type { FormulaPasteContext } from './formula-paste-processor';\n"]}
1
+ {"version":3,"sources":["../src/formula/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,yDAAuC;AACvC,2DAAyC;AACzC,uDAAqC;AACrC,2DAAyC;AACzC,2EAAwE;AAA/D,sIAAA,wBAAwB,OAAA;AACjC,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAK9B,6EAAyE;AAAhE,uIAAA,wBAAwB,OAAA;AACjC,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA;AACnC,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA;AACnC,6EAAyE;AAAhE,uIAAA,wBAAwB,OAAA","file":"index.js","sourcesContent":["export * from './formula-editor';\nexport * from './formula-autocomplete';\nexport * from './formula-range-selector';\nexport * from './formula-ui-manager';\nexport * from './cell-highlight-manager';\nexport { FormulaReferenceAdjustor } from './formula-reference-adjustor';\nexport { FormulaPasteProcessor } from './formula-paste-processor';\nexport type { CellReference, ReferenceOffset } from './formula-reference-adjustor';\nexport type { FormulaPasteContext } from './formula-paste-processor';\n\n// 跨sheet公式支持\nexport { CrossSheetFormulaManager } from './cross-sheet-formula-manager';\nexport { CrossSheetDataSynchronizer } from './cross-sheet-data-synchronizer';\nexport { CrossSheetFormulaValidator } from './cross-sheet-formula-validator';\nexport { CrossSheetFormulaHandler } from './cross-sheet-formula-handler';\nexport type { CrossSheetReference, CrossSheetDependency } from './cross-sheet-formula-manager';\nexport type { DataChangeEvent, SyncOptions } from './cross-sheet-data-synchronizer';\nexport type { ValidationError, ValidationResult, ValidationOptions } from './cross-sheet-formula-validator';\nexport type { CrossSheetFormulaOptions, FormulaCalculationResult } from './cross-sheet-formula-handler';\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.22.7";
5
+ export declare const version = "1.22.8-alpha.13";
6
6
  export { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };
package/cjs/index.js CHANGED
@@ -47,4 +47,4 @@ exports.VTable = VTable;
47
47
 
48
48
  const style_manager_1 = require("./styles/style-manager");
49
49
 
50
- exports.version = "1.22.7", (0, style_manager_1.importStyles)();
50
+ exports.version = "1.22.8-alpha.13", (0, style_manager_1.importStyles)();
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,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.7\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6EAAoD;AAW3C,sBAXF,sBAAW,CAWE;AATpB,kDAAoC;AASd,sBAAK;AAR3B,iDAAmC;AAQN,wBAAM;AAPnC,0DAAsD;AACzC,QAAA,OAAO,GAAG,iBAAiB,CAAC;AAEzC,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.8-alpha.13\";\n// 导入样式\nimportStyles();\n/**\n * @namespace VTableSheet\n */\nexport { VTableSheet, TYPES, VTable, ISheetDefine, IVTableSheetOptions };\n"]}
@@ -5,6 +5,8 @@ import { FormulaRangeSelector } from '../formula/formula-range-selector';
5
5
  import type { CellRange } from '../ts-types';
6
6
  import { CellHighlightManager } from '../formula';
7
7
  import type * as VTable from '@visactor/vtable';
8
+ import { CrossSheetFormulaHandler } from '../formula/cross-sheet-formula-handler';
9
+ import type { CrossSheetFormulaOptions } from '../formula/cross-sheet-formula-handler';
8
10
  export declare class FormulaManager implements IFormulaManager {
9
11
  sheet: VTableSheet;
10
12
  formulaEngine: FormulaEngine;
@@ -25,14 +27,21 @@ export declare class FormulaManager implements IFormulaManager {
25
27
  } | null;
26
28
  } | null;
27
29
  inputingElement: HTMLInputElement | null;
30
+ crossSheetHandler: CrossSheetFormulaHandler;
28
31
  get formulaWorkingOnCell(): FormulaCell | null;
29
32
  set formulaWorkingOnCell(value: FormulaCell | null);
30
33
  constructor(sheet: VTableSheet);
31
34
  private initializeFormulaEngine;
32
- addSheet(sheetKey: string, normalizedData?: unknown[][]): number;
35
+ addSheet(sheetKey: string, normalizedData?: unknown[][], sheetTitle?: string): number;
33
36
  normalizeSheetData(data: unknown[][], tableInstance: VTable.ListTable): unknown[][];
34
37
  removeSheet(sheetKey: string): void;
35
38
  renameSheet(oldKey: string, newKey: string): void;
39
+ updateSheetTitle(sheetKey: string, newTitle: string): void;
40
+ private updateCrossSheetFormulasWithNewTitle;
41
+ private parseA1CellRef;
42
+ private ensureSheetRegistered;
43
+ private ensureAllSheetsRegisteredForCrossSheetFormula;
44
+ private normalizeDataForFormulaEngine;
36
45
  getSheetId(sheetKey: string): number;
37
46
  setCellContent(cell: FormulaCell, value: unknown): void;
38
47
  getCellValue(cell: FormulaCell): FormulaResult;
@@ -74,7 +83,7 @@ export declare class FormulaManager implements IFormulaManager {
74
83
  getAllSheets(): Array<{
75
84
  key: string;
76
85
  id: number;
77
- name: string;
86
+ title: string;
78
87
  }>;
79
88
  setActiveSheet(sheetKey: string): void;
80
89
  getActiveSheet(): string | null;
@@ -84,4 +93,10 @@ export declare class FormulaManager implements IFormulaManager {
84
93
  endRow: number;
85
94
  endCol: number;
86
95
  }, targetSheet: string, targetRow: number, targetCol: number): void;
96
+ private hasCrossSheetReference;
97
+ getCrossSheetDependencies(): Map<string, string[]>;
98
+ validateCrossSheetFormula(cell: FormulaCell): import("../formula").ValidationResult;
99
+ validateAllCrossSheetFormulas(): Map<string, import("../formula").ValidationResult>;
100
+ recalculateAllCrossSheetFormulas(): Promise<void>;
101
+ updateCrossSheetOptions(options: Partial<CrossSheetFormulaOptions>): void;
87
102
  }
@@ -1,10 +1,36 @@
1
1
  "use strict";
2
2
 
3
+ var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
4
+ return new (P || (P = Promise))((function(resolve, reject) {
5
+ function fulfilled(value) {
6
+ try {
7
+ step(generator.next(value));
8
+ } catch (e) {
9
+ reject(e);
10
+ }
11
+ }
12
+ function rejected(value) {
13
+ try {
14
+ step(generator.throw(value));
15
+ } catch (e) {
16
+ reject(e);
17
+ }
18
+ }
19
+ function step(result) {
20
+ var value;
21
+ result.done ? resolve(result.value) : (value = result.value, value instanceof P ? value : new P((function(resolve) {
22
+ resolve(value);
23
+ }))).then(fulfilled, rejected);
24
+ }
25
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
26
+ }));
27
+ };
28
+
3
29
  Object.defineProperty(exports, "__esModule", {
4
30
  value: !0
5
31
  }), exports.FormulaManager = void 0;
6
32
 
7
- const formula_engine_1 = require("../formula/formula-engine"), formula_range_selector_1 = require("../formula/formula-range-selector"), formula_1 = require("../formula"), DEFAULT_FORMULA_ENGINE_CONFIG = {
33
+ const formula_engine_1 = require("../formula/formula-engine"), formula_range_selector_1 = require("../formula/formula-range-selector"), formula_1 = require("../formula"), cross_sheet_formula_handler_1 = require("../formula/cross-sheet-formula-handler"), DEFAULT_FORMULA_ENGINE_CONFIG = {
8
34
  precisionRounding: 14,
9
35
  caseSensitive: !1,
10
36
  ignoreWhiteSpace: "standard",
@@ -30,7 +56,7 @@ class FormulaManager {
30
56
  this.lastSelectionRangesOfHandling = [], this.inputIsParamMode = null, this.inputingElement = null,
31
57
  this.sheet = sheet, this.cellHighlightManager = new formula_1.CellHighlightManager(sheet),
32
58
  this.formulaRangeSelector = new formula_range_selector_1.FormulaRangeSelector(this),
33
- this.initializeFormulaEngine();
59
+ this.initializeFormulaEngine(), this.crossSheetHandler = new cross_sheet_formula_handler_1.CrossSheetFormulaHandler(this.formulaEngine, this.sheet.getSheetManager(), this);
34
60
  }
35
61
  initializeFormulaEngine() {
36
62
  try {
@@ -40,16 +66,16 @@ class FormulaManager {
40
66
  throw new Error("FormulaManager initialization failed");
41
67
  }
42
68
  }
43
- addSheet(sheetKey, normalizedData) {
69
+ addSheet(sheetKey, normalizedData, sheetTitle) {
44
70
  if (this.ensureInitialized(), this.sheetMapping.has(sheetKey)) {
45
71
  const existingId = this.sheetMapping.get(sheetKey);
46
72
  if (void 0 !== existingId) return existingId;
47
73
  }
48
74
  try {
49
75
  const wasFirstSheet = 0 === this.sheetMapping.size, sheetId = this.formulaEngine.addSheet(sheetKey, normalizedData);
50
- return this.sheetMapping.set(sheetKey, sheetId), this.reverseSheetMapping.set(sheetId, sheetKey),
51
- this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1), wasFirstSheet && this.formulaEngine.setActiveSheet(sheetKey),
52
- sheetId;
76
+ return sheetTitle && this.formulaEngine.setSheetTitle(sheetKey, sheetTitle), this.sheetMapping.set(sheetKey, sheetId),
77
+ this.reverseSheetMapping.set(sheetId, sheetKey), this.nextSheetId = Math.max(this.nextSheetId, sheetId + 1),
78
+ wasFirstSheet && this.formulaEngine.setActiveSheet(sheetKey), sheetId;
53
79
  } catch (error) {
54
80
  throw new Error(`Failed to add sheet: ${sheetKey}`);
55
81
  }
@@ -105,15 +131,99 @@ class FormulaManager {
105
131
  throw new Error(`Failed to rename sheet: ${oldKey}`);
106
132
  }
107
133
  }
134
+ updateSheetTitle(sheetKey, newTitle) {
135
+ const oldTitle = this.formulaEngine.getSheetTitle(sheetKey);
136
+ this.formulaEngine.setSheetTitle(sheetKey, newTitle), oldTitle && oldTitle !== newTitle && this.updateCrossSheetFormulasWithNewTitle(oldTitle, newTitle),
137
+ this.crossSheetHandler && this.crossSheetHandler.clearCache();
138
+ }
139
+ updateCrossSheetFormulasWithNewTitle(oldTitle, newTitle) {
140
+ try {
141
+ const allSheets = this.sheet.getSheetManager().getAllSheets();
142
+ for (const sheetInfo of allSheets) {
143
+ const formulas = this.formulaEngine.exportFormulas(sheetInfo.sheetKey);
144
+ for (const [cellRef, formula] of Object.entries(formulas)) if (this.hasCrossSheetReference(formula)) {
145
+ const escapedOldTitle = oldTitle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), patterns = [ `${escapedOldTitle}!`, `${escapedOldTitle}!`, `'${escapedOldTitle}'!`, `'${escapedOldTitle}'!` ];
146
+ let updatedFormula = formula, hasChanges = !1;
147
+ for (const pattern of patterns) updatedFormula.includes(pattern) && (pattern.includes(`'${escapedOldTitle}'`) ? pattern.endsWith("!") ? updatedFormula = updatedFormula.replace(new RegExp(`'${escapedOldTitle}'!`, "g"), `'${newTitle}'!`) : pattern.endsWith("!") && (updatedFormula = updatedFormula.replace(new RegExp(`'${escapedOldTitle}'!`, "g"), `'${newTitle}'!`)) : pattern.endsWith("!") ? updatedFormula = updatedFormula.replace(new RegExp(`${escapedOldTitle}!`, "g"), `${newTitle}!`) : pattern.endsWith("!") && (updatedFormula = updatedFormula.replace(new RegExp(`${escapedOldTitle}!`, "g"), `${newTitle}!`)),
148
+ hasChanges = !0);
149
+ if (hasChanges && updatedFormula !== formula) {
150
+ const cell = this.parseA1CellRef(`${sheetInfo.sheetKey}!${cellRef}`);
151
+ cell && this.formulaEngine.setCellContent(cell, updatedFormula);
152
+ }
153
+ }
154
+ }
155
+ } catch (error) {}
156
+ }
157
+ parseA1CellRef(cellRef) {
158
+ try {
159
+ let parts;
160
+ if (parts = cellRef.includes("!") ? cellRef.split("!") : cellRef.includes("!") ? cellRef.split("!") : [ "Sheet1", cellRef ],
161
+ 2 !== parts.length) return null;
162
+ const [sheet, a1Notation] = parts, match = a1Notation.match(/^([A-Z]+)([0-9]+)$/);
163
+ if (!match) return null;
164
+ const colLetters = match[1], rowNumber = parseInt(match[2], 10);
165
+ let col = 0;
166
+ for (let i = 0; i < colLetters.length; i++) col = 26 * col + (colLetters.charCodeAt(i) - 65);
167
+ return {
168
+ sheet: sheet,
169
+ row: rowNumber - 1,
170
+ col: col
171
+ };
172
+ } catch (_a) {
173
+ return null;
174
+ }
175
+ }
176
+ ensureSheetRegistered(sheetKey) {
177
+ if (this.sheet.workSheetInstances.has(sheetKey)) return;
178
+ const sheetDefine = this.sheet.getSheetManager().getSheet(sheetKey);
179
+ if (!sheetDefine) return;
180
+ const instance = this.sheet.createWorkSheetInstance(sheetDefine);
181
+ this.sheet.workSheetInstances.set(sheetKey, instance);
182
+ }
183
+ ensureAllSheetsRegisteredForCrossSheetFormula(formula) {
184
+ try {
185
+ const sheetPattern = /([A-Za-z0-9_一-龥]+)!/g;
186
+ let match;
187
+ const referencedSheets = new Set;
188
+ for (;null !== (match = sheetPattern.exec(formula)); ) {
189
+ const sheetName = match[1];
190
+ sheetName && referencedSheets.add(sheetName);
191
+ }
192
+ for (const sheetTitle of referencedSheets) {
193
+ const sheetInfo = this.sheet.getSheetManager().getAllSheets().find((sheet => sheet.sheetTitle.toLowerCase() === sheetTitle.toLowerCase()));
194
+ sheetInfo && this.ensureSheetRegistered(sheetInfo.sheetKey);
195
+ }
196
+ } catch (error) {}
197
+ }
198
+ normalizeDataForFormulaEngine(data) {
199
+ if (!Array.isArray(data) || 0 === data.length) return [ [ "" ] ];
200
+ const maxCols = Math.max(...data.map((row => Array.isArray(row) ? row.length : 0)));
201
+ return data.map((row => {
202
+ if (!Array.isArray(row)) return Array(maxCols).fill("");
203
+ const normalizedRow = row.map((cell => {
204
+ if ("string" == typeof cell) {
205
+ if (cell.startsWith("=")) return cell;
206
+ const num = Number(cell);
207
+ return isNaN(num) || "" === cell.trim() ? cell : num;
208
+ }
209
+ return null != cell ? cell : "";
210
+ }));
211
+ for (;normalizedRow.length < maxCols; ) normalizedRow.push("");
212
+ return normalizedRow;
213
+ }));
214
+ }
108
215
  getSheetId(sheetKey) {
109
216
  const sheetId = this.sheetMapping.get(sheetKey);
110
- return void 0 === sheetId ? this.addSheet(sheetKey) : sheetId;
217
+ if (void 0 !== sheetId) return sheetId;
218
+ const lowerSheetKey = sheetKey.toLowerCase();
219
+ for (const [existingKey, existingId] of this.sheetMapping.entries()) if (existingKey.toLowerCase() === lowerSheetKey) return existingId;
220
+ return this.addSheet(sheetKey);
111
221
  }
112
222
  setCellContent(cell, value) {
113
223
  if (this.ensureInitialized(), !cell || void 0 === cell.sheet || void 0 === cell.row || void 0 === cell.col) throw new Error("Invalid cell parameter for setCellContent");
114
224
  if (cell.row < 0 || cell.col < 0) throw new Error(`Cell coordinates out of bounds: row=${cell.row}, col=${cell.col}`);
115
225
  try {
116
- this.formulaEngine.setCellContent(cell, value);
226
+ "string" == typeof value && value.startsWith("=") && this.hasCrossSheetReference(value) ? this.crossSheetHandler.setCrossSheetFormula(cell, value) : this.formulaEngine.setCellContent(cell, value);
117
227
  } catch (error) {
118
228
  throw error instanceof Error ? new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}. ${error.message}`) : new Error(`Failed to set cell content at ${cell.sheet}:${cell.row}:${cell.col}`);
119
229
  }
@@ -121,7 +231,12 @@ class FormulaManager {
121
231
  getCellValue(cell) {
122
232
  this.ensureInitialized();
123
233
  try {
124
- return this.formulaEngine.getCellValue(cell);
234
+ const formula = this.formulaEngine.getCellFormula(cell);
235
+ if (formula && this.hasCrossSheetReference(formula)) {
236
+ this.ensureAllSheetsRegisteredForCrossSheetFormula(formula);
237
+ return this.formulaEngine.getCellValue(cell);
238
+ }
239
+ return this.ensureSheetRegistered(cell.sheet), this.formulaEngine.getCellValue(cell);
125
240
  } catch (error) {
126
241
  return {
127
242
  value: null,
@@ -321,7 +436,8 @@ class FormulaManager {
321
436
  }
322
437
  calculateFormula(formula) {
323
438
  try {
324
- return this.formulaEngine.calculateFormula(formula);
439
+ return this.hasCrossSheetReference(formula) && this.ensureAllSheetsRegisteredForCrossSheetFormula(formula),
440
+ this.formulaEngine.calculateFormula(formula);
325
441
  } catch (error) {
326
442
  return {
327
443
  value: null,
@@ -338,8 +454,9 @@ class FormulaManager {
338
454
  } catch (error) {}
339
455
  }
340
456
  release() {
341
- var _a, _b;
342
- null === (_a = this.formulaRangeSelector) || void 0 === _a || _a.release(), null === (_b = this.cellHighlightManager) || void 0 === _b || _b.release();
457
+ var _a, _b, _c;
458
+ null === (_a = this.formulaRangeSelector) || void 0 === _a || _a.release(), null === (_b = this.cellHighlightManager) || void 0 === _b || _b.release(),
459
+ null === (_c = this.crossSheetHandler) || void 0 === _c || _c.destroy();
343
460
  try {
344
461
  this.formulaEngine && this.formulaEngine.release();
345
462
  } catch (error) {} finally {
@@ -352,6 +469,7 @@ class FormulaManager {
352
469
  isInitialized: this.isInitialized,
353
470
  sheets: Array.from(this.sheetMapping.entries()),
354
471
  functions: this.getAvailableFunctions(),
472
+ crossSheetHandler: this.crossSheetHandler ? this.crossSheetHandler.getHandlerStatus() : null,
355
473
  stats: null
356
474
  };
357
475
  }
@@ -408,6 +526,26 @@ class FormulaManager {
408
526
  throw new Error("Failed to copy cell range");
409
527
  }
410
528
  }
529
+ hasCrossSheetReference(formula) {
530
+ return formula.includes("!") || formula.includes("!");
531
+ }
532
+ getCrossSheetDependencies() {
533
+ return this.crossSheetHandler.getCrossSheetDependencies();
534
+ }
535
+ validateCrossSheetFormula(cell) {
536
+ return this.crossSheetHandler.validateCrossSheetFormula(cell);
537
+ }
538
+ validateAllCrossSheetFormulas() {
539
+ return this.crossSheetHandler.validateAllCrossSheetFormulas();
540
+ }
541
+ recalculateAllCrossSheetFormulas() {
542
+ return __awaiter(this, void 0, void 0, (function*() {
543
+ yield this.crossSheetHandler.recalculateAllCrossSheetFormulas();
544
+ }));
545
+ }
546
+ updateCrossSheetOptions(options) {
547
+ this.crossSheetHandler.updateOptions(options);
548
+ }
411
549
  }
412
550
 
413
551
  exports.FormulaManager = FormulaManager;