@univerjs/engine-formula 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (76) hide show
  1. package/lib/cjs/facade.js +9 -5
  2. package/lib/cjs/index.js +1530 -268
  3. package/lib/es/facade.js +9 -5
  4. package/lib/es/index.js +1520 -270
  5. package/lib/facade.js +9 -5
  6. package/lib/index.js +1520 -270
  7. package/lib/types/basics/regex.d.ts +2 -2
  8. package/lib/types/commands/mutations/set-super-table.mutation.d.ts +4 -1
  9. package/lib/types/controllers/super-table-active-dirty.controller.d.ts +22 -0
  10. package/lib/types/engine/analysis/lexer-tree-builder.d.ts +2 -1
  11. package/lib/types/engine/analysis/lexer.d.ts +2 -1
  12. package/lib/types/engine/analysis/parser.d.ts +2 -1
  13. package/lib/types/engine/ast-node/function-node.d.ts +4 -0
  14. package/lib/types/engine/ast-node/operator-node.d.ts +1 -0
  15. package/lib/types/engine/ast-node/prefix-node.d.ts +1 -0
  16. package/lib/types/engine/interpreter/interpreter.d.ts +11 -0
  17. package/lib/types/engine/reference-object/cell-reference-object.d.ts +1 -0
  18. package/lib/types/engine/utils/generate-ast-node.d.ts +1 -1
  19. package/lib/types/engine/utils/math-kit.d.ts +5 -0
  20. package/lib/types/engine/value-object/array-value-object.d.ts +5 -0
  21. package/lib/types/engine/value-object/base-value-object.d.ts +6 -0
  22. package/lib/types/facade/f-formula.d.ts +9 -5
  23. package/lib/types/functions/base-function.d.ts +16 -1
  24. package/lib/types/functions/cube/cubekpimember/index.d.ts +20 -0
  25. package/lib/types/functions/cube/cubemember/index.d.ts +20 -0
  26. package/lib/types/functions/cube/cubememberproperty/index.d.ts +20 -0
  27. package/lib/types/functions/cube/cuberankedmember/index.d.ts +20 -0
  28. package/lib/types/functions/cube/cubeset/index.d.ts +20 -0
  29. package/lib/types/functions/cube/cubesetcount/index.d.ts +20 -0
  30. package/lib/types/functions/cube/cubevalue/index.d.ts +20 -0
  31. package/lib/types/functions/financial/amordegrc/index.d.ts +20 -0
  32. package/lib/types/functions/information/info/index.d.ts +20 -0
  33. package/lib/types/functions/information/isomitted/index.d.ts +20 -0
  34. package/lib/types/functions/logical/function-map.d.ts +3 -2
  35. package/lib/types/functions/logical/function-names.d.ts +2 -0
  36. package/lib/types/functions/logical/groupby/index.d.ts +46 -0
  37. package/lib/types/functions/logical/if/index.d.ts +5 -0
  38. package/lib/types/functions/logical/iferror/index.d.ts +4 -1
  39. package/lib/types/functions/logical/percentof/index.d.ts +27 -0
  40. package/lib/types/functions/lookup/anchorarray/index.d.ts +23 -0
  41. package/lib/types/functions/lookup/function-names.d.ts +1 -0
  42. package/lib/types/functions/lookup/getpivotdata/index.d.ts +20 -0
  43. package/lib/types/functions/lookup/hlookup/index.d.ts +1 -0
  44. package/lib/types/functions/lookup/indirect/index.d.ts +1 -0
  45. package/lib/types/functions/lookup/rtd/index.d.ts +20 -0
  46. package/lib/types/functions/lookup/vlookup/index.d.ts +2 -0
  47. package/lib/types/functions/lookup/xlookup/index.d.ts +2 -0
  48. package/lib/types/functions/math/iso-ceiling/index.d.ts +20 -0
  49. package/lib/types/functions/math/sum/index.d.ts +1 -0
  50. package/lib/types/functions/meta/compare/index.d.ts +1 -0
  51. package/lib/types/functions/not-implemented-function.d.ts +23 -0
  52. package/lib/types/functions/statistical/average/index.d.ts +1 -0
  53. package/lib/types/functions/statistical/countifs/index.d.ts +1 -0
  54. package/lib/types/functions/statistical/forecast-ets/index.d.ts +20 -0
  55. package/lib/types/functions/statistical/forecast-ets-confint/index.d.ts +20 -0
  56. package/lib/types/functions/statistical/forecast-ets-seasonality/index.d.ts +20 -0
  57. package/lib/types/functions/statistical/forecast-ets-stat/index.d.ts +20 -0
  58. package/lib/types/functions/statistical/linest/index.d.ts +1 -0
  59. package/lib/types/functions/text/call/index.d.ts +20 -0
  60. package/lib/types/functions/text/euroconvert/index.d.ts +20 -0
  61. package/lib/types/functions/text/function-names.d.ts +1 -0
  62. package/lib/types/functions/text/phonetic/index.d.ts +20 -0
  63. package/lib/types/functions/text/register-id/index.d.ts +20 -0
  64. package/lib/types/functions/text/textsplit/index.d.ts +1 -0
  65. package/lib/types/functions/web/filterxml/index.d.ts +22 -0
  66. package/lib/types/functions/web/function-map.d.ts +2 -2
  67. package/lib/types/functions/web/webservice/index.d.ts +20 -0
  68. package/lib/types/index.d.ts +3 -1
  69. package/lib/types/models/formula-data.model.d.ts +1 -0
  70. package/lib/types/services/active-dirty-manager.service.d.ts +2 -1
  71. package/lib/types/services/calculate-formula.service.d.ts +2 -2
  72. package/lib/types/services/defined-names.service.d.ts +2 -2
  73. package/lib/types/services/formula-calculation-trigger.service.d.ts +38 -0
  74. package/lib/types/services/runtime.service.d.ts +6 -0
  75. package/lib/umd/index.js +5 -2
  76. package/package.json +5 -5
package/lib/cjs/index.js CHANGED
@@ -508,12 +508,14 @@ var BaseValueObject = class extends ObjectClassType {
508
508
  return ErrorValueObject.create("#NAME?");
509
509
  }
510
510
  concatenate(value, concatenateType = 0) {
511
- let currentValue = this.getValue().toString();
511
+ let currentValue = formatValueForFormulaText(this.getValue());
512
512
  if (typeof value === "string") if (concatenateType === 0) currentValue = value + currentValue;
513
513
  else currentValue += value;
514
- else if (typeof value === "number") if (concatenateType === 0) currentValue = value.toString() + currentValue;
515
- else currentValue += value.toString();
516
- else if (typeof value === "boolean") {
514
+ else if (typeof value === "number") {
515
+ const numberString = formatNumberForFormulaText(value);
516
+ if (concatenateType === 0) currentValue = numberString + currentValue;
517
+ else currentValue += numberString;
518
+ } else if (typeof value === "boolean") {
517
519
  const booleanString = value ? "TRUE" : "FALSE";
518
520
  if (concatenateType === 0) currentValue = booleanString + currentValue;
519
521
  else currentValue += booleanString;
@@ -679,6 +681,16 @@ var BaseValueObject = class extends ObjectClassType {
679
681
  return ErrorValueObject.create("#VALUE!");
680
682
  }
681
683
  };
684
+ function formatValueForFormulaText(value) {
685
+ if (typeof value === "number") return formatNumberForFormulaText(value);
686
+ if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
687
+ return value == null ? "" : value.toString();
688
+ }
689
+ function formatNumberForFormulaText(value) {
690
+ if (!Number.isFinite(value)) return value.toString();
691
+ const rounded = Number(value.toPrecision(15));
692
+ return Object.is(rounded, -0) ? "0" : rounded.toString();
693
+ }
682
694
  const Error_CACHE_LRU_COUNT = 1e3;
683
695
  const ErrorValueObjectCache = new FormulaAstLRU(Error_CACHE_LRU_COUNT);
684
696
  var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
@@ -711,6 +723,12 @@ var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
711
723
  isError() {
712
724
  return true;
713
725
  }
726
+ concatenateFront(_valueObject) {
727
+ return this;
728
+ }
729
+ concatenateBack(_valueObject) {
730
+ return this;
731
+ }
714
732
  };
715
733
 
716
734
  //#endregion
@@ -781,6 +799,43 @@ function parseFormattedDate(value) {
781
799
  function parseFormattedTime(value) {
782
800
  return _univerjs_core.numfmt.parseTime(value);
783
801
  }
802
+ function parseEnglishMonthNameDate(value) {
803
+ const match = value.trim().match(/^(\d{1,2})\s*([A-Za-z]{3,9})\s*(\d{2,4})$/);
804
+ if (!match) return null;
805
+ const [, dayText, monthText, yearText] = match;
806
+ const month = {
807
+ jan: 0,
808
+ january: 0,
809
+ feb: 1,
810
+ february: 1,
811
+ mar: 2,
812
+ march: 2,
813
+ apr: 3,
814
+ april: 3,
815
+ may: 4,
816
+ jun: 5,
817
+ june: 5,
818
+ jul: 6,
819
+ july: 6,
820
+ aug: 7,
821
+ august: 7,
822
+ sep: 8,
823
+ sept: 8,
824
+ september: 8,
825
+ oct: 9,
826
+ october: 9,
827
+ nov: 10,
828
+ november: 10,
829
+ dec: 11,
830
+ december: 11
831
+ }[monthText.toLowerCase()];
832
+ if (month == null) return null;
833
+ const day = Number(dayText);
834
+ const year = Number(yearText.length === 2 ? `20${yearText}` : yearText);
835
+ const date = new Date(Date.UTC(year, month, day));
836
+ if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return null;
837
+ return date;
838
+ }
784
839
  function isDate(format) {
785
840
  return _univerjs_core.numfmt.getFormatInfo(format).isDate;
786
841
  }
@@ -859,6 +914,7 @@ function getDateSerialNumberByObject(serialNumberObject) {
859
914
  let dateSerial;
860
915
  if (parseFormattedDate(`${dateValue}`)) dateSerial = parseFormattedDate(`${dateValue}`).v;
861
916
  else if (parseFormattedTime(`${dateValue}`)) dateSerial = parseFormattedTime(`${dateValue}`).v;
917
+ else if (parseEnglishMonthNameDate(`${dateValue}`)) dateSerial = parseEnglishMonthNameDate(`${dateValue}`);
862
918
  else if ((0, _univerjs_core.isRealNum)(dateValue)) dateSerial = +dateValue;
863
919
  else return ErrorValueObject.create("#VALUE!");
864
920
  if (dateSerial instanceof Date) dateSerial = excelDateTimeSerial(dateSerial);
@@ -906,10 +962,11 @@ function getDaysByNASD(startDateSerialNumber, endDateSerialNumber) {
906
962
  let endYear = endDateSerialNumber > 0 ? endDateDate.getUTCFullYear() : 1900;
907
963
  let endMonth = endDateSerialNumber > 0 ? endDateDate.getUTCMonth() + 1 : 1;
908
964
  let endDay = endDateSerialNumber > 0 ? endDateDate.getUTCDate() : 0;
909
- if (startMonth === 2) {
910
- if (excelSerialToDate(startDateSerialNumber + 1).getUTCMonth() + 1 === 3) startDay = 30;
911
- } else if (startDay === 31) startDay = 30;
912
- if (endDay === 31) if (startDay < 30) {
965
+ const startIsLastDayOfFebruary = startMonth === 2 && startDay === getDaysInMonth(startYear, startMonth - 1);
966
+ if (startIsLastDayOfFebruary) startDay = 30;
967
+ else if (startDay === 31) startDay = 30;
968
+ if (endMonth === 2 && endDay === getDaysInMonth(endYear, endMonth - 1) && startIsLastDayOfFebruary) endDay = 30;
969
+ else if (endDay === 31) if (startDay < 30) {
913
970
  endDateDate = excelSerialToDate(endDateSerialNumber + 1);
914
971
  endYear = endDateDate.getUTCFullYear();
915
972
  endMonth = endDateDate.getUTCMonth() + 1;
@@ -1196,16 +1253,19 @@ var InvertedIndexCache = class {
1196
1253
  };
1197
1254
  const _value = normalizeValue(value);
1198
1255
  if (ERROR_TYPE_SET.has(_value)) result.errorType = _value;
1199
- else if (_value === 0 || _value === DEFAULT_EMPTY_CELL_KEY) {
1256
+ else if (_value === 0) {
1200
1257
  const rows = [];
1201
1258
  const rowsForZero = columnMap.get(0);
1202
1259
  if (rowsForZero) rows.push(...rowsForZero);
1203
1260
  const rowsForEmpty = columnMap.get(DEFAULT_EMPTY_CELL_KEY);
1204
1261
  if (rowsForEmpty) rows.push(...rowsForEmpty);
1205
1262
  result.matchingRows = rows.filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1206
- } else {
1263
+ } else if (_value === DEFAULT_EMPTY_CELL_KEY) {
1207
1264
  var _columnMap$get;
1208
- result.matchingRows = Array.from((_columnMap$get = columnMap.get(_value)) !== null && _columnMap$get !== void 0 ? _columnMap$get : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1265
+ result.matchingRows = Array.from((_columnMap$get = columnMap.get(DEFAULT_EMPTY_CELL_KEY)) !== null && _columnMap$get !== void 0 ? _columnMap$get : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1266
+ } else {
1267
+ var _columnMap$get2;
1268
+ result.matchingRows = Array.from((_columnMap$get2 = columnMap.get(_value)) !== null && _columnMap$get2 !== void 0 ? _columnMap$get2 : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1209
1269
  }
1210
1270
  return result;
1211
1271
  }
@@ -1421,7 +1481,7 @@ const REFERENCE_REGEX_SINGLE_COLUMN = `^${UNIT_NAME_SHEET_NAME_REGEX}\\s*?\\${"$
1421
1481
  const REFERENCE_REGEX_SINGLE_COLUMN_PRECOMPILING = new RegExp(REFERENCE_REGEX_SINGLE_COLUMN);
1422
1482
  const TABLE_NAME_REGEX = "((?![~!@#$%^&*()_+<>?:,./;’,。、‘:“《》?~!@#¥%……()【】\\[\\]\\/\\\\]).)+";
1423
1483
  const TABLE_TITLE_REGEX = "\\[#.+\\]\\s*?,\\s*?";
1424
- const TABLE_CONTENT_REGEX = "\\[((?<!#).)*\\]";
1484
+ const TABLE_CONTENT_REGEX = "\\[((?<!#)[\\s\\S])*\\]";
1425
1485
  const TABLE_MULTIPLE_COLUMN_REGEX = `${TABLE_CONTENT_REGEX}${RANGE_SYMBOL}${TABLE_CONTENT_REGEX}`;
1426
1486
  const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}$`;
1427
1487
  const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
@@ -2000,16 +2060,38 @@ let DefinedNamesService = class DefinedNamesService extends _univerjs_core.Dispo
2000
2060
  getDefinedNameMap(unitId) {
2001
2061
  return this._definedNameMap[unitId];
2002
2062
  }
2003
- getValueByName(unitId, name) {
2004
- const cachedMap = this._nameCacheMap[unitId];
2005
- if (cachedMap) return cachedMap[name.toLowerCase()] || null;
2063
+ getValueByName(unitId, name, sheetId) {
2006
2064
  const nameMap = this._definedNameMap[unitId];
2007
2065
  if (nameMap === void 0) return null;
2066
+ if (sheetId) {
2067
+ var _workbookScope;
2068
+ const normalizedName = name.toLowerCase();
2069
+ let workbookScope = null;
2070
+ let firstMatch = null;
2071
+ for (const item of Object.values(nameMap)) {
2072
+ if (item.name.toLowerCase() !== normalizedName) continue;
2073
+ if (firstMatch == null) firstMatch = item;
2074
+ if (item.localSheetId === sheetId) return item;
2075
+ if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null) {
2076
+ if (workbookScope == null) workbookScope = item;
2077
+ }
2078
+ }
2079
+ return (_workbookScope = workbookScope) !== null && _workbookScope !== void 0 ? _workbookScope : firstMatch;
2080
+ }
2081
+ const cachedMap = this._nameCacheMap[unitId];
2082
+ if (cachedMap) return cachedMap[name.toLowerCase()] || null;
2008
2083
  let result = null;
2009
- for (const item of Object.values(nameMap)) if (item.name === name) {
2084
+ const normalizedName = name.toLowerCase();
2085
+ for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName && (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null)) {
2010
2086
  result = item;
2011
2087
  break;
2012
2088
  }
2089
+ if (!result) {
2090
+ for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName) {
2091
+ result = item;
2092
+ break;
2093
+ }
2094
+ }
2013
2095
  if (result) {
2014
2096
  this._nameCacheMap[unitId] = this._nameCacheMap[unitId] || {};
2015
2097
  this._nameCacheMap[unitId][name.toLowerCase()] = result;
@@ -2044,7 +2126,10 @@ let DefinedNamesService = class DefinedNamesService extends _univerjs_core.Dispo
2044
2126
  return;
2045
2127
  }
2046
2128
  this._nameCacheMap[unitId] = {};
2047
- for (const item of Object.values(nameMap)) this._nameCacheMap[unitId][item.name.toLowerCase()] = item;
2129
+ for (const item of Object.values(nameMap)) {
2130
+ const normalizedName = item.name.toLowerCase();
2131
+ if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null || this._nameCacheMap[unitId][normalizedName] == null) this._nameCacheMap[unitId][normalizedName] = item;
2132
+ }
2048
2133
  }
2049
2134
  _isDeepDefinedNameMapEmpty() {
2050
2135
  for (const unitId in this._definedNameMap) if (this.hasDefinedName(unitId)) return false;
@@ -2617,6 +2702,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2617
2702
  FUNCTION_NAMES_LOGICAL["BYCOL"] = "BYCOL";
2618
2703
  FUNCTION_NAMES_LOGICAL["BYROW"] = "BYROW";
2619
2704
  FUNCTION_NAMES_LOGICAL["FALSE"] = "FALSE";
2705
+ FUNCTION_NAMES_LOGICAL["GROUPBY"] = "GROUPBY";
2620
2706
  FUNCTION_NAMES_LOGICAL["IF"] = "IF";
2621
2707
  FUNCTION_NAMES_LOGICAL["IFERROR"] = "IFERROR";
2622
2708
  FUNCTION_NAMES_LOGICAL["IFNA"] = "IFNA";
@@ -2627,6 +2713,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2627
2713
  FUNCTION_NAMES_LOGICAL["MAP"] = "MAP";
2628
2714
  FUNCTION_NAMES_LOGICAL["NOT"] = "NOT";
2629
2715
  FUNCTION_NAMES_LOGICAL["OR"] = "OR";
2716
+ FUNCTION_NAMES_LOGICAL["PERCENTOF"] = "PERCENTOF";
2630
2717
  FUNCTION_NAMES_LOGICAL["REDUCE"] = "REDUCE";
2631
2718
  FUNCTION_NAMES_LOGICAL["SCAN"] = "SCAN";
2632
2719
  FUNCTION_NAMES_LOGICAL["SWITCH"] = "SWITCH";
@@ -2654,6 +2741,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2654
2741
  */
2655
2742
  let FUNCTION_NAMES_LOOKUP = /* @__PURE__ */ function(FUNCTION_NAMES_LOOKUP) {
2656
2743
  FUNCTION_NAMES_LOOKUP["ADDRESS"] = "ADDRESS";
2744
+ FUNCTION_NAMES_LOOKUP["ANCHORARRAY"] = "ANCHORARRAY";
2657
2745
  FUNCTION_NAMES_LOOKUP["AREAS"] = "AREAS";
2658
2746
  FUNCTION_NAMES_LOOKUP["CHOOSE"] = "CHOOSE";
2659
2747
  FUNCTION_NAMES_LOOKUP["CHOOSECOLS"] = "CHOOSECOLS";
@@ -2976,6 +3064,7 @@ let FUNCTION_NAMES_TEXT = /* @__PURE__ */ function(FUNCTION_NAMES_TEXT) {
2976
3064
  FUNCTION_NAMES_TEXT["PROPER"] = "PROPER";
2977
3065
  FUNCTION_NAMES_TEXT["REGEXEXTRACT"] = "REGEXEXTRACT";
2978
3066
  FUNCTION_NAMES_TEXT["REGEXMATCH"] = "REGEXMATCH";
3067
+ FUNCTION_NAMES_TEXT["REGEXTEST"] = "REGEXTEST";
2979
3068
  FUNCTION_NAMES_TEXT["REGEXREPLACE"] = "REGEXREPLACE";
2980
3069
  FUNCTION_NAMES_TEXT["REPLACE"] = "REPLACE";
2981
3070
  FUNCTION_NAMES_TEXT["REPLACEB"] = "REPLACEB";
@@ -3087,6 +3176,7 @@ const NEW_EXCEL_FUNCTIONS = /* @__PURE__ */ new Set([
3087
3176
  "SHEETS",
3088
3177
  "IFNA",
3089
3178
  "IFS",
3179
+ "GROUPBY",
3090
3180
  "SWITCH",
3091
3181
  "XOR",
3092
3182
  "BETA.DIST",
@@ -3181,7 +3271,7 @@ function deserializeRangeWithSheetWithCache(refString) {
3181
3271
  if (refCache) return refCache;
3182
3272
  const result = deserializeRangeWithSheet(refString);
3183
3273
  referenceToRangeCache.set(refString, result);
3184
- return deserializeRangeWithSheet(refString);
3274
+ return result;
3185
3275
  }
3186
3276
  function clearReferenceToRangeCache() {
3187
3277
  referenceToRangeCache.clear();
@@ -3740,7 +3830,7 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
3740
3830
  return this._currentLexerNode;
3741
3831
  }
3742
3832
  _handleDefinedName(sequenceArray, param) {
3743
- const { unitId, getValueByName, getSheetName } = param;
3833
+ const { unitId, sheetId, getValueByName, getSheetName } = param;
3744
3834
  if (unitId == null) return {
3745
3835
  sequenceString: "",
3746
3836
  hasDefinedName: false,
@@ -3760,14 +3850,15 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
3760
3850
  let token = tokenRaw;
3761
3851
  if (nodeType === 4 || nodeType === 3) {
3762
3852
  if (nodeType === 3) token = this._getHasSheetNameDefinedName(tokenRaw, unitId, param);
3763
- const definedContent = getValueByName(unitId, token);
3853
+ const definedNameToken = token.trim();
3854
+ const definedContent = getValueByName(unitId, definedNameToken, sheetId);
3764
3855
  if (definedContent) {
3765
3856
  const refString = definedContent.formulaOrRefString;
3766
3857
  const nestedDefinedNameParam = this._handleNestedDefinedName(refString, param);
3767
3858
  if (nestedDefinedNameParam == null || typeof nestedDefinedNameParam !== "object") {
3768
3859
  sequenceString += nestedDefinedNameParam || "#NAME?";
3769
3860
  hasDefinedName = true;
3770
- definedNames.push(token);
3861
+ definedNames.push(definedNameToken);
3771
3862
  } else if (typeof nestedDefinedNameParam === "object") {
3772
3863
  const { sequenceString: nestedSequenceString, definedNames: nestedDefinedNames } = nestedDefinedNameParam;
3773
3864
  sequenceString += nestedSequenceString;
@@ -3776,10 +3867,10 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
3776
3867
  });
3777
3868
  hasDefinedName = true;
3778
3869
  }
3779
- } else if (this._checkDefinedNameDirty(token, param)) {
3870
+ } else if (this._checkDefinedNameDirty(definedNameToken, param)) {
3780
3871
  sequenceString += "#NAME?";
3781
3872
  hasDefinedName = true;
3782
- definedNames.push(token);
3873
+ definedNames.push(definedNameToken);
3783
3874
  } else sequenceString += token;
3784
3875
  } else sequenceString += token;
3785
3876
  }
@@ -4193,7 +4284,7 @@ var LexerTreeBuilder = class extends _univerjs_core.Disposable {
4193
4284
  }
4194
4285
  }
4195
4286
  _nodeMaker(formulaStringRaw, sequenceArray, matchCurrentNodeIndex) {
4196
- let formulaString = formulaStringRaw.replace(/\r\n$|\r|\n/g, " ");
4287
+ let formulaString = formulaStringRaw.replace(/(?:\r\n|\r|\n)$/g, " ");
4197
4288
  if (formulaString.substring(0, 1) === "=") formulaString = formulaString.substring(1);
4198
4289
  const formulaChars = formulaString.split("");
4199
4290
  const charsCount = formulaChars.length;
@@ -4947,7 +5038,9 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
4947
5038
  for (let j = 0; j < worksheets.length; j++) {
4948
5039
  const worksheet = worksheets[j];
4949
5040
  const cellMatrix = worksheet.getCellMatrix();
4950
- initSheetFormulaData(formulaData, unitId, worksheet.getSheetId(), cellMatrix);
5041
+ const sheetId = worksheet.getSheetId();
5042
+ this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
5043
+ initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
4951
5044
  }
4952
5045
  }
4953
5046
  const allBases = this._univerInstanceService.getAllUnitsForType(_univerjs_core.UniverInstanceType.UNIVER_BASE);
@@ -4959,7 +5052,6 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
4959
5052
  const tables = Object.values(snapshot.tables);
4960
5053
  for (let j = 0; j < tables.length; j++) {
4961
5054
  const table = tables[j];
4962
- if (table.deleted) continue;
4963
5055
  const tableFormulaData = {};
4964
5056
  const recordOrder = table.recordOrder;
4965
5057
  if (!recordOrder) {
@@ -4968,13 +5060,12 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
4968
5060
  }
4969
5061
  for (let row = 0; row < recordOrder.length; row++) {
4970
5062
  const recordId = recordOrder[row];
4971
- const record = table.records[recordId];
4972
- if (!record || record.deleted) continue;
5063
+ if (!table.records[recordId]) continue;
4973
5064
  for (let col = 0; col < table.fieldOrder.length; col++) {
4974
5065
  var _field$config$formula, _field$config, _row, _tableFormulaData$_ro;
4975
5066
  const fieldId = table.fieldOrder[col];
4976
5067
  const field = table.fields[fieldId];
4977
- if (!field || field.deleted || field.type !== "formula") continue;
5068
+ if (!field || field.type !== "formula") continue;
4978
5069
  const formula = String((_field$config$formula = (_field$config = field.config) === null || _field$config === void 0 ? void 0 : _field$config.formula) !== null && _field$config$formula !== void 0 ? _field$config$formula : "").trim();
4979
5070
  if (!formula) continue;
4980
5071
  (_tableFormulaData$_ro = tableFormulaData[_row = row]) !== null && _tableFormulaData$_ro !== void 0 || (tableFormulaData[_row] = {});
@@ -4996,7 +5087,9 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
4996
5087
  formulaData[unitId] = {};
4997
5088
  const worksheet = workbook.getSheetBySheetId(sheetId);
4998
5089
  if (worksheet == null) return {};
4999
- initSheetFormulaData(formulaData, unitId, sheetId, worksheet.getCellMatrix());
5090
+ const cellMatrix = worksheet.getCellMatrix();
5091
+ this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
5092
+ initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
5000
5093
  return formulaData[unitId][sheetId];
5001
5094
  }
5002
5095
  getArrayFormulaRange() {
@@ -5096,18 +5189,12 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
5096
5189
  const unitId = base.getUnitId();
5097
5190
  const baseData = {};
5098
5191
  const tableNameMap = {};
5099
- for (const table of Object.values(snapshot.tables).filter((item) => !item.deleted)) {
5100
- var _table$recordOrder$fi, _table$recordOrder;
5192
+ for (const table of Object.values(snapshot.tables)) {
5193
+ var _table$recordOrder$le, _table$recordOrder;
5101
5194
  baseData[table.id] = {
5102
5195
  cellData: new _univerjs_core.ObjectMatrix(buildBaseRuntimeCellData(table)),
5103
- rowCount: (_table$recordOrder$fi = (_table$recordOrder = table.recordOrder) === null || _table$recordOrder === void 0 ? void 0 : _table$recordOrder.filter((recordId) => {
5104
- var _table$records$record;
5105
- return !((_table$records$record = table.records[recordId]) === null || _table$records$record === void 0 ? void 0 : _table$records$record.deleted);
5106
- }).length) !== null && _table$recordOrder$fi !== void 0 ? _table$recordOrder$fi : 0,
5107
- columnCount: table.fieldOrder.filter((fieldId) => {
5108
- var _table$fields$fieldId;
5109
- return !((_table$fields$fieldId = table.fields[fieldId]) === null || _table$fields$fieldId === void 0 ? void 0 : _table$fields$fieldId.deleted);
5110
- }).length,
5196
+ rowCount: (_table$recordOrder$le = (_table$recordOrder = table.recordOrder) === null || _table$recordOrder === void 0 ? void 0 : _table$recordOrder.length) !== null && _table$recordOrder$le !== void 0 ? _table$recordOrder$le : 0,
5197
+ columnCount: table.fieldOrder.length,
5111
5198
  rowData: {},
5112
5199
  columnData: {}
5113
5200
  };
@@ -5293,7 +5380,7 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
5293
5380
  for (const unitId in formulaData) {
5294
5381
  const workbook = formulaData[unitId];
5295
5382
  if (!workbook) continue;
5296
- const workbookInstance = this._univerInstanceService.getUnit(unitId);
5383
+ const workbookInstance = this._univerInstanceService.getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_SHEET);
5297
5384
  if (!workbookInstance) continue;
5298
5385
  for (const sheetId in workbook) {
5299
5386
  const sheet = workbook[sheetId];
@@ -5307,7 +5394,7 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
5307
5394
  const column = Number(columnStr);
5308
5395
  const currentCell = sheetInstance.getCellRaw(row, column);
5309
5396
  const isFormula = (0, _univerjs_core.isFormulaString)(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f) || (0, _univerjs_core.isFormulaId)(currentCell === null || currentCell === void 0 ? void 0 : currentCell.si);
5310
- const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === "" || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === "0";
5397
+ const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null;
5311
5398
  if (!(isFormula && noValue)) continue;
5312
5399
  if (!columnRanges[column]) columnRanges[column] = [];
5313
5400
  const lastRange = columnRanges[column].slice(-1)[0];
@@ -5356,6 +5443,39 @@ let FormulaDataModel = class FormulaDataModel extends _univerjs_core.Disposable
5356
5443
  });
5357
5444
  return formulaIdMap;
5358
5445
  }
5446
+ _initSheetArrayFormulaData(unitId, sheetId, cellMatrix) {
5447
+ let arrayFormulaRangeMatrix;
5448
+ let arrayFormulaCellDataMatrix;
5449
+ const formulaIds = /* @__PURE__ */ new Set();
5450
+ cellMatrix.forValue((_, __, cell) => {
5451
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5452
+ if ((0, _univerjs_core.isFormulaString)(cell === null || cell === void 0 ? void 0 : cell.f) && (0, _univerjs_core.isFormulaId)(formulaId)) formulaIds.add(String(formulaId));
5453
+ });
5454
+ cellMatrix.forValue((row, column, cell) => {
5455
+ var _arrayFormulaRangeMat, _this$_arrayFormulaRa7, _arrayFormulaCellData, _this$_arrayFormulaCe5;
5456
+ const ref = cell === null || cell === void 0 ? void 0 : cell.ref;
5457
+ const formula = cell === null || cell === void 0 ? void 0 : cell.f;
5458
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5459
+ const hasOwnFormula = (0, _univerjs_core.isFormulaString)(formula);
5460
+ const hasSharedFormula = (0, _univerjs_core.isFormulaId)(formulaId) && formulaIds.has(String(formulaId));
5461
+ if (!hasOwnFormula && !hasSharedFormula || typeof ref !== "string" || ref.length === 0) return true;
5462
+ const { range } = deserializeRangeWithSheet(ref);
5463
+ if (!Number.isFinite(range.startRow) || !Number.isFinite(range.startColumn) || !Number.isFinite(range.endRow) || !Number.isFinite(range.endColumn)) return true;
5464
+ if (range.startRow === row && range.endRow === row && range.startColumn === column && range.endColumn === column && !isArrayConstantFormula(formula)) return true;
5465
+ if (!this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId] = {};
5466
+ if (!this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId] = {};
5467
+ (_arrayFormulaRangeMat = arrayFormulaRangeMatrix) !== null && _arrayFormulaRangeMat !== void 0 || (arrayFormulaRangeMatrix = new _univerjs_core.ObjectMatrix((_this$_arrayFormulaRa7 = this._arrayFormulaRange[unitId]) === null || _this$_arrayFormulaRa7 === void 0 ? void 0 : _this$_arrayFormulaRa7[sheetId]));
5468
+ (_arrayFormulaCellData = arrayFormulaCellDataMatrix) !== null && _arrayFormulaCellData !== void 0 || (arrayFormulaCellDataMatrix = new _univerjs_core.ObjectMatrix((_this$_arrayFormulaCe5 = this._arrayFormulaCellData[unitId]) === null || _this$_arrayFormulaCe5 === void 0 ? void 0 : _this$_arrayFormulaCe5[sheetId]));
5469
+ if (arrayFormulaRangeMatrix.getValue(row, column) == null) arrayFormulaRangeMatrix.setValue(row, column, range);
5470
+ for (let r = range.startRow; r <= range.endRow; r++) for (let c = range.startColumn; c <= range.endColumn; c++) {
5471
+ if (arrayFormulaCellDataMatrix.getValue(r, c) != null) continue;
5472
+ const rangeCell = cellMatrix.getValue(r, c);
5473
+ if (rangeCell != null) arrayFormulaCellDataMatrix.setValue(r, c, { ...rangeCell });
5474
+ }
5475
+ });
5476
+ if (arrayFormulaRangeMatrix && this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId][sheetId] = arrayFormulaRangeMatrix.getData();
5477
+ if (arrayFormulaCellDataMatrix && this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId][sheetId] = arrayFormulaCellDataMatrix.getData();
5478
+ }
5359
5479
  };
5360
5480
  FormulaDataModel = __decorate([__decorateParam(0, _univerjs_core.IUniverInstanceService), __decorateParam(1, (0, _univerjs_core.Inject)(LexerTreeBuilder))], FormulaDataModel);
5361
5481
  function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
@@ -5390,9 +5510,9 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
5390
5510
  if ((0, _univerjs_core.isFormulaId)(formulaId) && !(0, _univerjs_core.isFormulaString)(formulaString)) {
5391
5511
  const formulaInfo = formulaIdMap.get(formulaId);
5392
5512
  if (formulaInfo) {
5393
- const f = formulaInfo.f;
5394
5513
  const x = c - formulaInfo.c;
5395
5514
  const y = r - formulaInfo.r;
5515
+ const f = formulaInfo.f;
5396
5516
  sheetFormulaDataMatrix.setValue(r, c, {
5397
5517
  f,
5398
5518
  si: formulaId,
@@ -5427,12 +5547,9 @@ function createEngineThisRowRef(table, fieldName, snapshot) {
5427
5547
  function getEngineBaseTableName(table, snapshot) {
5428
5548
  const tables = Object.values(snapshot.tables);
5429
5549
  let sameNameCount = 0;
5430
- for (let i = 0; i < tables.length; i++) {
5431
- const item = tables[i];
5432
- if (!item.deleted && item.name === table.name) {
5433
- sameNameCount++;
5434
- if (sameNameCount > 1) break;
5435
- }
5550
+ for (let i = 0; i < tables.length; i++) if (tables[i].name === table.name) {
5551
+ sameNameCount++;
5552
+ if (sameNameCount > 1) break;
5436
5553
  }
5437
5554
  return sameNameCount === 1 ? table.name : table.id;
5438
5555
  }
@@ -5441,14 +5558,14 @@ function buildBaseRuntimeCellData(table) {
5441
5558
  const fieldOrder = [];
5442
5559
  for (let i = 0; i < table.fieldOrder.length; i++) {
5443
5560
  const fieldId = table.fieldOrder[i];
5444
- if (table.fields[fieldId] && !table.fields[fieldId].deleted) fieldOrder.push(fieldId);
5561
+ if (table.fields[fieldId]) fieldOrder.push(fieldId);
5445
5562
  }
5446
5563
  let recordOrder;
5447
5564
  if (table.recordOrder) {
5448
5565
  recordOrder = [];
5449
5566
  for (let i = 0; i < table.recordOrder.length; i++) {
5450
5567
  const recordId = table.recordOrder[i];
5451
- if (table.records[recordId] && !table.records[recordId].deleted) recordOrder.push(recordId);
5568
+ if (table.records[recordId]) recordOrder.push(recordId);
5452
5569
  }
5453
5570
  } else {
5454
5571
  var _table$records;
@@ -5456,7 +5573,7 @@ function buildBaseRuntimeCellData(table) {
5456
5573
  const records = [];
5457
5574
  for (let i = 0; i < allRecords.length; i++) {
5458
5575
  const record = allRecords[i];
5459
- if (!record.deleted) records.push(record);
5576
+ records.push(record);
5460
5577
  }
5461
5578
  records.sort((a, b) => a.orderKey.localeCompare(b.orderKey));
5462
5579
  recordOrder = [];
@@ -5468,7 +5585,7 @@ function buildBaseRuntimeCellData(table) {
5468
5585
  for (let row = 0; row < recordOrder.length; row++) {
5469
5586
  const recordId = recordOrder[row];
5470
5587
  const record = table.records[recordId];
5471
- if (!record || record.deleted) continue;
5588
+ if (!record) continue;
5472
5589
  cellData[row] = { ...cellData[row] };
5473
5590
  for (let col = 0; col < fieldOrder.length; col++) {
5474
5591
  var _record$values;
@@ -5520,14 +5637,17 @@ function inferBaseRuntimeCellType(value) {
5520
5637
  if (typeof value === "string") return _univerjs_core.CellValueType.STRING;
5521
5638
  return null;
5522
5639
  }
5640
+ function isArrayConstantFormula(formula) {
5641
+ return typeof formula === "string" && /^=\s*\{/.test(formula);
5642
+ }
5523
5643
  function isBaseCellData(value) {
5524
5644
  return !!value && typeof value === "object" && (Object.prototype.hasOwnProperty.call(value, "v") || Object.prototype.hasOwnProperty.call(value, "t") || Object.prototype.hasOwnProperty.call(value, "p") || Object.prototype.hasOwnProperty.call(value, "f") || Object.prototype.hasOwnProperty.call(value, "si"));
5525
5645
  }
5526
5646
  function resolveBaseFormulaTable(tableName, currentTable, snapshot) {
5527
5647
  if (!tableName || tableName === "table" || tableName === currentTable.id || tableName === currentTable.name) return currentTable;
5528
5648
  const byId = snapshot.tables[tableName];
5529
- if (byId && !byId.deleted) return byId;
5530
- const matches = Object.values(snapshot.tables).filter((table) => !table.deleted && table.name === tableName);
5649
+ if (byId) return byId;
5650
+ const matches = Object.values(snapshot.tables).filter((table) => table.name === tableName);
5531
5651
  return matches.length === 1 ? matches[0] : void 0;
5532
5652
  }
5533
5653
 
@@ -5788,7 +5908,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends _uni
5788
5908
  const workbook = this._univerInstanceService.getCurrentUnitOfType(_univerjs_core.UniverInstanceType.UNIVER_SHEET);
5789
5909
  const worksheet = workbook === null || workbook === void 0 ? void 0 : workbook.getActiveSheet();
5790
5910
  const base = workbook ? null : this._univerInstanceService.getCurrentUnitOfType(_univerjs_core.UniverInstanceType.UNIVER_BASE);
5791
- const table = base ? getFirstLiveBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
5911
+ const table = base ? getFirstBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
5792
5912
  this._executeUnitId = (_workbook$getUnitId = workbook === null || workbook === void 0 ? void 0 : workbook.getUnitId()) !== null && _workbook$getUnitId !== void 0 ? _workbook$getUnitId : base === null || base === void 0 ? void 0 : base.getUnitId();
5793
5913
  this._executeSubUnitId = (_worksheet$getSheetId = worksheet === null || worksheet === void 0 ? void 0 : worksheet.getSheetId()) !== null && _worksheet$getSheetId !== void 0 ? _worksheet$getSheetId : table === null || table === void 0 ? void 0 : table.id;
5794
5914
  return this._formulaDataModel.getCalculateData();
@@ -5821,33 +5941,18 @@ FormulaCurrentConfigService = __decorate([
5821
5941
  __decorateParam(2, (0, _univerjs_core.Inject)(FormulaDataModel)),
5822
5942
  __decorateParam(3, (0, _univerjs_core.Inject)(ISheetRowFilteredService))
5823
5943
  ], FormulaCurrentConfigService);
5824
- function getFirstLiveBaseTable(tables, tableOrder) {
5825
- var _Object$values$find;
5944
+ function getFirstBaseTable(tables, tableOrder) {
5945
+ var _Object$values$;
5826
5946
  for (const tableId of tableOrder) {
5827
5947
  const table = tables[tableId];
5828
- if (table && !table.deleted) return table;
5948
+ if (table) return table;
5829
5949
  }
5830
- return (_Object$values$find = Object.values(tables).find((table) => !table.deleted)) !== null && _Object$values$find !== void 0 ? _Object$values$find : null;
5950
+ return (_Object$values$ = Object.values(tables)[0]) !== null && _Object$values$ !== void 0 ? _Object$values$ : null;
5831
5951
  }
5832
5952
  const IFormulaCurrentConfigService = (0, _univerjs_core.createIdentifier)("univer.formula.current-data.service");
5833
5953
 
5834
5954
  //#endregion
5835
5955
  //#region src/engine/analysis/lexer.ts
5836
- /**
5837
- * Copyright 2023-present DreamNum Co., Ltd.
5838
- *
5839
- * Licensed under the Apache License, Version 2.0 (the "License");
5840
- * you may not use this file except in compliance with the License.
5841
- * You may obtain a copy of the License at
5842
- *
5843
- * http://www.apache.org/licenses/LICENSE-2.0
5844
- *
5845
- * Unless required by applicable law or agreed to in writing, software
5846
- * distributed under the License is distributed on an "AS IS" BASIS,
5847
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5848
- * See the License for the specific language governing permissions and
5849
- * limitations under the License.
5850
- */
5851
5956
  let Lexer = class Lexer extends _univerjs_core.Disposable {
5852
5957
  constructor(_definedNamesService, _lexerTreeBuilder, _formulaCurrentConfigService) {
5853
5958
  super();
@@ -5855,10 +5960,11 @@ let Lexer = class Lexer extends _univerjs_core.Disposable {
5855
5960
  this._lexerTreeBuilder = _lexerTreeBuilder;
5856
5961
  this._formulaCurrentConfigService = _formulaCurrentConfigService;
5857
5962
  }
5858
- treeBuilder(formulaString, transformSuffix = true) {
5963
+ treeBuilder(formulaString, transformSuffix = true, unitId) {
5859
5964
  if (this._definedNamesService.getAllDefinedNamesIsEmpty()) return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix);
5860
5965
  return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix, {
5861
- unitId: this._formulaCurrentConfigService.getExecuteUnitId(),
5966
+ unitId: unitId !== null && unitId !== void 0 ? unitId : this._formulaCurrentConfigService.getExecuteUnitId(),
5967
+ sheetId: this._formulaCurrentConfigService.getExecuteSubUnitId(),
5862
5968
  getValueByName: this._definedNamesService.getValueByName.bind(this._definedNamesService),
5863
5969
  getDirtyDefinedNameMap: this._formulaCurrentConfigService.getDirtyDefinedNameMap.bind(this._formulaCurrentConfigService),
5864
5970
  getSheetName: this._formulaCurrentConfigService.getSheetName.bind(this._formulaCurrentConfigService)
@@ -5880,10 +5986,13 @@ function getCellValue(cell) {
5880
5986
  const body = cell === null || cell === void 0 ? void 0 : cell.p.body;
5881
5987
  if (body == null) return 0;
5882
5988
  const data = body.dataStream;
5883
- return _univerjs_core.BuildTextUtils.transform.getPlainText(data);
5989
+ return normalizeRichTextFormulaValue(_univerjs_core.BuildTextUtils.transform.getPlainText(data));
5884
5990
  }
5885
5991
  return (_cell$v = cell === null || cell === void 0 ? void 0 : cell.v) !== null && _cell$v !== void 0 ? _cell$v : 0;
5886
5992
  }
5993
+ function normalizeRichTextFormulaValue(value) {
5994
+ return value.replace(/\r\n|\r|\n/g, "\r\n");
5995
+ }
5887
5996
  /**
5888
5997
  * Extract the formula error from the cell
5889
5998
  * @param cell
@@ -6122,24 +6231,16 @@ function reverseCompareOperator(operator) {
6122
6231
  Reference https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
6123
6232
  */
6124
6233
  function plus(a, b) {
6125
- const result = a + b;
6126
- if (Number.isSafeInteger(result)) return result;
6127
- return new decimal_js.default(a).add(b).toNumber();
6234
+ return a + b;
6128
6235
  }
6129
6236
  function minus(a, b) {
6130
- const result = a - b;
6131
- if (Number.isSafeInteger(result)) return result;
6132
- return new decimal_js.default(a).sub(b).toNumber();
6237
+ return a - b;
6133
6238
  }
6134
6239
  function multiply(a, b) {
6135
- const result = a * b;
6136
- if (Number.isSafeInteger(result)) return result;
6137
- return new decimal_js.default(a).mul(b).toNumber();
6240
+ return a * b;
6138
6241
  }
6139
6242
  function divide(a, b) {
6140
- const result = a / b;
6141
- if (Number.isSafeInteger(result)) return result;
6142
- return new decimal_js.default(a).div(b).toNumber();
6243
+ return a / b;
6143
6244
  }
6144
6245
  /**
6145
6246
  * Rounds a number to a specified number of decimal places.
@@ -6211,7 +6312,7 @@ function sqrt(base) {
6211
6312
  * @returns True if numbers are equal, false otherwise.
6212
6313
  */
6213
6314
  function equals(a, b) {
6214
- return a === b;
6315
+ return a === b || stripErrorMargin(a) === stripErrorMargin(b);
6215
6316
  }
6216
6317
  /**
6217
6318
  * Checks if the first number is greater than the second number.
@@ -6220,7 +6321,7 @@ function equals(a, b) {
6220
6321
  * @returns True if a is greater than b, false otherwise.
6221
6322
  */
6222
6323
  function greaterThan(a, b) {
6223
- return a > b;
6324
+ return !equals(a, b) && stripErrorMargin(a) > stripErrorMargin(b);
6224
6325
  }
6225
6326
  /**
6226
6327
  * Checks if the first number is greater than or equal to the second number.
@@ -6229,7 +6330,7 @@ function greaterThan(a, b) {
6229
6330
  * @returns True if a is greater than or equal to b, false otherwise.
6230
6331
  */
6231
6332
  function greaterThanOrEquals(a, b) {
6232
- return a >= b;
6333
+ return equals(a, b) || stripErrorMargin(a) > stripErrorMargin(b);
6233
6334
  }
6234
6335
  /**
6235
6336
  * Checks if the first number is less than the second number.
@@ -6238,7 +6339,7 @@ function greaterThanOrEquals(a, b) {
6238
6339
  * @returns True if a is less than b, false otherwise.
6239
6340
  */
6240
6341
  function lessThan(a, b) {
6241
- return a < b;
6342
+ return !equals(a, b) && stripErrorMargin(a) < stripErrorMargin(b);
6242
6343
  }
6243
6344
  /**
6244
6345
  * Checks if the first number is less than or equal to the second number.
@@ -6247,7 +6348,7 @@ function lessThan(a, b) {
6247
6348
  * @returns True if a is less than or equal to b, false otherwise.
6248
6349
  */
6249
6350
  function lessThanOrEquals(a, b) {
6250
- return a <= b;
6351
+ return equals(a, b) || stripErrorMargin(a) < stripErrorMargin(b);
6251
6352
  }
6252
6353
  /**
6253
6354
  * Complete the number to the specified accuracy and solve the accuracy error,
@@ -6515,8 +6616,8 @@ var BooleanValueObject = class BooleanValueObject extends BaseValueObject {
6515
6616
  case ">=": return true;
6516
6617
  case "=":
6517
6618
  case "<":
6518
- case "<=":
6519
- case "<>": return false;
6619
+ case "<=": return false;
6620
+ case "<>": return true;
6520
6621
  }
6521
6622
  }
6522
6623
  concatenateFront(valueObject) {
@@ -7138,12 +7239,13 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
7138
7239
  return BooleanValueObject.create(result);
7139
7240
  }
7140
7241
  _compareString(currentValue, value, operator) {
7242
+ const compareResult = currentValue.localeCompare(value);
7141
7243
  switch (operator) {
7142
7244
  case "=": return currentValue === value;
7143
- case ">": return currentValue > value;
7144
- case ">=": return currentValue >= value;
7145
- case "<": return currentValue < value;
7146
- case "<=": return currentValue <= value;
7245
+ case ">": return compareResult > 0;
7246
+ case ">=": return currentValue === value || compareResult > 0;
7247
+ case "<": return compareResult < 0;
7248
+ case "<=": return currentValue === value || compareResult < 0;
7147
7249
  case "<>": return currentValue !== value;
7148
7250
  }
7149
7251
  }
@@ -7169,6 +7271,7 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
7169
7271
  }
7170
7272
  convertToNumberObjectValue() {
7171
7273
  const rawValue = this.getValue();
7274
+ if (rawValue.trim() === "") return ErrorValueObject.create("#VALUE!");
7172
7275
  const parseData = (0, _univerjs_core.getNumfmtParseValueFilter)(rawValue);
7173
7276
  if (parseData && parseData.z) return createNumberValueObjectByRawValue(parseData.v, parseData.z);
7174
7277
  return createNumberValueObjectByRawValue(rawValue);
@@ -7277,6 +7380,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7277
7380
  _defineProperty(this, "_sheetId", "");
7278
7381
  _defineProperty(this, "_currentRow", -1);
7279
7382
  _defineProperty(this, "_currentColumn", -1);
7383
+ _defineProperty(this, "_useInvertedIndexCache", false);
7384
+ _defineProperty(this, "_legacyImplicitForAggregate", false);
7280
7385
  _defineProperty(this, "_sliceCache", /* @__PURE__ */ new Map());
7281
7386
  _defineProperty(this, "_flattenCache", void 0);
7282
7387
  _defineProperty(this, "_defaultValue", null);
@@ -7328,6 +7433,15 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7328
7433
  getCurrentColumn() {
7329
7434
  return this._currentColumn;
7330
7435
  }
7436
+ usesInvertedIndexCache() {
7437
+ return this._useInvertedIndexCache;
7438
+ }
7439
+ usesLegacyImplicitForAggregate() {
7440
+ return this._legacyImplicitForAggregate;
7441
+ }
7442
+ setLegacyImplicitForAggregate(value) {
7443
+ this._legacyImplicitForAggregate = value;
7444
+ }
7331
7445
  getArrayValue() {
7332
7446
  return this._values;
7333
7447
  }
@@ -7594,6 +7708,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7594
7708
  if (itemValue == null || itemValue.isNull()) return true;
7595
7709
  let matchObject;
7596
7710
  if (isFuzzyMatching === true) matchObject = itemValue.compare(valueObject, "=");
7711
+ else if (searchType === 0 && itemValue.isNumber() && valueObject.isNumber()) matchObject = BooleanValueObject.create(Number(itemValue.getValue()) === Number(valueObject.getValue()));
7597
7712
  else matchObject = itemValue.isEqual(valueObject);
7598
7713
  if ((matchObject === null || matchObject === void 0 ? void 0 : matchObject.getValue()) === true) {
7599
7714
  result = itemValue;
@@ -7716,7 +7831,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7716
7831
  return false;
7717
7832
  }
7718
7833
  if (valueObject.isString() || valueObject.isNull() || valueObject.isBoolean()) return true;
7719
- if (accumulatorAll.isLessThan(valueObject).getValue()) accumulatorAll = valueObject;
7834
+ if (Number(accumulatorAll.getValue()) < Number(valueObject.getValue())) accumulatorAll = valueObject;
7720
7835
  });
7721
7836
  return accumulatorAll;
7722
7837
  }
@@ -7757,7 +7872,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7757
7872
  return accumulatorAll;
7758
7873
  }
7759
7874
  getNegative() {
7760
- return ArrayValueObject.create("{0}").minus(this);
7875
+ return this.mapValue((valueObject) => NumberValueObject.create(0).minus(valueObject));
7761
7876
  }
7762
7877
  getReciprocal() {
7763
7878
  return ArrayValueObject.create("{1}").divided(this);
@@ -7809,12 +7924,10 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7809
7924
  for (let c = 0; c < columnCount; c++) {
7810
7925
  var _this$_values;
7811
7926
  const row = (_this$_values = this._values) === null || _this$_values === void 0 ? void 0 : _this$_values[r];
7812
- if (row == null) rowList[c] = ErrorValueObject.create("#VALUE!");
7813
- else {
7814
- const currentValue = row[c] || this._defaultValue;
7815
- if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
7816
- else rowList[c] = NullValueObject.create();
7817
- }
7927
+ const currentValue = this.getValueOrDefault(r, c);
7928
+ if (row == null && currentValue == null) rowList[c] = ErrorValueObject.create("#VALUE!");
7929
+ else if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
7930
+ else rowList[c] = NullValueObject.create();
7818
7931
  }
7819
7932
  result.push(rowList);
7820
7933
  }
@@ -8124,7 +8237,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8124
8237
  * If comparison operations are conducted for a single numerical value,
8125
8238
  * then retrieve the judgment from the inverted index. This enhances performance.
8126
8239
  */
8127
- if (batchOperatorType === 5) {
8240
+ if (batchOperatorType === 5 && this._useInvertedIndexCache) {
8128
8241
  const { rowsInCache, rowsNotInCache } = CELL_INVERTED_INDEX_CACHE.canUseCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8129
8242
  if (rowsInCache.length > 0) {
8130
8243
  if (operator === "=" && !(valueObject.isString() && isWildcard(valueObject.getValue()))) {
@@ -8158,13 +8271,13 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8158
8271
  if (rowsNotInCache.length > 0) for (const interval of rowsNotInCache) {
8159
8272
  const [start, end] = interval;
8160
8273
  for (let r = start; r <= end; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r - startRow, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
8161
- CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
8274
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
8162
8275
  }
8163
8276
  return;
8164
8277
  }
8165
8278
  }
8166
8279
  for (let r = 0; r < rowCount; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
8167
- CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8280
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8168
8281
  }
8169
8282
  __batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive) {
8170
8283
  const currentValue = this.getValueOrDefault(r, column);
@@ -8214,7 +8327,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8214
8327
  break;
8215
8328
  }
8216
8329
  else result[r][column] = ErrorValueObject.create("#N/A");
8217
- CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
8330
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
8218
8331
  }
8219
8332
  _batchOperatorArray(valueObject, batchOperatorType, operator, isCaseSensitive) {
8220
8333
  let rowCount = valueObject.getRowCount();
@@ -8285,7 +8398,9 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8285
8398
  }
8286
8399
  result.push(rowList);
8287
8400
  }
8288
- return this._createNewArray(result, rowCount, columnCount);
8401
+ const newArray = this._createNewArray(result, rowCount, columnCount);
8402
+ if (batchOperatorType === 1) newArray.setLegacyImplicitForAggregate(true);
8403
+ return newArray;
8289
8404
  }
8290
8405
  _checkArrayCalculateType(valueObject) {
8291
8406
  if (valueObject.getRowCount() === 1 && valueObject.getColumnCount() === 1) return 3;
@@ -8302,6 +8417,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8302
8417
  this._sheetId = rawValue.sheetId;
8303
8418
  this._currentRow = rawValue.row;
8304
8419
  this._currentColumn = rawValue.column;
8420
+ this._useInvertedIndexCache = rawValue.useInvertedIndexCache === true;
8421
+ this._legacyImplicitForAggregate = rawValue.legacyImplicitForAggregate === true;
8305
8422
  return rawValue.calculateValueList;
8306
8423
  }
8307
8424
  rawValue = rawValue.slice(1, -1);
@@ -8324,7 +8441,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8324
8441
  this._columnCount = maxColumnCount;
8325
8442
  return result;
8326
8443
  }
8327
- _createNewArray(result, rowCount, columnCount, row = -1, column = -1) {
8444
+ _createNewArray(result, rowCount, columnCount, row = this._currentRow, column = this._currentColumn) {
8328
8445
  if (this._currentColumn === -1 || this._currentRow === -1) {
8329
8446
  row = -1;
8330
8447
  column = -1;
@@ -8440,14 +8557,14 @@ var BaseReferenceObject = class extends ObjectClassType {
8440
8557
  }
8441
8558
  iterator(callback) {
8442
8559
  const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
8443
- if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#VALUE!"), startRow, startColumn);
8560
+ if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#REF!"), startRow, startColumn);
8444
8561
  const unitId = this._forcedUnitId || this._defaultUnitId;
8445
8562
  const sheetId = this._forcedSheetId || this._defaultSheetId;
8446
8563
  for (let r = startRow; r <= endRow; r++) for (let c = startColumn; c <= endColumn; c++) {
8447
8564
  if (r < 0 || c < 0) return callback(ErrorValueObject.create("#REF!"), r, c);
8448
8565
  const cell = this.getCellData(r, c);
8449
8566
  let result = false;
8450
- if ((0, _univerjs_core.isNullCell)(cell)) {
8567
+ if ((0, _univerjs_core.isNullCell)(cell) && !isTypedEmptyStringCell(cell)) {
8451
8568
  result = callback(null, r, c);
8452
8569
  continue;
8453
8570
  }
@@ -8464,7 +8581,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8464
8581
  }
8465
8582
  }
8466
8583
  getFirstCell() {
8467
- if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#VALUE!");
8584
+ if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#REF!");
8468
8585
  const { startRow, startColumn } = this.getRangePosition();
8469
8586
  const cell = this.getCellData(startRow, startColumn);
8470
8587
  if (!cell) return NumberValueObject.create(0);
@@ -8643,14 +8760,15 @@ var BaseReferenceObject = class extends ObjectClassType {
8643
8760
  }
8644
8761
  getCellValueObject(cell) {
8645
8762
  const value = getCellValue(cell);
8763
+ const cellValueType = Number(cell.t);
8646
8764
  if (ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
8647
- if (cell.t === _univerjs_core.CellValueType.NUMBER) {
8765
+ if (cellValueType === _univerjs_core.CellValueType.NUMBER) {
8648
8766
  const pattern = this._getPatternByCell(cell);
8649
8767
  if ((0, _univerjs_core.isTextFormat)(pattern)) return StringValueObject.create(value.toString());
8650
8768
  return createNumberValueObjectByRawValue(value, pattern);
8651
8769
  }
8652
- if (cell.t === _univerjs_core.CellValueType.STRING || cell.t === _univerjs_core.CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
8653
- if (cell.t === _univerjs_core.CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
8770
+ if (cellValueType === _univerjs_core.CellValueType.STRING || cellValueType === _univerjs_core.CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
8771
+ if (cellValueType === _univerjs_core.CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
8654
8772
  return ValueObjectFactory.create(value);
8655
8773
  }
8656
8774
  _getPatternByCell(cell) {
@@ -8726,7 +8844,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8726
8844
  if (!row) row = rangeData.startRow;
8727
8845
  if (!column) column = rangeData.startColumn;
8728
8846
  const cell = this.getCellData(row, column);
8729
- if (!cell) return ErrorValueObject.create("#VALUE!");
8847
+ if (!cell) return NullValueObject.create();
8730
8848
  return this.getCellValueObject(cell);
8731
8849
  }
8732
8850
  setCurrentRowAndColumn(row, column) {
@@ -8780,7 +8898,8 @@ var BaseReferenceObject = class extends ObjectClassType {
8780
8898
  unitId: this.getUnitId(),
8781
8899
  sheetId: this.getSheetId(),
8782
8900
  row: startRow,
8783
- column: startColumn
8901
+ column: startColumn,
8902
+ useInvertedIndexCache: true
8784
8903
  };
8785
8904
  const arrayValueObject = ArrayValueObject.create(arrayValueObjectData);
8786
8905
  useCache && FORMULA_REF_TO_ARRAY_CACHE.set(key, arrayValueObject);
@@ -8810,6 +8929,9 @@ var BaseReferenceObject = class extends ObjectClassType {
8810
8929
  return ArrayValueObject.create(arrayValueObjectData);
8811
8930
  }
8812
8931
  };
8932
+ function isTypedEmptyStringCell(cell) {
8933
+ return (cell === null || cell === void 0 ? void 0 : cell.v) === "" && (cell.t === _univerjs_core.CellValueType.STRING || cell.t === _univerjs_core.CellValueType.FORCE_STRING);
8934
+ }
8813
8935
  var AsyncObject = class extends ObjectClassType {
8814
8936
  constructor(_promise) {
8815
8937
  super();
@@ -8871,6 +8993,8 @@ var RangeReferenceObject = class extends BaseReferenceObject {
8871
8993
 
8872
8994
  //#endregion
8873
8995
  //#region src/engine/reference-object/cell-reference-object.ts
8996
+ const EXCEL_MAX_ROWS = 1048576;
8997
+ const EXCEL_MAX_COLUMNS = 16384;
8874
8998
  var CellReferenceObject = class extends BaseReferenceObject {
8875
8999
  constructor(token) {
8876
9000
  super(token);
@@ -8882,6 +9006,12 @@ var CellReferenceObject = class extends BaseReferenceObject {
8882
9006
  isCell() {
8883
9007
  return true;
8884
9008
  }
9009
+ isExceedRange() {
9010
+ var _this$getForcedSheetI;
9011
+ if ((this.getForcedSheetId() == null || ((_this$getForcedSheetI = this.getForcedSheetId()) === null || _this$getForcedSheetI === void 0 ? void 0 : _this$getForcedSheetI.length) === 0) && this.getForcedSheetName().length > 0) return true;
9012
+ const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
9013
+ return startRow < 0 || startColumn < 0 || endRow >= EXCEL_MAX_ROWS || endColumn >= EXCEL_MAX_COLUMNS;
9014
+ }
8885
9015
  unionBy(referenceObject) {
8886
9016
  if (!referenceObject.isCell()) return ErrorValueObject.create("#REF!");
8887
9017
  const cellReferenceObject = referenceObject;
@@ -9365,11 +9495,11 @@ function getPairedRangeAndCriteriaResult(variants, params) {
9365
9495
  result = sum.divided(count);
9366
9496
  } else if (formulaName === "MAXIFS") {
9367
9497
  const picked = targetRange.pick(finalCompareResult);
9368
- if (picked.getColumnCount() === 0) result = ArrayValueObject.create("0");
9498
+ if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
9369
9499
  else result = picked.max();
9370
9500
  } else if (formulaName === "MINIFS") {
9371
9501
  const picked = targetRange.pick(finalCompareResult);
9372
- if (picked.getColumnCount() === 0) result = ArrayValueObject.create("0");
9502
+ if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
9373
9503
  else result = picked.min();
9374
9504
  }
9375
9505
  if (!results[rowIndex]) results[rowIndex] = [];
@@ -9381,13 +9511,25 @@ function getPairedRangeAndCriteriaResult(variants, params) {
9381
9511
  * Two ArrayValueObject of the same type can be compared
9382
9512
  */
9383
9513
  function filterSameValueObjectResult(array, range, criteria) {
9384
- const [operator, criteriaObject] = findCompareToken(`${criteria.getValue()}`);
9514
+ const [operator, criteriaObject] = criteria.isString() ? findCompareToken(`${criteria.getValue()}`) : ["=", criteria];
9385
9515
  return array.mapValue((valueObject, r, c) => {
9386
9516
  const rangeValueObject = range.get(r, c);
9517
+ const isBlankStringCriteria = criteriaObject.isString() && criteriaObject.getValue() === "";
9518
+ if (operator === "<>" && isBlankStringCriteria && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && rangeValueObject.getValue() === "") return BooleanValueObject.create(true);
9519
+ if (criteriaObject.isString() && criteriaObject.getValue() !== "" && (operator === "<" || operator === "<=") && (rangeValueObject == null || rangeValueObject.isNull() || rangeValueObject.isString() && rangeValueObject.getValue() === "")) return BooleanValueObject.create(false);
9520
+ if (criteriaObject.isString() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && (operator === "<" || operator === "<=") && isSameLowerBoundBucket(rangeValueObject.getValue(), criteriaObject.getValue())) return BooleanValueObject.create(false);
9521
+ if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
9522
+ const criteriaNumber = criteriaObject.convertToNumberObjectValue();
9523
+ if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
9524
+ }
9525
+ if (criteriaObject.isNumber() && criteriaObject.isDateFormat() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
9526
+ const rangeNumber = rangeValueObject.convertToNumberObjectValue();
9527
+ if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
9528
+ }
9387
9529
  if (rangeValueObject && isSameValueObjectType(rangeValueObject, criteriaObject)) return valueObject;
9388
9530
  if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isError()) && criteriaObject.isError() && rangeValueObject.getValue() === criteriaObject.getValue()) return BooleanValueObject.create(true);
9389
9531
  /**
9390
- * If the operator is '=' or '<>', we can compare numbers and strings directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
9532
+ * If the operator is '=' or '<>', we can compare string numbers against numeric criteria directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
9391
9533
  * Other operators require both valueObjects to be of the same type.
9392
9534
  * For example:
9393
9535
  * | A1 | B1 |
@@ -9399,10 +9541,6 @@ function filterSameValueObjectResult(array, range, criteria) {
9399
9541
  * =COUNTIF(A1:B1, '<=123') will return 1
9400
9542
  */
9401
9543
  if (operator === "=" || operator === "<>") {
9402
- if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
9403
- const criteriaNumber = criteriaObject.convertToNumberObjectValue();
9404
- if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
9405
- }
9406
9544
  if (criteriaObject.isNumber() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
9407
9545
  const rangeNumber = rangeValueObject.convertToNumberObjectValue();
9408
9546
  if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
@@ -9413,6 +9551,11 @@ function filterSameValueObjectResult(array, range, criteria) {
9413
9551
  return BooleanValueObject.create(false);
9414
9552
  });
9415
9553
  }
9554
+ function isSameLowerBoundBucket(rangeValue, criteriaValue) {
9555
+ const criteriaMatch = criteriaValue.match(/^(\d+)\|/);
9556
+ const rangeMatch = rangeValue.match(/^(\d+)-/);
9557
+ return criteriaMatch != null && rangeMatch != null && criteriaMatch[1] === rangeMatch[1];
9558
+ }
9416
9559
  /**
9417
9560
  * Check if the two valueObjects are of the same type
9418
9561
  * @param left
@@ -9513,6 +9656,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
9513
9656
  _defineProperty(this, "_currentColumn", -1);
9514
9657
  _defineProperty(this, "_currentRowCount", Number.NEGATIVE_INFINITY);
9515
9658
  _defineProperty(this, "_currentColumnCount", Number.NEGATIVE_INFINITY);
9659
+ _defineProperty(this, "_functionRefInfoOverrideStack", []);
9516
9660
  _defineProperty(this, "_currentSubUnitId", "");
9517
9661
  _defineProperty(this, "_currentUnitId", "");
9518
9662
  _defineProperty(this, "_runtimeData", {});
@@ -9541,10 +9685,12 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
9541
9685
  return this._currentColumn;
9542
9686
  }
9543
9687
  get currentRowCount() {
9544
- return this._currentRowCount;
9688
+ var _this$_functionRefInf, _this$_functionRefInf2;
9689
+ return (_this$_functionRefInf = (_this$_functionRefInf2 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf2 === void 0 ? void 0 : _this$_functionRefInf2.rowCount) !== null && _this$_functionRefInf !== void 0 ? _this$_functionRefInf : this._currentRowCount;
9545
9690
  }
9546
9691
  get currentColumnCount() {
9547
- return this._currentColumnCount;
9692
+ var _this$_functionRefInf3, _this$_functionRefInf4;
9693
+ return (_this$_functionRefInf3 = (_this$_functionRefInf4 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf4 === void 0 ? void 0 : _this$_functionRefInf4.columnCount) !== null && _this$_functionRefInf3 !== void 0 ? _this$_functionRefInf3 : this._currentColumnCount;
9548
9694
  }
9549
9695
  get currentSubUnitId() {
9550
9696
  return this._currentSubUnitId;
@@ -9638,6 +9784,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
9638
9784
  this._isCycleDependency = false;
9639
9785
  this._totalFormulasToCalculate = 0;
9640
9786
  this._completedFormulasCount = 0;
9787
+ this._functionRefInfoOverrideStack = [];
9641
9788
  this.clearReferenceAndNumberformatCache();
9642
9789
  }
9643
9790
  clearReferenceAndNumberformatCache() {
@@ -9653,6 +9800,15 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
9653
9800
  this._currentSubUnitId = sheetId;
9654
9801
  this._currentUnitId = unitId;
9655
9802
  }
9803
+ setFunctionRefInfoOverride(rowCount, columnCount) {
9804
+ this._functionRefInfoOverrideStack.push({
9805
+ rowCount,
9806
+ columnCount
9807
+ });
9808
+ return () => {
9809
+ this._functionRefInfoOverrideStack.pop();
9810
+ };
9811
+ }
9656
9812
  clearFunctionDefinitionPrivacyVar() {
9657
9813
  this._functionDefinitionPrivacyVar.clear();
9658
9814
  }
@@ -9716,13 +9872,22 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
9716
9872
  * then it is not treated as an array range and is directly assigned.
9717
9873
  */
9718
9874
  if (startRow === endRow && startColumn === endColumn) {
9719
- const firstCell = objectValueRefOrArray.getFirstCell();
9875
+ const firstCellRaw = objectValueRefOrArray.getFirstCell();
9876
+ const firstCell = firstCellRaw.isNull() ? NumberValueObject.create(0) : firstCellRaw;
9720
9877
  const valueObject = this._getValueObjectOfRuntimeData(firstCell);
9721
9878
  sheetData.setValue(row, column, valueObject);
9722
9879
  clearArrayUnitData.setValue(row, column, valueObject);
9723
9880
  CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, firstCell.getValue(), row, true);
9724
9881
  return;
9725
9882
  }
9883
+ if (this._isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column)) {
9884
+ const errorObject = this._getValueObjectOfRuntimeData(ErrorValueObject.create("#VALUE!"));
9885
+ sheetData.setValue(row, column, errorObject);
9886
+ clearArrayUnitData.setValue(row, column, errorObject);
9887
+ runtimeArrayUnitData.setValue(row, column, errorObject);
9888
+ CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, "#VALUE!", row, true);
9889
+ return;
9890
+ }
9726
9891
  const arrayRange = {
9727
9892
  startRow: row,
9728
9893
  startColumn: column,
@@ -9934,6 +10099,11 @@ let FormulaRuntimeService = class FormulaRuntimeService extends _univerjs_core.D
9934
10099
  });
9935
10100
  return isCellOverlapping;
9936
10101
  }
10102
+ _isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column) {
10103
+ var _this$_currentConfigS4;
10104
+ const range = (_this$_currentConfigS4 = this._currentConfigService.getArrayFormulaRange()[unitId]) === null || _this$_currentConfigS4 === void 0 || (_this$_currentConfigS4 = _this$_currentConfigS4[sheetId]) === null || _this$_currentConfigS4 === void 0 || (_this$_currentConfigS4 = _this$_currentConfigS4[row]) === null || _this$_currentConfigS4 === void 0 ? void 0 : _this$_currentConfigS4[column];
10105
+ return range != null && range.startRow === range.endRow && range.startColumn === range.endColumn;
10106
+ }
9937
10107
  _isInArrayFormulaRange(range, r, c) {
9938
10108
  if (range == null) return false;
9939
10109
  const { startRow, startColumn, endRow, endColumn } = range;
@@ -10172,18 +10342,23 @@ const FORMULA_CACHE_LRU_COUNT = 5e3;
10172
10342
  const FORMULA_AST_CACHE = new FormulaAstLRU(FORMULA_CACHE_LRU_COUNT);
10173
10343
  const DIRTY_DEFINED_NAME_SET_CACHE = /* @__PURE__ */ new WeakMap();
10174
10344
  const DIRTY_SUPER_TABLE_PATTERN_CACHE = /* @__PURE__ */ new WeakMap();
10175
- function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService) {
10176
- let astNode = FORMULA_AST_CACHE.get(`${unitId}${formulaString}`);
10177
- const noCache = checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService);
10178
- if (!noCache && astNode && !isDirtyDefinedForNode(astNode, currentConfigService)) return astNode;
10179
- const lexerNode = lexer.treeBuilder(formulaString);
10345
+ function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService, subUnitId) {
10346
+ var _ref;
10347
+ if (subUnitId) {
10348
+ currentConfigService.setExecuteUnitId(unitId);
10349
+ currentConfigService.setExecuteSubUnitId(subUnitId);
10350
+ }
10351
+ const cacheKey = `${unitId}:${(_ref = subUnitId !== null && subUnitId !== void 0 ? subUnitId : currentConfigService.getExecuteSubUnitId()) !== null && _ref !== void 0 ? _ref : ""}:${formulaString}`;
10352
+ let astNode = FORMULA_AST_CACHE.get(cacheKey);
10353
+ if (!(checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService)) && astNode && !isDirtyDefinedForNode(astNode, currentConfigService, unitId)) return astNode;
10354
+ const lexerNode = lexer.treeBuilder(formulaString, true, unitId);
10180
10355
  if (ERROR_TYPE_SET.has(lexerNode)) return ErrorNode.create(lexerNode);
10181
10356
  astNode = astTreeBuilder.parse(lexerNode);
10182
10357
  if (astNode == null) {
10183
10358
  console.error("generateAstNode astNode is null");
10184
10359
  return ErrorNode.create(lexerNode);
10185
10360
  }
10186
- if (!noCache) FORMULA_AST_CACHE.set(`${unitId}${formulaString}`, astNode);
10361
+ FORMULA_AST_CACHE.set(cacheKey, astNode);
10187
10362
  return astNode;
10188
10363
  }
10189
10364
  function checkIsChangedByDefinedName(unitId, formula, currentConfigService) {
@@ -10214,15 +10389,15 @@ function getNormalizedDirtyDefinedNameSet(unitDefinedNameMap) {
10214
10389
  function getDirtySuperTableReferencePattern(unitSuperTableMap) {
10215
10390
  let tableReferencePattern = DIRTY_SUPER_TABLE_PATTERN_CACHE.get(unitSuperTableMap);
10216
10391
  if (tableReferencePattern === void 0) {
10217
- const escapedTableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0).map(_univerjs_core.escapeRegExp);
10218
- tableReferencePattern = escapedTableNames.length > 0 ? new RegExp(`(^|[^A-Za-z0-9_])(?:${escapedTableNames.join("|")})(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
10392
+ const tableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0);
10393
+ tableReferencePattern = tableNames.length > 0 ? _univerjs_core.regexp.createRegExpFromSafeFragment(`(^|[^A-Za-z0-9_])${_univerjs_core.regexp.or(...tableNames)}(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
10219
10394
  DIRTY_SUPER_TABLE_PATTERN_CACHE.set(unitSuperTableMap, tableReferencePattern);
10220
10395
  }
10221
10396
  return tableReferencePattern;
10222
10397
  }
10223
- function isDirtyDefinedForNode(node, currentConfigService) {
10398
+ function isDirtyDefinedForNode(node, currentConfigService, unitId) {
10224
10399
  const definedNameMap = currentConfigService.getDirtyDefinedNameMap();
10225
- const executeUnitId = currentConfigService.getExecuteUnitId();
10400
+ const executeUnitId = unitId;
10226
10401
  if (executeUnitId != null && definedNameMap[executeUnitId] != null) {
10227
10402
  const names = Object.keys(definedNameMap[executeUnitId]);
10228
10403
  for (let i = 0, len = names.length; i < len; i++) {
@@ -10237,7 +10412,7 @@ function includeDefinedName(tree, node, currentConfigService) {
10237
10412
  * Detect whether the dirty map contains a defined name.
10238
10413
  */
10239
10414
  if (node != null) {
10240
- if (isDirtyDefinedForNode(node, currentConfigService)) return true;
10415
+ if (isDirtyDefinedForNode(node, currentConfigService, tree.unitId)) return true;
10241
10416
  }
10242
10417
  return false;
10243
10418
  }
@@ -10347,6 +10522,7 @@ var PrefixNode = class extends BaseAstNode {
10347
10522
  if (!value.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
10348
10523
  const currentValue = value;
10349
10524
  if (currentValue.isCell()) return ErrorValueObject.create("#VALUE!");
10525
+ if (this._preserveAtRangeForFormula2LookupArray()) return currentValue;
10350
10526
  const runtimeService = this._runtimeService;
10351
10527
  const currentRow = runtimeService.currentRow || 0;
10352
10528
  const currentColumn = runtimeService.currentColumn || 0;
@@ -10358,6 +10534,22 @@ var PrefixNode = class extends BaseAstNode {
10358
10534
  if (currentValue.isTable()) return currentValue.getCellByPosition(currentRow);
10359
10535
  return ErrorValueObject.create("#VALUE!");
10360
10536
  }
10537
+ _preserveAtRangeForFormula2LookupArray() {
10538
+ let node = this;
10539
+ let parent = node.getParent();
10540
+ let sawCompareOperator = false;
10541
+ while (parent != null) {
10542
+ if (parent.nodeType === 3) sawCompareOperator || (sawCompareOperator = OPERATOR_TOKEN_COMPARE_SET.has(parent.getToken()));
10543
+ if (parent.nodeType === 4) {
10544
+ const functionName = parent.getToken().toUpperCase();
10545
+ if (sawCompareOperator && functionName === "XMATCH") return parent.getChildren().indexOf(node) === 1;
10546
+ return false;
10547
+ }
10548
+ node = parent;
10549
+ parent = parent.getParent();
10550
+ }
10551
+ return false;
10552
+ }
10361
10553
  };
10362
10554
  let PrefixNodeFactory = class PrefixNodeFactory extends BaseAstNodeFactory {
10363
10555
  constructor(_functionService, _runtimeService) {
@@ -10432,41 +10624,43 @@ var FunctionNode = class extends BaseAstNode {
10432
10624
  return 4;
10433
10625
  }
10434
10626
  async executeAsync() {
10435
- const variants = [];
10436
10627
  const children = this.getChildren();
10437
- const childrenCount = children.length;
10438
10628
  this._compatibility();
10439
- for (let i = 0; i < childrenCount; i++) {
10440
- const object = children[i].getValue();
10441
- if (object == null) continue;
10442
- if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
10443
- else variants.push(object);
10444
- }
10445
- const resultVariant = await this._calculateAsync(variants);
10629
+ const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : await this._calculateAsync(this._collectVariants(children));
10446
10630
  let result;
10447
10631
  if (resultVariant.isAsyncObject() || resultVariant.isAsyncArrayObject()) result = await resultVariant.getValue();
10448
10632
  else result = resultVariant;
10633
+ result = this._normalizeTopLevelLegacyArrayResult(result);
10449
10634
  this._setEmbeddedArrayFormulaToResult(result);
10450
10635
  this._setRefData(result);
10451
10636
  this.setValue(result);
10452
10637
  return Promise.resolve(0);
10453
10638
  }
10454
10639
  execute() {
10455
- const variants = [];
10456
10640
  const children = this.getChildren();
10457
- const childrenCount = children.length;
10458
10641
  this._compatibility();
10642
+ const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : this._calculate(this._collectVariants(children));
10643
+ const result = this._normalizeTopLevelLegacyArrayResult(resultVariant);
10644
+ this._setEmbeddedArrayFormulaToResult(result);
10645
+ this._setRefData(result);
10646
+ this.setValue(result);
10647
+ }
10648
+ _collectVariants(children) {
10649
+ const variants = [];
10650
+ const childrenCount = children.length;
10459
10651
  for (let i = 0; i < childrenCount; i++) {
10460
- const object = children[i].getValue();
10652
+ const object = this._getChildVariant(children[i]);
10461
10653
  if (object == null) continue;
10462
- if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
10463
- if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
10464
- else variants.push(object);
10654
+ variants.push(object);
10465
10655
  }
10466
- const resultVariant = this._calculate(variants);
10467
- this._setEmbeddedArrayFormulaToResult(resultVariant);
10468
- this._setRefData(resultVariant);
10469
- this.setValue(resultVariant);
10656
+ return variants;
10657
+ }
10658
+ _getChildVariant(child) {
10659
+ const object = child.getValue();
10660
+ if (object == null) return;
10661
+ if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
10662
+ if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) return object.toArrayValueObject();
10663
+ return object;
10470
10664
  }
10471
10665
  isFunctionExecutorArgumentsIgnoreNumberPattern() {
10472
10666
  return this._functionExecutor.isArgumentsIgnoreNumberPattern();
@@ -10481,6 +10675,14 @@ var FunctionNode = class extends BaseAstNode {
10481
10675
  if (rowCount <= 1 && colCount <= 1) return;
10482
10676
  this._runtimeService.setUnitArrayFormulaEmbeddedMap();
10483
10677
  }
10678
+ _normalizeTopLevelLegacyArrayResult(result) {
10679
+ const parent = this.getParent();
10680
+ const isTopLevel = parent == null || parent.nodeType === 9;
10681
+ if (!this._functionExecutor.returnsLegacyArrayAsScalar || !isTopLevel || !result.isArray()) return result;
10682
+ const array = result;
10683
+ if (array.getRowCount() <= 1 && array.getColumnCount() <= 1) return result;
10684
+ return array.getFirstCell();
10685
+ }
10484
10686
  /**
10485
10687
  * Compatibility handling for special functions.
10486
10688
  */
@@ -10565,6 +10767,16 @@ var FunctionNode = class extends BaseAstNode {
10565
10767
  }
10566
10768
  return resultVariant;
10567
10769
  }
10770
+ _calculateAst(children) {
10771
+ const { minParams, maxParams } = this._functionExecutor;
10772
+ if (minParams !== -1 && maxParams !== -1 && (children.length < minParams || children.length > maxParams)) return ErrorValueObject.create("#N/A");
10773
+ this._setRefInfo();
10774
+ this._handleAddressFunction();
10775
+ return this._functionExecutor.calculateAst(children, (node) => {
10776
+ var _this$_getChildVarian;
10777
+ return (_this$_getChildVarian = this._getChildVariant(node)) !== null && _this$_getChildVarian !== void 0 ? _this$_getChildVarian : null;
10778
+ });
10779
+ }
10568
10780
  async _calculateAsync(variants) {
10569
10781
  const { minParams, maxParams } = this._functionExecutor;
10570
10782
  if (minParams !== -1 && maxParams !== -1 && (variants.length < minParams || variants.length > maxParams)) return ErrorValueObject.create("#N/A");
@@ -10580,15 +10792,15 @@ var FunctionNode = class extends BaseAstNode {
10580
10792
  return resultVariant;
10581
10793
  }
10582
10794
  _setDefinedNamesForFunction() {
10583
- const editorUnitId = this._currentConfigService.getExecuteUnitId();
10795
+ const editorUnitId = this._runtimeService.currentUnitId;
10584
10796
  if (editorUnitId == null) return;
10585
10797
  const definedNames = this._definedNamesService.getDefinedNameMap(editorUnitId);
10586
10798
  if (definedNames == null) return;
10587
10799
  this._functionExecutor.setDefinedNames(definedNames);
10588
10800
  }
10589
10801
  _setRefInfo() {
10590
- const { currentUnitId, currentSubUnitId, currentRow, currentColumn } = this._runtimeService;
10591
- this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn);
10802
+ const { currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount } = this._runtimeService;
10803
+ this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount);
10592
10804
  if (this._functionExecutor.needsSheetRowColumnCount) {
10593
10805
  const { rowCount, columnCount } = this._currentConfigService.getSheetRowColumnCount(currentUnitId, currentSubUnitId);
10594
10806
  this._functionExecutor.setSheetRowColumnCount(rowCount, columnCount);
@@ -10659,7 +10871,7 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
10659
10871
  const { tokenTrim, minusPrefixNode, atPrefixNode } = prefixHandler(param.getToken().trim(), this._functionService, this._runtimeService);
10660
10872
  const isColon = this._isParentUnionNode(param);
10661
10873
  if (!Number.isNaN(Number(tokenTrim)) && !isColon) return ErrorNode.create("#VALUE!");
10662
- const tokenTrimUpper = tokenTrim.toUpperCase();
10874
+ const tokenTrimUpper = normalizeFunctionToken(tokenTrim.toUpperCase());
10663
10875
  if (isColon && COLUMN_LIKE_FUNCTION_NAMES.has(tokenTrimUpper)) return;
10664
10876
  if (this._functionService.hasExecutor(tokenTrimUpper)) {
10665
10877
  const functionNode = this.create(tokenTrimUpper);
@@ -10681,6 +10893,15 @@ FunctionNodeFactory = __decorate([
10681
10893
  __decorateParam(4, (0, _univerjs_core.Inject)(_univerjs_core.Injector)),
10682
10894
  __decorateParam(5, (0, _univerjs_core.Inject)(FormulaDataModel))
10683
10895
  ], FunctionNodeFactory);
10896
+ function normalizeFunctionToken(token) {
10897
+ if (token === "REGEXTEST" || token === "_XLFN.REGEXTEST") return "REGEXMATCH";
10898
+ for (const prefix of [
10899
+ "_XLFN.",
10900
+ "_XLWS.",
10901
+ "_XLETA."
10902
+ ]) if (token.startsWith(prefix)) return token.slice(prefix.length);
10903
+ return token;
10904
+ }
10684
10905
 
10685
10906
  //#endregion
10686
10907
  //#region src/engine/interpreter/interpreter.ts
@@ -10731,6 +10952,7 @@ let Interpreter = class Interpreter extends _univerjs_core.Disposable {
10731
10952
  }
10732
10953
  async _executeAsync(node, refOffsetX = 0, refOffsetY = 0) {
10733
10954
  if (this._runtimeService.isStopExecution()) return Promise.resolve(1);
10955
+ if (await this._executeLazyFunctionAsync(node, refOffsetX, refOffsetY)) return Promise.resolve(0);
10734
10956
  const children = node.getChildren();
10735
10957
  const childrenCount = children.length;
10736
10958
  for (let i = 0; i < childrenCount; i++) {
@@ -10751,6 +10973,7 @@ let Interpreter = class Interpreter extends _univerjs_core.Disposable {
10751
10973
  }
10752
10974
  _execute(node, refOffsetX = 0, refOffsetY = 0) {
10753
10975
  if (this._runtimeService.isStopExecution()) return 1;
10976
+ if (this._executeLazyFunction(node, refOffsetX, refOffsetY)) return 0;
10754
10977
  const children = node.getChildren();
10755
10978
  const childrenCount = children.length;
10756
10979
  for (let i = 0; i < childrenCount; i++) {
@@ -10768,6 +10991,161 @@ let Interpreter = class Interpreter extends _univerjs_core.Disposable {
10768
10991
  node.execute();
10769
10992
  return 0;
10770
10993
  }
10994
+ async _executeLazyFunctionAsync(node, refOffsetX, refOffsetY) {
10995
+ if (node.nodeType !== 4) return false;
10996
+ const token = node.getToken().toUpperCase();
10997
+ if (token === "IF") return await this._executeLazyIfAsync(node, refOffsetX, refOffsetY);
10998
+ if (token === "IFERROR") return await this._executeLazyIfErrorAsync(node, refOffsetX, refOffsetY);
10999
+ return false;
11000
+ }
11001
+ _executeLazyFunction(node, refOffsetX, refOffsetY) {
11002
+ if (node.nodeType !== 4) return false;
11003
+ const token = node.getToken().toUpperCase();
11004
+ if (token === "IF") return this._executeLazyIf(node, refOffsetX, refOffsetY);
11005
+ if (token === "IFERROR") return this._executeLazyIfError(node, refOffsetX, refOffsetY);
11006
+ return false;
11007
+ }
11008
+ async _executeLazyIfAsync(node, refOffsetX, refOffsetY) {
11009
+ const children = node.getChildren();
11010
+ if (children.length < 2 || children.length > 3) return false;
11011
+ await this._executeAsync(children[0], refOffsetX, refOffsetY);
11012
+ const condition = children[0].getValue();
11013
+ if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
11014
+ if (condition.isError()) {
11015
+ node.setValue(condition);
11016
+ return true;
11017
+ }
11018
+ const selected = condition.getValue() ? children[1] : children[2];
11019
+ if (selected == null) {
11020
+ node.setValue(BooleanValueObject.create(false));
11021
+ return true;
11022
+ }
11023
+ await this._executeAsync(selected, refOffsetX, refOffsetY);
11024
+ node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
11025
+ return true;
11026
+ }
11027
+ _executeLazyIf(node, refOffsetX, refOffsetY) {
11028
+ const children = node.getChildren();
11029
+ if (children.length < 2 || children.length > 3) return false;
11030
+ this._execute(children[0], refOffsetX, refOffsetY);
11031
+ const condition = children[0].getValue();
11032
+ if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
11033
+ if (condition.isError()) {
11034
+ node.setValue(condition);
11035
+ return true;
11036
+ }
11037
+ const selected = condition.getValue() ? children[1] : children[2];
11038
+ if (selected == null) {
11039
+ node.setValue(BooleanValueObject.create(false));
11040
+ return true;
11041
+ }
11042
+ this._execute(selected, refOffsetX, refOffsetY);
11043
+ node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
11044
+ return true;
11045
+ }
11046
+ async _executeLazyIfErrorAsync(node, refOffsetX, refOffsetY) {
11047
+ var _children$1$getValue;
11048
+ const children = node.getChildren();
11049
+ if (children.length !== 2) return false;
11050
+ await this._executeAsync(children[0], refOffsetX, refOffsetY);
11051
+ const rawValue = children[0].getValue();
11052
+ const value = this._toLazyIfErrorValue(rawValue);
11053
+ if (value == null || value.isArray()) return false;
11054
+ if (!value.isError()) {
11055
+ node.setValue(value);
11056
+ return true;
11057
+ }
11058
+ await this._executeAsync(children[1], refOffsetX, refOffsetY);
11059
+ node.setValue((_children$1$getValue = children[1].getValue()) !== null && _children$1$getValue !== void 0 ? _children$1$getValue : ErrorValueObject.create("#VALUE!"));
11060
+ return true;
11061
+ }
11062
+ _executeLazyIfError(node, refOffsetX, refOffsetY) {
11063
+ var _children$1$getValue2;
11064
+ const children = node.getChildren();
11065
+ if (children.length !== 2) return false;
11066
+ this._execute(children[0], refOffsetX, refOffsetY);
11067
+ const rawValue = children[0].getValue();
11068
+ const value = this._toLazyIfErrorValue(rawValue);
11069
+ if (value == null || value.isArray()) return false;
11070
+ if (!value.isError()) {
11071
+ node.setValue(value);
11072
+ return true;
11073
+ }
11074
+ this._execute(children[1], refOffsetX, refOffsetY);
11075
+ node.setValue((_children$1$getValue2 = children[1].getValue()) !== null && _children$1$getValue2 !== void 0 ? _children$1$getValue2 : ErrorValueObject.create("#VALUE!"));
11076
+ return true;
11077
+ }
11078
+ _toLazyIfErrorValue(value) {
11079
+ if (value == null) return null;
11080
+ if (!value.isReferenceObject()) {
11081
+ const baseValue = value;
11082
+ return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
11083
+ }
11084
+ const reference = value;
11085
+ if (reference.getRowCount() !== 1 || reference.getColumnCount() !== 1) return reference.toArrayValueObject();
11086
+ const cellValue = reference.getCellByPosition();
11087
+ return cellValue.isNull() ? NumberValueObject.create(0) : cellValue;
11088
+ }
11089
+ _toLazyIfSelectedValue(value, node) {
11090
+ if (value == null) return ErrorValueObject.create("#VALUE!");
11091
+ if (value.isReferenceObject()) {
11092
+ const reference = value;
11093
+ if (this._preserveLazyIfSelectedReferenceArray(node)) return reference.toArrayValueObject();
11094
+ value = this._implicitLazyIfReferenceValue(reference);
11095
+ }
11096
+ if (value.isArray()) value = this._implicitLazyIfArrayValue(value);
11097
+ if (!value.isArray()) {
11098
+ const baseValue = value;
11099
+ return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
11100
+ }
11101
+ return value;
11102
+ }
11103
+ _implicitLazyIfReferenceValue(reference) {
11104
+ const range = reference.getRangePosition();
11105
+ const currentRow = this._runtimeService.currentRow || 0;
11106
+ const currentColumn = this._runtimeService.currentColumn || 0;
11107
+ const { startRow, startColumn, endRow, endColumn } = range;
11108
+ if (startRow === endRow && startColumn === endColumn) return reference.getCellByPosition();
11109
+ if (endRow === startRow && currentColumn >= startColumn && currentColumn <= endColumn) return reference.getCellByColumn(currentColumn);
11110
+ if (startColumn === endColumn && currentRow >= startRow && currentRow <= endRow) return reference.getCellByRow(currentRow);
11111
+ return ErrorValueObject.create("#VALUE!");
11112
+ }
11113
+ _preserveLazyIfSelectedReferenceArray(node) {
11114
+ let child = node;
11115
+ let parent = child.getParent();
11116
+ while (parent != null) {
11117
+ if (parent.nodeType === 4) return parent.getToken().toUpperCase() === "MATCH" && parent.getChildren().indexOf(child) === 1;
11118
+ child = parent;
11119
+ parent = parent.getParent();
11120
+ }
11121
+ return false;
11122
+ }
11123
+ _implicitLazyIfArrayValue(array) {
11124
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return array;
11125
+ const startRow = array.getCurrentRow();
11126
+ const startColumn = array.getCurrentColumn();
11127
+ const rowCount = array.getRowCount();
11128
+ const columnCount = array.getColumnCount();
11129
+ const currentRow = this._runtimeService.currentRow || 0;
11130
+ const currentColumn = this._runtimeService.currentColumn || 0;
11131
+ let rowIndex = -1;
11132
+ let columnIndex = -1;
11133
+ if (rowCount === 1 && columnCount === 1) {
11134
+ rowIndex = 0;
11135
+ columnIndex = 0;
11136
+ } else if (rowCount === 1) {
11137
+ rowIndex = 0;
11138
+ columnIndex = currentColumn - startColumn;
11139
+ } else if (columnCount === 1) {
11140
+ rowIndex = currentRow - startRow;
11141
+ columnIndex = 0;
11142
+ } else {
11143
+ rowIndex = currentRow - startRow;
11144
+ columnIndex = currentColumn - startColumn;
11145
+ }
11146
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
11147
+ return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
11148
+ }
10771
11149
  };
10772
11150
  Interpreter = __decorate([__decorateParam(0, IFormulaRuntimeService)], Interpreter);
10773
11151
 
@@ -10986,9 +11364,10 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
10986
11364
  for (let i = 0; i < parameterArray.length; i++) {
10987
11365
  const parameter = parameterArray[i];
10988
11366
  if (parameter instanceof LexerNode) {
10989
- const variant = parameter.getChildren()[0];
11367
+ const variant = getLambdaParameterName(parameter);
11368
+ if (variant == null) return ErrorNode.create("#VALUE!");
10990
11369
  parameter.setToken(DEFAULT_TOKEN_TYPE_LAMBDA_OMIT_PARAMETER);
10991
- currentLambdaPrivacyVar.set(variant.trim(), void 0);
11370
+ currentLambdaPrivacyVar.set(variant, void 0);
10992
11371
  } else return ErrorNode.create("#VALUE!");
10993
11372
  }
10994
11373
  this._runtimeService.registerFunctionDefinitionPrivacyVar(lambdaId, currentLambdaPrivacyVar);
@@ -11005,6 +11384,20 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
11005
11384
  }
11006
11385
  };
11007
11386
  LambdaNodeFactory = __decorate([__decorateParam(0, IFormulaRuntimeService), __decorateParam(1, (0, _univerjs_core.Inject)(Interpreter))], LambdaNodeFactory);
11387
+ function getLambdaParameterName(parameter) {
11388
+ const children = parameter.getChildren();
11389
+ for (let i = 0; i < children.length; i++) {
11390
+ const child = children[i];
11391
+ if (typeof child === "string") {
11392
+ const token = child.trim();
11393
+ if (token.length > 0) return token;
11394
+ } else {
11395
+ const token = getLambdaParameterName(child);
11396
+ if (token != null) return token;
11397
+ }
11398
+ }
11399
+ return null;
11400
+ }
11008
11401
 
11009
11402
  //#endregion
11010
11403
  //#region src/engine/ast-node/lambda-parameter-node.ts
@@ -11115,12 +11508,17 @@ var OperatorNode = class extends BaseAstNode {
11115
11508
  }
11116
11509
  if (object1 == null) object1 = NullValueObject.create();
11117
11510
  if (object2 == null) object2 = NullValueObject.create();
11118
- if (object1.isReferenceObject()) object1 = object1.toArrayValueObject();
11119
- if (object2.isReferenceObject()) object2 = object2.toArrayValueObject();
11511
+ if (object1.isReferenceObject()) object1 = this._referenceToOperatorValue(object1);
11512
+ if (object2.isReferenceObject()) object2 = this._referenceToOperatorValue(object2);
11120
11513
  const result = this._functionExecutor.calculate(object1, object2);
11121
11514
  this._setEmbeddedArrayFormulaToResult(result);
11122
11515
  this.setValue(result);
11123
11516
  }
11517
+ _referenceToOperatorValue(reference) {
11518
+ const array = reference.toArrayValueObject();
11519
+ if (array.getRowCount() === 1 && array.getColumnCount() === 1) return array.get(0, 0);
11520
+ return array;
11521
+ }
11124
11522
  /**
11125
11523
  * If it contains an array formula, set the current cell to the cache and send itself as a ref outward
11126
11524
  */
@@ -11424,12 +11822,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
11424
11822
  }
11425
11823
  /** Column title → column index; returns -1 if not found (caller should handle as parse error) */
11426
11824
  _titleToIndex(name, titleMap) {
11427
- var _titleMap$get;
11428
11825
  const key = name.trim();
11429
11826
  const hit = titleMap.get(key);
11430
11827
  if (hit !== void 0) return hit;
11431
11828
  const keyNorm = key.replace(/\u3000/g, " ").trim();
11432
- return (_titleMap$get = titleMap.get(keyNorm)) !== null && _titleMap$get !== void 0 ? _titleMap$get : -1;
11829
+ const normalizedHit = titleMap.get(keyNorm);
11830
+ if (normalizedHit !== void 0) return normalizedHit;
11831
+ const lineBreakNorm = keyNorm.replace(/\r\n?/g, "\n");
11832
+ for (const [title, index] of titleMap.entries()) if (title.replace(/\u3000/g, " ").trim().replace(/\r\n?/g, "\n") === lineBreakNorm) return index;
11833
+ return -1;
11433
11834
  }
11434
11835
  /** Resolve #This Row's row number; takes first data row (tableStartRow+1) when no context available */
11435
11836
  _resolveThisRow(tableStartRow, tableEndRow) {
@@ -11523,7 +11924,7 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
11523
11924
  }
11524
11925
  }
11525
11926
  _getTableMap() {
11526
- const unitId = this._currentConfigService.getExecuteUnitId();
11927
+ const unitId = this._formulaRuntimeService.currentUnitId;
11527
11928
  if (!unitId) return;
11528
11929
  return this._superTableService.getTableMap(unitId);
11529
11930
  }
@@ -11609,7 +12010,7 @@ var SuffixNode = class extends BaseAstNode {
11609
12010
  const formulaData = this._currentConfigService.getFormulaData();
11610
12011
  const formulaString = formulaData === null || formulaData === void 0 || (_formulaData$unitId = formulaData[unitId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[sheetId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startRow]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startColumn]) === null || _formulaData$unitId === void 0 ? void 0 : _formulaData$unitId.f;
11611
12012
  if (!formulaString) return ErrorValueObject.create("#VALUE!");
11612
- this._lexer.treeBuilder(formulaString);
12013
+ this._lexer.treeBuilder(formulaString, true, unitId);
11613
12014
  return ErrorValueObject.create("#VALUE!");
11614
12015
  /** todo */
11615
12016
  }
@@ -11710,13 +12111,19 @@ var ValueNode = class extends BaseAstNode {
11710
12111
  return 2;
11711
12112
  }
11712
12113
  execute() {
12114
+ const token = this.getToken();
12115
+ const tokenTrim = token.trim();
12116
+ if (tokenTrim.startsWith("\"") && tokenTrim.endsWith("\"")) {
12117
+ this.setValue(StringValueObject.create(tokenTrim.slice(1, -1).replace(/""/g, "\"")));
12118
+ return;
12119
+ }
11713
12120
  const parent = this.getParent();
11714
12121
  let isIgnoreNumberPattern = true;
11715
12122
  if ((parent === null || parent === void 0 ? void 0 : parent.nodeType) === 4) {
11716
12123
  var _isFunctionExecutorAr, _isFunctionExecutorAr2;
11717
12124
  isIgnoreNumberPattern = (_isFunctionExecutorAr = (_isFunctionExecutorAr2 = parent.isFunctionExecutorArgumentsIgnoreNumberPattern) === null || _isFunctionExecutorAr2 === void 0 ? void 0 : _isFunctionExecutorAr2.call(parent)) !== null && _isFunctionExecutorAr !== void 0 ? _isFunctionExecutorAr : true;
11718
12125
  }
11719
- this.setValue(ValueObjectFactory.create(this.getToken(), isIgnoreNumberPattern));
12126
+ this.setValue(ValueObjectFactory.create(token, isIgnoreNumberPattern));
11720
12127
  }
11721
12128
  };
11722
12129
  var ValueNodeFactory = class extends BaseAstNodeFactory {
@@ -11882,6 +12289,9 @@ let AstTreeBuilder = class AstTreeBuilder extends _univerjs_core.Disposable {
11882
12289
  astNode = getAstNodeTopParent(astNode);
11883
12290
  if (astNode == null || (astNode === null || astNode === void 0 ? void 0 : astNode.nodeType) === 7) return astNode;
11884
12291
  switch (astNode.nodeType) {
12292
+ case 8:
12293
+ calculateStack.push(astNode);
12294
+ break;
11885
12295
  case 4: {
11886
12296
  const token = astNode.getToken().trim().toUpperCase();
11887
12297
  if (FORCED_RECALCULATION_FUNCTION_NAME.has(token)) astNode.setForcedCalculateFunction();
@@ -11933,9 +12343,20 @@ let AstTreeBuilder = class AstTreeBuilder extends _univerjs_core.Disposable {
11933
12343
  astNode = this._astNodeFactoryList[x].checkAndCreateNodeType(item);
11934
12344
  if (astNode != null) break;
11935
12345
  }
11936
- if (astNode == null) return new ErrorFunctionNode();
12346
+ if (astNode == null) {
12347
+ const aggregatorNode = this._createGroupByAggregatorTokenNode(item);
12348
+ if (aggregatorNode != null) return aggregatorNode;
12349
+ return new ErrorFunctionNode();
12350
+ }
11937
12351
  return astNode;
11938
12352
  }
12353
+ _createGroupByAggregatorTokenNode(param) {
12354
+ const token = (typeof param === "string" ? param : param.getToken()).trim().toUpperCase();
12355
+ if (!token.startsWith("_XLETA.")) return null;
12356
+ const name = token.slice(7);
12357
+ if (name !== "SUM" && name !== "COUNT" && name !== "COUNTA" && name !== "PERCENTOF" && name !== "MIN" && name !== "MAX" && name !== "ARRAYTOTEXT") return null;
12358
+ return new BaseAstNode(name);
12359
+ }
11939
12360
  _initializeAstNode() {
11940
12361
  this._astNodeFactoryList = [
11941
12362
  this._astRootNodeFactory,
@@ -13152,7 +13573,7 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends _unive
13152
13573
  return this._dependencyTreeCache.get(treeId);
13153
13574
  }
13154
13575
  _getTreeNode(tree) {
13155
- return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
13576
+ return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
13156
13577
  }
13157
13578
  *_traverse(treeList, skippedTreeIds) {
13158
13579
  const stack = treeList;
@@ -13278,12 +13699,12 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends _unive
13278
13699
  for (let i = 0, len = treeList.length; i < len; i++) {
13279
13700
  const tree = treeList[i];
13280
13701
  if (!tree.formula) continue;
13702
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13281
13703
  const node = this._getTreeNode(tree);
13282
13704
  tree.isDirty = this._includeTree(tree, node);
13283
13705
  const addressFunctionNodes = this._getAddressFunctionNodeList(node);
13284
13706
  if (addressFunctionNodes.length > 0) tree.addressFunctionNodes = addressFunctionNodes;
13285
13707
  if (tree.isVirtual) continue;
13286
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13287
13708
  const rangeList = await this._getRangeListByNode({
13288
13709
  node,
13289
13710
  refOffsetX: tree.refOffsetX,
@@ -13488,13 +13909,13 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends _unive
13488
13909
  async _calculateAddressFunctionRuntimeData(treeDependencyCache, preCalculateTreeList) {
13489
13910
  while (preCalculateTreeList.length > 0) {
13490
13911
  const tree = preCalculateTreeList.pop();
13912
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13491
13913
  const nodeData = {
13492
13914
  node: this._getTreeNode(tree),
13493
13915
  refOffsetX: tree.refOffsetX,
13494
13916
  refOffsetY: tree.refOffsetY
13495
13917
  };
13496
13918
  await this._calculateAddressFunction(treeDependencyCache, tree);
13497
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13498
13919
  let value;
13499
13920
  if (this._interpreter.checkAsyncNode(nodeData.node)) value = await this._interpreter.executeAsync(nodeData);
13500
13921
  else value = this._interpreter.execute(nodeData);
@@ -13921,7 +14342,8 @@ let CalculateFormulaService = class CalculateFormulaService extends _univerjs_co
13921
14342
  const treeCount = treeList.length;
13922
14343
  while (treeList.length > 0) {
13923
14344
  const tree = treeList.pop();
13924
- const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
14345
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
14346
+ const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
13925
14347
  const nodeData = {
13926
14348
  node,
13927
14349
  refOffsetX: tree.refOffsetX,
@@ -13951,7 +14373,6 @@ let CalculateFormulaService = class CalculateFormulaService extends _univerjs_co
13951
14373
  return;
13952
14374
  }
13953
14375
  }
13954
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13955
14376
  let value;
13956
14377
  if (getDirtyData != null && tree.featureId != null) {
13957
14378
  /**
@@ -14044,8 +14465,9 @@ let CalculateFormulaService = class CalculateFormulaService extends _univerjs_co
14044
14465
  }
14045
14466
  return result;
14046
14467
  }
14047
- async calculate(formulaString) {
14048
- const lexerNode = this._lexer.treeBuilder(formulaString);
14468
+ async calculate(formulaString, transformSuffix = true, unitId) {
14469
+ const executeUnitId = unitId || this._runtimeService.currentUnitId || this._currentConfigService.getExecuteUnitId();
14470
+ const lexerNode = this._lexer.treeBuilder(formulaString, transformSuffix, executeUnitId);
14049
14471
  if (Object.values(ErrorType).includes(lexerNode)) return;
14050
14472
  const astNode = this._astTreeBuilder.parse(lexerNode);
14051
14473
  const interpreter = this._interpreter;
@@ -14233,6 +14655,86 @@ CalculateController = __decorate([
14233
14655
  __decorateParam(2, (0, _univerjs_core.Inject)(FormulaDataModel))
14234
14656
  ], CalculateController);
14235
14657
 
14658
+ //#endregion
14659
+ //#region src/services/active-dirty-manager.service.ts
14660
+ /**
14661
+ * Actively mark as dirty, calculate the dirty area based on the command,
14662
+ * and plugins can register the ref range they affect into the formula engine.
14663
+ */
14664
+ var ActiveDirtyManagerService = class extends _univerjs_core.Disposable {
14665
+ constructor(..._args) {
14666
+ super(..._args);
14667
+ _defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
14668
+ }
14669
+ dispose() {
14670
+ this._dirtyConversionMap.clear();
14671
+ }
14672
+ remove(commandId) {
14673
+ this._dirtyConversionMap.delete(commandId);
14674
+ }
14675
+ get(commandId) {
14676
+ return this._dirtyConversionMap.get(commandId);
14677
+ }
14678
+ has(commandId) {
14679
+ return this._dirtyConversionMap.has(commandId);
14680
+ }
14681
+ register(commandId, dirtyConversion) {
14682
+ this._dirtyConversionMap.set(commandId, dirtyConversion);
14683
+ }
14684
+ getDirtyConversionMap() {
14685
+ return this._dirtyConversionMap;
14686
+ }
14687
+ };
14688
+ const IActiveDirtyManagerService = (0, _univerjs_core.createIdentifier)("univer.formula.active-dirty-manager.service");
14689
+
14690
+ //#endregion
14691
+ //#region src/controllers/super-table-active-dirty.controller.ts
14692
+ let SuperTableActiveDirtyController = class SuperTableActiveDirtyController extends _univerjs_core.Disposable {
14693
+ constructor(_activeDirtyManagerService) {
14694
+ super();
14695
+ this._activeDirtyManagerService = _activeDirtyManagerService;
14696
+ this._initialize();
14697
+ }
14698
+ _initialize() {
14699
+ this._activeDirtyManagerService.register(SetSuperTableMutation.id, {
14700
+ commandId: SetSuperTableMutation.id,
14701
+ getDirtyData: (command) => {
14702
+ const params = command.params;
14703
+ const tableNames = [params.tableName, params.oldTableName].filter((name) => Boolean(name));
14704
+ return {
14705
+ dirtyRanges: [{
14706
+ unitId: params.unitId,
14707
+ sheetId: params.reference.sheetId,
14708
+ range: params.reference.range
14709
+ }],
14710
+ dirtySuperTableMap: { [params.unitId]: Object.fromEntries(tableNames.map((name) => [name, "1"])) },
14711
+ clearDependencyTreeCache: { [params.unitId]: { [params.reference.sheetId]: "1" } }
14712
+ };
14713
+ }
14714
+ });
14715
+ this._activeDirtyManagerService.register(RemoveSuperTableMutation.id, {
14716
+ commandId: RemoveSuperTableMutation.id,
14717
+ getDirtyData: (command) => {
14718
+ const params = command.params;
14719
+ return {
14720
+ dirtyRanges: params.reference ? [{
14721
+ unitId: params.unitId,
14722
+ sheetId: params.reference.sheetId,
14723
+ range: params.reference.range
14724
+ }] : void 0,
14725
+ dirtySuperTableMap: { [params.unitId]: { [params.tableName]: "1" } },
14726
+ clearDependencyTreeCache: params.reference ? { [params.unitId]: { [params.reference.sheetId]: "1" } } : void 0
14727
+ };
14728
+ }
14729
+ });
14730
+ this.disposeWithMe((0, _univerjs_core.toDisposable)(() => {
14731
+ this._activeDirtyManagerService.remove(SetSuperTableMutation.id);
14732
+ this._activeDirtyManagerService.remove(RemoveSuperTableMutation.id);
14733
+ }));
14734
+ }
14735
+ };
14736
+ SuperTableActiveDirtyController = __decorate([__decorateParam(0, IActiveDirtyManagerService)], SuperTableActiveDirtyController);
14737
+
14236
14738
  //#endregion
14237
14739
  //#region src/engine/utils/r1c1-reference.ts
14238
14740
  const $relativeRegex = /[\[\]]/g;
@@ -14404,6 +14906,8 @@ var BaseFunction = class {
14404
14906
  _defineProperty(this, "_subUnitId", void 0);
14405
14907
  _defineProperty(this, "_row", -1);
14406
14908
  _defineProperty(this, "_column", -1);
14909
+ _defineProperty(this, "_currentFormulaRowCount", 1);
14910
+ _defineProperty(this, "_currentFormulaColumnCount", 1);
14407
14911
  _defineProperty(this, "_definedNames", void 0);
14408
14912
  _defineProperty(this, "_locale", void 0);
14409
14913
  _defineProperty(this, "_sheetOrder", void 0);
@@ -14467,6 +14971,23 @@ var BaseFunction = class {
14467
14971
  "needsFilteredOutRows",
14468
14972
  false
14469
14973
  );
14974
+ _defineProperty(
14975
+ this,
14976
+ /**
14977
+ * Whether the function needs unevaluated AST children.
14978
+ */
14979
+ "needsAstChildren",
14980
+ false
14981
+ );
14982
+ _defineProperty(
14983
+ this,
14984
+ /**
14985
+ * Legacy CSE-style array functions should write only the first result cell
14986
+ * when they are used as a top-level normal formula.
14987
+ */
14988
+ "returnsLegacyArrayAsScalar",
14989
+ false
14990
+ );
14470
14991
  _defineProperty(
14471
14992
  this,
14472
14993
  /**
@@ -14499,6 +15020,12 @@ var BaseFunction = class {
14499
15020
  get column() {
14500
15021
  return this._column;
14501
15022
  }
15023
+ get currentFormulaRowCount() {
15024
+ return this._currentFormulaRowCount;
15025
+ }
15026
+ get currentFormulaColumnCount() {
15027
+ return this._currentFormulaColumnCount;
15028
+ }
14502
15029
  dispose() {}
14503
15030
  /**
14504
15031
  * In Excel, to inject a defined name into a function that has positioning capabilities,
@@ -14509,8 +15036,9 @@ var BaseFunction = class {
14509
15036
  getDefinedName(name) {
14510
15037
  const nameMap = this._definedNames;
14511
15038
  if (nameMap == null) return null;
15039
+ const normalizedName = name.toLowerCase();
14512
15040
  return Object.values(nameMap).find((value) => {
14513
- return value.name === name;
15041
+ return value.name.toLowerCase() === normalizedName;
14514
15042
  });
14515
15043
  }
14516
15044
  setDefinedNames(definedNames) {
@@ -14551,11 +15079,13 @@ var BaseFunction = class {
14551
15079
  isArgumentsIgnoreNumberPattern() {
14552
15080
  return false;
14553
15081
  }
14554
- setRefInfo(unitId, subUnitId, row, column) {
15082
+ setRefInfo(unitId, subUnitId, row, column, rowCount = 1, columnCount = 1) {
14555
15083
  this._unitId = unitId;
14556
15084
  this._subUnitId = subUnitId;
14557
15085
  this._row = row;
14558
15086
  this._column = column;
15087
+ this._currentFormulaRowCount = rowCount;
15088
+ this._currentFormulaColumnCount = columnCount;
14559
15089
  }
14560
15090
  calculateCustom(...arg) {
14561
15091
  return null;
@@ -14563,6 +15093,9 @@ var BaseFunction = class {
14563
15093
  calculate(...arg) {
14564
15094
  return ErrorValueObject.create("#VALUE!");
14565
15095
  }
15096
+ calculateAst(_children, _getVariant) {
15097
+ return ErrorValueObject.create("#VALUE!");
15098
+ }
14566
15099
  checkArrayType(variant) {
14567
15100
  return variant.isReferenceObject() || variant.isValueObject() && variant.isArray();
14568
15101
  }
@@ -16660,7 +17193,12 @@ function getArrayValuesByAggregateIgnoreOptions(array, options, formulaDataModel
16660
17193
  if (ignoreErrorValues) continue;
16661
17194
  return valueObject;
16662
17195
  }
16663
- if (!valueObject || valueObject.isNull() || valueObject.isBoolean() || valueObject.isString()) continue;
17196
+ if (!valueObject || valueObject.isNull() || valueObject.isString()) continue;
17197
+ if (!array.isArray() && valueObject.isBoolean()) {
17198
+ values.push(valueObject.getValue() ? 1 : 0);
17199
+ continue;
17200
+ }
17201
+ if (valueObject.isBoolean()) continue;
16664
17202
  const value = valueObject.getValue();
16665
17203
  if (!(0, _univerjs_core.isRealNum)(value)) continue;
16666
17204
  values.push(+value);
@@ -18388,6 +18926,11 @@ var Normsdist = class extends BaseFunction {
18388
18926
 
18389
18927
  //#endregion
18390
18928
  //#region src/functions/compatibility/rank/index.ts
18929
+ function isSameRankNumber$2(left, right) {
18930
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
18931
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
18932
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
18933
+ }
18391
18934
  var Rank = class extends BaseFunction {
18392
18935
  constructor(..._args) {
18393
18936
  super(..._args);
@@ -18413,7 +18956,7 @@ var Rank = class extends BaseFunction {
18413
18956
  const numberValue = +numberObject.getValue();
18414
18957
  const orderValue = +orderObject.getValue();
18415
18958
  if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
18416
- const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).indexOf(numberValue);
18959
+ const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber$2(refNumber, numberValue));
18417
18960
  if (result === -1) return ErrorValueObject.create("#N/A");
18418
18961
  return NumberValueObject.create(result + 1);
18419
18962
  });
@@ -18424,12 +18967,12 @@ var Rank = class extends BaseFunction {
18424
18967
  let refHasError = false;
18425
18968
  let refErrorObject = ErrorValueObject.create("#N/A");
18426
18969
  const refNumbers = [];
18427
- if (!ref.isReferenceObject()) return {
18970
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
18428
18971
  refHasError: true,
18429
18972
  refErrorObject,
18430
18973
  refNumbers
18431
18974
  };
18432
- ref.toArrayValueObject().iterator((refObject) => {
18975
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
18433
18976
  const _refObject = refObject;
18434
18977
  if (_refObject.isError()) {
18435
18978
  refHasError = true;
@@ -19495,7 +20038,8 @@ var Edate = class extends BaseFunction {
19495
20038
  const year = _startDate.getUTCFullYear();
19496
20039
  const month = _startDate.getUTCMonth() + monthsValue;
19497
20040
  const day = _startDate.getUTCDate();
19498
- const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, day)));
20041
+ const lastDayOfTargetMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
20042
+ const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, Math.min(day, lastDayOfTargetMonth))));
19499
20043
  return NumberValueObject.create(currentSerial, DEFAULT_DATE_FORMAT);
19500
20044
  });
19501
20045
  }
@@ -19779,8 +20323,12 @@ var Networkdays = class extends BaseFunction {
19779
20323
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
19780
20324
  const cell = holidays.get(r, c);
19781
20325
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20326
+ if (cell.isNull()) continue;
19782
20327
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
19783
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20328
+ if (typeof holidaySerialNumber !== "number") {
20329
+ if (cell.isString()) continue;
20330
+ return holidaySerialNumber;
20331
+ }
19784
20332
  holidaysValueArray.push(holidaySerialNumber);
19785
20333
  }
19786
20334
  } else {
@@ -19851,8 +20399,12 @@ var NetworkdaysIntl = class extends BaseFunction {
19851
20399
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
19852
20400
  const cell = holidays.get(r, c);
19853
20401
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20402
+ if (cell.isNull()) continue;
19854
20403
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
19855
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20404
+ if (typeof holidaySerialNumber !== "number") {
20405
+ if (cell.isString()) continue;
20406
+ return holidaySerialNumber;
20407
+ }
19856
20408
  holidaysValueArray.push(holidaySerialNumber);
19857
20409
  }
19858
20410
  } else {
@@ -20305,8 +20857,12 @@ var Workday = class extends BaseFunction {
20305
20857
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
20306
20858
  const cell = holidays.get(r, c);
20307
20859
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20860
+ if (cell.isNull()) continue;
20308
20861
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
20309
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20862
+ if (typeof holidaySerialNumber !== "number") {
20863
+ if (cell.isString()) continue;
20864
+ return holidaySerialNumber;
20865
+ }
20310
20866
  holidaysValueArray.push(holidaySerialNumber);
20311
20867
  }
20312
20868
  } else {
@@ -20376,8 +20932,12 @@ var WorkdayIntl = class extends BaseFunction {
20376
20932
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
20377
20933
  const cell = holidays.get(r, c);
20378
20934
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20935
+ if (cell.isNull()) continue;
20379
20936
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
20380
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20937
+ if (typeof holidaySerialNumber !== "number") {
20938
+ if (cell.isString()) continue;
20939
+ return holidaySerialNumber;
20940
+ }
20381
20941
  holidaysValueArray.push(holidaySerialNumber);
20382
20942
  }
20383
20943
  } else {
@@ -27840,6 +28400,232 @@ var False = class extends BaseFunction {
27840
28400
  }
27841
28401
  };
27842
28402
 
28403
+ //#endregion
28404
+ //#region src/functions/logical/groupby/index.ts
28405
+ var Groupby = class extends BaseFunction {
28406
+ constructor(..._args) {
28407
+ super(..._args);
28408
+ _defineProperty(this, "minParams", 3);
28409
+ _defineProperty(this, "maxParams", 7);
28410
+ _defineProperty(this, "needsReferenceObject", true);
28411
+ _defineProperty(this, "needsAstChildren", true);
28412
+ }
28413
+ calculateAst(children, getVariant) {
28414
+ const rowFields = this._arrayInput(getVariant(children[0]));
28415
+ if (rowFields instanceof ErrorValueObject) return rowFields;
28416
+ const values = this._arrayInput(getVariant(children[1]));
28417
+ if (values instanceof ErrorValueObject) return values;
28418
+ const aggregators = this._aggregators(children[2]);
28419
+ if (aggregators.length === 0) return ErrorValueObject.create("#VALUE!");
28420
+ if (values.rowCount !== rowFields.rowCount) return ErrorValueObject.create("#VALUE!");
28421
+ const includeTotal = children[4] == null ? true : this._numberValue(getVariant(children[4])) !== 0;
28422
+ const sortColumnValue = children[5] == null ? 0 : this._numberValue(getVariant(children[5]));
28423
+ const sortColumn = sortColumnValue === 0 ? void 0 : Math.trunc(sortColumnValue);
28424
+ const filter = children[6] == null ? void 0 : this._arrayInput(getVariant(children[6]));
28425
+ if (filter instanceof ErrorValueObject) return filter;
28426
+ const groupColumnCount = rowFields.columnCount;
28427
+ const valueColumnCount = values.columnCount;
28428
+ const outputValueColumnCount = this._outputValueColumnCount(valueColumnCount, aggregators.length);
28429
+ const groups = [];
28430
+ const allValues = Array.from({ length: valueColumnCount }, () => []);
28431
+ for (let row = 0; row < rowFields.rowCount; row++) {
28432
+ if (filter != null && !this._truthy(filter.valueAt(row, 0))) continue;
28433
+ const key = [];
28434
+ for (let column = 0; column < groupColumnCount; column++) key.push(rowFields.valueAt(row, column));
28435
+ let group = groups.find((item) => this._keysEqual(item.key, key));
28436
+ if (group == null) {
28437
+ group = {
28438
+ key,
28439
+ values: Array.from({ length: valueColumnCount }, () => [])
28440
+ };
28441
+ groups.push(group);
28442
+ }
28443
+ for (let column = 0; column < valueColumnCount; column++) {
28444
+ const value = values.valueAt(row, column);
28445
+ group.values[column].push(value);
28446
+ allValues[column].push(value);
28447
+ }
28448
+ }
28449
+ this._sortGroups(groups, sortColumn);
28450
+ const includeHeader = aggregators.length > 1;
28451
+ const rowCount = groups.length + (includeHeader ? 1 : 0) + (includeTotal ? 1 : 0);
28452
+ const columnCount = groupColumnCount + outputValueColumnCount;
28453
+ const result = [];
28454
+ if (includeHeader) {
28455
+ const header = [];
28456
+ for (let column = 0; column < groupColumnCount; column++) header.push(StringValueObject.create(""));
28457
+ for (let column = 0; column < outputValueColumnCount; column++) header.push(StringValueObject.create(this._aggregatorHeader(this._aggregatorForOutput(aggregators, valueColumnCount, column))));
28458
+ result.push(header);
28459
+ }
28460
+ for (const group of groups) {
28461
+ const row = [...group.key];
28462
+ for (let column = 0; column < outputValueColumnCount; column++) {
28463
+ const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
28464
+ const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
28465
+ row.push(this._applyAggregator(aggregator, group.values[valueColumn], allValues[valueColumn]));
28466
+ }
28467
+ result.push(row);
28468
+ }
28469
+ if (includeTotal) {
28470
+ const row = [];
28471
+ for (let column = 0; column < groupColumnCount; column++) row.push(StringValueObject.create(column === 0 ? "Total" : ""));
28472
+ for (let column = 0; column < outputValueColumnCount; column++) {
28473
+ const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
28474
+ const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
28475
+ row.push(this._applyAggregator(aggregator, allValues[valueColumn], allValues[valueColumn]));
28476
+ }
28477
+ result.push(row);
28478
+ }
28479
+ return ArrayValueObject.create({
28480
+ calculateValueList: result,
28481
+ rowCount,
28482
+ columnCount,
28483
+ unitId: this.unitId,
28484
+ sheetId: this.subUnitId,
28485
+ row: this.row,
28486
+ column: this.column
28487
+ });
28488
+ }
28489
+ _arrayInput(variant) {
28490
+ if (variant == null) return ErrorValueObject.create("#VALUE!");
28491
+ let value = variant;
28492
+ if (value.isReferenceObject()) value = value.toArrayValueObject();
28493
+ if (value.isError()) return value;
28494
+ if (value.isArray()) {
28495
+ const array = value;
28496
+ return {
28497
+ rowCount: array.getRowCount(),
28498
+ columnCount: array.getColumnCount(),
28499
+ valueAt: (row, column) => {
28500
+ var _array$get;
28501
+ return (_array$get = array.get(row, column)) !== null && _array$get !== void 0 ? _array$get : NullValueObject.create();
28502
+ }
28503
+ };
28504
+ }
28505
+ return {
28506
+ rowCount: 1,
28507
+ columnCount: 1,
28508
+ valueAt: (row, column) => row === 0 && column === 0 ? value : NullValueObject.create()
28509
+ };
28510
+ }
28511
+ _aggregators(node) {
28512
+ const name = this._normalizedFunctionName(node.getToken());
28513
+ if (name === "GROUPBY") return [];
28514
+ if (name === "HSTACK") return node.getChildren().flatMap((child) => this._aggregators(child));
28515
+ if (this._isAggregatorName(name)) return [name];
28516
+ return [];
28517
+ }
28518
+ _normalizedFunctionName(token) {
28519
+ let normalized = token.toUpperCase();
28520
+ for (;;) {
28521
+ const prefix = [
28522
+ "_XLFN.",
28523
+ "_XLWS.",
28524
+ "_XLETA."
28525
+ ].find((item) => normalized.startsWith(item));
28526
+ if (prefix == null) return normalized;
28527
+ normalized = normalized.slice(prefix.length);
28528
+ }
28529
+ }
28530
+ _isAggregatorName(name) {
28531
+ return name === "SUM" || name === "COUNT" || name === "COUNTA" || name === "PERCENTOF" || name === "MIN" || name === "MAX" || name === "ARRAYTOTEXT";
28532
+ }
28533
+ _outputValueColumnCount(valueColumnCount, aggregatorCount) {
28534
+ if (valueColumnCount === 1) return aggregatorCount;
28535
+ if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return valueColumnCount;
28536
+ return Math.min(valueColumnCount, aggregatorCount);
28537
+ }
28538
+ _valueColumnForOutput(valueColumnCount, aggregatorCount, outputColumn) {
28539
+ if (valueColumnCount === 1) return 0;
28540
+ if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return Math.min(outputColumn, valueColumnCount - 1);
28541
+ return Math.min(outputColumn, valueColumnCount - 1);
28542
+ }
28543
+ _aggregatorForOutput(aggregators, valueColumnCount, outputColumn) {
28544
+ if (aggregators.length === 1 || valueColumnCount === aggregators.length) return aggregators[Math.min(outputColumn, aggregators.length - 1)];
28545
+ return aggregators[Math.min(outputColumn, aggregators.length - 1)];
28546
+ }
28547
+ _aggregatorHeader(aggregator) {
28548
+ return aggregator === "PERCENTOF" ? "%" : aggregator;
28549
+ }
28550
+ _applyAggregator(aggregator, groupValues, allValues) {
28551
+ switch (aggregator) {
28552
+ case "SUM": return NumberValueObject.create(this._sum(groupValues));
28553
+ case "COUNT": return NumberValueObject.create(groupValues.filter((value) => value.isNumber()).length);
28554
+ case "COUNTA": return NumberValueObject.create(groupValues.filter((value) => !value.isNull() && !(value.isString() && value.getValue() === "")).length);
28555
+ case "PERCENTOF": {
28556
+ const allTotal = this._sum(allValues);
28557
+ if (allTotal === 0) return ErrorValueObject.create("#DIV/0!");
28558
+ return NumberValueObject.create(this._sum(groupValues) / allTotal);
28559
+ }
28560
+ case "MIN": {
28561
+ const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
28562
+ return NumberValueObject.create(values.length === 0 ? 0 : Math.min(...values));
28563
+ }
28564
+ case "MAX": {
28565
+ const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
28566
+ return NumberValueObject.create(values.length === 0 ? 0 : Math.max(...values));
28567
+ }
28568
+ case "ARRAYTOTEXT": return StringValueObject.create(groupValues.map((value) => this._textValue(value)).filter(Boolean).join(", "));
28569
+ }
28570
+ }
28571
+ _sum(values) {
28572
+ return values.reduce((sum, value) => {
28573
+ var _this$_numericValue;
28574
+ return sum + ((_this$_numericValue = this._numericValue(value)) !== null && _this$_numericValue !== void 0 ? _this$_numericValue : 0);
28575
+ }, 0);
28576
+ }
28577
+ _numericValue(value) {
28578
+ return value.isNumber() ? Number(value.getValue()) : void 0;
28579
+ }
28580
+ _numberValue(variant) {
28581
+ if (variant == null || variant.isError()) return 0;
28582
+ if (variant.isReferenceObject()) variant = variant.getFirstCell();
28583
+ if (variant.isArray()) {
28584
+ var _get;
28585
+ variant = (_get = variant.get(0, 0)) !== null && _get !== void 0 ? _get : NullValueObject.create();
28586
+ }
28587
+ const value = variant.getValue();
28588
+ return typeof value === "number" ? Math.trunc(value) : Math.trunc(Number(value) || 0);
28589
+ }
28590
+ _truthy(value) {
28591
+ if (value.isError() || value.isNull()) return false;
28592
+ return Boolean(value.getValue());
28593
+ }
28594
+ _keysEqual(left, right) {
28595
+ return left.length === right.length && left.every((value, index) => this._keyValue(value) === this._keyValue(right[index]));
28596
+ }
28597
+ _keyValue(value) {
28598
+ if (value.isError()) return `error:${value.getErrorType()}`;
28599
+ if (value.isNull()) return "null:";
28600
+ return `${typeof value.getValue()}:${String(value.getValue())}`;
28601
+ }
28602
+ _sortGroups(groups, sortColumn) {
28603
+ const descending = sortColumn != null && sortColumn < 0;
28604
+ const sortIndex = sortColumn == null ? void 0 : Math.abs(sortColumn) - 1;
28605
+ groups.sort((left, right) => {
28606
+ const compare = sortIndex != null && sortIndex < left.key.length ? this._compareValue(left.key[sortIndex], right.key[sortIndex]) : this._compareKey(left.key, right.key);
28607
+ return descending ? -compare : compare;
28608
+ });
28609
+ }
28610
+ _compareKey(left, right) {
28611
+ for (let index = 0; index < Math.min(left.length, right.length); index++) {
28612
+ const compare = this._compareValue(left[index], right[index]);
28613
+ if (compare !== 0) return compare;
28614
+ }
28615
+ return left.length - right.length;
28616
+ }
28617
+ _compareValue(left, right) {
28618
+ const leftNumber = this._numericValue(left);
28619
+ const rightNumber = this._numericValue(right);
28620
+ if (leftNumber != null && rightNumber != null) return leftNumber - rightNumber;
28621
+ return this._textValue(left).toUpperCase().localeCompare(this._textValue(right).toUpperCase());
28622
+ }
28623
+ _textValue(value) {
28624
+ if (value.isNull()) return "";
28625
+ return String(value.getValue());
28626
+ }
28627
+ };
28628
+
27843
28629
  //#endregion
27844
28630
  //#region src/functions/logical/if/index.ts
27845
28631
  var If = class extends BaseFunction {
@@ -27850,12 +28636,18 @@ var If = class extends BaseFunction {
27850
28636
  }
27851
28637
  calculate(logicalTest, valueIfTrue, valueIfFalse = BooleanValueObject.create(false)) {
27852
28638
  let _logicalTest = logicalTest;
28639
+ let useLegacyImplicitSelectedValue = false;
27853
28640
  if (logicalTest.isArray()) {
27854
- const rowCount = logicalTest.getRowCount();
27855
- const columnCount = logicalTest.getColumnCount();
27856
- if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTest.get(0, 0);
28641
+ const logicalTestArray = logicalTest;
28642
+ const rowCount = logicalTestArray.getRowCount();
28643
+ const columnCount = logicalTestArray.getColumnCount();
28644
+ if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTestArray.get(0, 0);
28645
+ else if (!this._isCurrentArrayFormula() && logicalTestArray.getUnitId() !== "" && logicalTestArray.getSheetId() !== "" && logicalTestArray.getCurrentRow() >= 0 && logicalTestArray.getCurrentColumn() >= 0) {
28646
+ _logicalTest = this._legacyImplicitArrayValue(logicalTestArray);
28647
+ useLegacyImplicitSelectedValue = true;
28648
+ }
27857
28649
  }
27858
- if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse);
28650
+ if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue);
27859
28651
  const maxRowLength = Math.max(_logicalTest.isArray() ? _logicalTest.getRowCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getRowCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getRowCount() : 1);
27860
28652
  const maxColumnLength = Math.max(_logicalTest.isArray() ? _logicalTest.getColumnCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getColumnCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getColumnCount() : 1);
27861
28653
  const logicalTestArray = expandArrayValueObject(maxRowLength, maxColumnLength, _logicalTest, ErrorValueObject.create("#N/A"));
@@ -27864,12 +28656,63 @@ var If = class extends BaseFunction {
27864
28656
  return logicalTestArray.mapValue((logicalTestValue, rowIndex, columnIndex) => {
27865
28657
  const valueIfTrueValue = valueIfTrueArray.get(rowIndex, columnIndex);
27866
28658
  const valueIfFalseValue = valueIfFalseArray.get(rowIndex, columnIndex);
27867
- return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue);
28659
+ return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue, false);
27868
28660
  });
27869
28661
  }
27870
- _handleSingleObject(logicalTest, valueIfTrue, valueIfFalse) {
28662
+ _handleSingleObject(logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue) {
27871
28663
  if (logicalTest.isError()) return logicalTest;
27872
- return logicalTest.getValue() ? valueIfTrue : valueIfFalse;
28664
+ const logicalTestValue = this._coerceLogicalTest(logicalTest);
28665
+ if (logicalTestValue.isError()) return logicalTestValue;
28666
+ let selectedValue = logicalTestValue.getValue() ? valueIfTrue : valueIfFalse;
28667
+ if (useLegacyImplicitSelectedValue) selectedValue = this._legacyImplicitSelectedValue(selectedValue);
28668
+ return this._coerceSelectedValue(selectedValue);
28669
+ }
28670
+ _coerceSelectedValue(value) {
28671
+ return value.isNull() ? NumberValueObject.create(0) : value;
28672
+ }
28673
+ _coerceLogicalTest(logicalTest) {
28674
+ if (logicalTest.isNull()) return BooleanValueObject.create(false);
28675
+ if (logicalTest.isBoolean()) return logicalTest;
28676
+ if (logicalTest.isNumber()) return BooleanValueObject.create(Number(logicalTest.getValue()) !== 0);
28677
+ if (logicalTest.isString()) {
28678
+ const value = `${logicalTest.getValue()}`.trim().toUpperCase();
28679
+ if (value === "TRUE") return BooleanValueObject.create(true);
28680
+ if (value === "FALSE") return BooleanValueObject.create(false);
28681
+ }
28682
+ return ErrorValueObject.create("#VALUE!");
28683
+ }
28684
+ _legacyImplicitSelectedValue(value) {
28685
+ if (!value.isArray()) return value;
28686
+ const array = value;
28687
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return value;
28688
+ return this._legacyImplicitArrayValue(array);
28689
+ }
28690
+ _legacyImplicitArrayValue(logicalTest) {
28691
+ const startRow = logicalTest.getCurrentRow();
28692
+ const startColumn = logicalTest.getCurrentColumn();
28693
+ const rowCount = logicalTest.getRowCount();
28694
+ const columnCount = logicalTest.getColumnCount();
28695
+ if (startRow < 0 || startColumn < 0) return ErrorValueObject.create("#VALUE!");
28696
+ let rowIndex = -1;
28697
+ let columnIndex = -1;
28698
+ if (rowCount === 1 && columnCount === 1) {
28699
+ rowIndex = 0;
28700
+ columnIndex = 0;
28701
+ } else if (rowCount === 1) {
28702
+ rowIndex = 0;
28703
+ columnIndex = this.column - startColumn;
28704
+ } else if (columnCount === 1) {
28705
+ rowIndex = this.row - startRow;
28706
+ columnIndex = 0;
28707
+ } else {
28708
+ rowIndex = this.row - startRow;
28709
+ columnIndex = this.column - startColumn;
28710
+ }
28711
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
28712
+ return logicalTest.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
28713
+ }
28714
+ _isCurrentArrayFormula() {
28715
+ return this.currentFormulaRowCount > 1 || this.currentFormulaColumnCount > 1;
27873
28716
  }
27874
28717
  };
27875
28718
 
@@ -27880,8 +28723,11 @@ var Iferror = class extends BaseFunction {
27880
28723
  super(..._args);
27881
28724
  _defineProperty(this, "minParams", 2);
27882
28725
  _defineProperty(this, "maxParams", 2);
28726
+ _defineProperty(this, "needsReferenceObject", true);
27883
28727
  }
27884
28728
  calculate(value, valueIfError) {
28729
+ value = this._toValueObject(value);
28730
+ valueIfError = this._toValueObject(valueIfError);
27885
28731
  if (!value.isArray()) return value.isError() ? valueIfError : value;
27886
28732
  const maxRowLength = Math.max(value.isArray() ? value.getRowCount() : 1, valueIfError.isArray() ? valueIfError.getRowCount() : 1);
27887
28733
  const maxColumnLength = Math.max(value.isArray() ? value.getColumnCount() : 1, valueIfError.isArray() ? valueIfError.getColumnCount() : 1);
@@ -27892,6 +28738,12 @@ var Iferror = class extends BaseFunction {
27892
28738
  });
27893
28739
  return valueArray;
27894
28740
  }
28741
+ _toValueObject(value) {
28742
+ if (!value.isReferenceObject()) return value;
28743
+ const reference = value;
28744
+ if (reference.getRowCount() === 1 && reference.getColumnCount() === 1) return reference.getCellByPosition();
28745
+ return reference.toArrayValueObject();
28746
+ }
27895
28747
  };
27896
28748
 
27897
28749
  //#endregion
@@ -28168,6 +29020,23 @@ var Or = class extends BaseFunction {
28168
29020
  }
28169
29021
  };
28170
29022
 
29023
+ //#endregion
29024
+ //#region src/functions/logical/percentof/index.ts
29025
+ /**
29026
+ * PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
29027
+ * AST path, not as a standalone scalar function.
29028
+ */
29029
+ var Percentof = class extends BaseFunction {
29030
+ constructor(..._args) {
29031
+ super(..._args);
29032
+ _defineProperty(this, "minParams", 0);
29033
+ _defineProperty(this, "maxParams", 0);
29034
+ }
29035
+ calculate(..._variants) {
29036
+ return ErrorValueObject.create("#VALUE!");
29037
+ }
29038
+ };
29039
+
28171
29040
  //#endregion
28172
29041
  //#region src/functions/logical/reduce/index.ts
28173
29042
  var Reduce = class extends BaseFunction {
@@ -28451,6 +29320,7 @@ const functionLogical = [
28451
29320
  [Bycol, "BYCOL"],
28452
29321
  [Byrow, "BYROW"],
28453
29322
  [False, "FALSE"],
29323
+ [Groupby, "GROUPBY"],
28454
29324
  [If, "IF"],
28455
29325
  [Iferror, "IFERROR"],
28456
29326
  [Ifna, "IFNA"],
@@ -28461,6 +29331,7 @@ const functionLogical = [
28461
29331
  [Map$1, "MAP"],
28462
29332
  [Not, "NOT"],
28463
29333
  [Or, "OR"],
29334
+ [Percentof, "PERCENTOF"],
28464
29335
  [Reduce, "REDUCE"],
28465
29336
  [Scan, "SCAN"],
28466
29337
  [Switch, "SWITCH"],
@@ -28482,9 +29353,9 @@ var Address = class extends BaseFunction {
28482
29353
  if (absNumber === null || absNumber === void 0 ? void 0 : absNumber.isError()) return absNumber;
28483
29354
  if (a1 === null || a1 === void 0 ? void 0 : a1.isError()) return a1;
28484
29355
  if (sheetText === null || sheetText === void 0 ? void 0 : sheetText.isError()) return sheetText;
28485
- const _absNumber = absNumber !== null && absNumber !== void 0 ? absNumber : NumberValueObject.create(1);
28486
- const _a1 = a1 !== null && a1 !== void 0 ? a1 : BooleanValueObject.create(true);
28487
- const _sheetText = sheetText !== null && sheetText !== void 0 ? sheetText : StringValueObject.create("");
29356
+ const _absNumber = absNumber == null || absNumber.isNull() ? NumberValueObject.create(1) : absNumber;
29357
+ const _a1 = a1 == null || a1.isNull() ? BooleanValueObject.create(true) : a1;
29358
+ const _sheetText = sheetText == null || sheetText.isNull() ? StringValueObject.create("") : sheetText;
28488
29359
  const maxRowLength = Math.max(rowNumber.isArray() ? rowNumber.getRowCount() : 1, columnNumber.isArray() ? columnNumber.getRowCount() : 1, _absNumber.isArray() ? _absNumber.getRowCount() : 1, _a1.isArray() ? _a1.getRowCount() : 1, _sheetText.isArray() ? _sheetText.getRowCount() : 1);
28489
29360
  const maxColumnLength = Math.max(rowNumber.isArray() ? rowNumber.getColumnCount() : 1, columnNumber.isArray() ? columnNumber.getColumnCount() : 1, _absNumber.isArray() ? _absNumber.getColumnCount() : 1, _a1.isArray() ? _a1.getColumnCount() : 1, _sheetText.isArray() ? _sheetText.getColumnCount() : 1);
28490
29361
  const rowNumArray = expandArrayValueObject(maxRowLength, maxColumnLength, rowNumber, ErrorValueObject.create("#N/A"));
@@ -28535,6 +29406,20 @@ function transformAbsoluteRefType(number) {
28535
29406
  }
28536
29407
  }
28537
29408
 
29409
+ //#endregion
29410
+ //#region src/functions/lookup/anchorarray/index.ts
29411
+ var Anchorarray = class extends BaseFunction {
29412
+ constructor(..._args) {
29413
+ super(..._args);
29414
+ _defineProperty(this, "minParams", 1);
29415
+ _defineProperty(this, "maxParams", 1);
29416
+ _defineProperty(this, "needsReferenceObject", true);
29417
+ }
29418
+ calculate(reference) {
29419
+ return reference;
29420
+ }
29421
+ };
29422
+
28538
29423
  //#endregion
28539
29424
  //#region src/functions/lookup/areas/index.ts
28540
29425
  var Areas = class extends BaseFunction {
@@ -29045,9 +29930,13 @@ var Hlookup = class extends BaseFunction {
29045
29930
  return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
29046
29931
  }
29047
29932
  _handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
29048
- if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
29933
+ if (rangeLookupValue === 0) return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
29049
29934
  return this.binarySearch(value, searchArray, resultArray);
29050
29935
  }
29936
+ _blankResultAsZero(value) {
29937
+ if (value.isNull()) return NumberValueObject.create(0);
29938
+ return value;
29939
+ }
29051
29940
  };
29052
29941
 
29053
29942
  //#endregion
@@ -29319,6 +30208,17 @@ var Index = class extends BaseFunction {
29319
30208
 
29320
30209
  //#endregion
29321
30210
  //#region src/functions/lookup/indirect/index.ts
30211
+ const INDIRECT_ERROR_LITERALS = [
30212
+ "#NULL!",
30213
+ "#DIV/0!",
30214
+ "#VALUE!",
30215
+ "#REF!",
30216
+ "#NAME?",
30217
+ "#NUM!",
30218
+ "#N/A",
30219
+ "#CYCLE!",
30220
+ "#CALC!"
30221
+ ];
29322
30222
  var Indirect = class extends BaseFunction {
29323
30223
  constructor(..._args) {
29324
30224
  super(..._args);
@@ -29347,6 +30247,8 @@ var Indirect = class extends BaseFunction {
29347
30247
  _handleSingleObject(refTextObject, a1Value) {
29348
30248
  const refTextValue = `${refTextObject.getValue()}`;
29349
30249
  if (refTextValue.trim() === "") return ErrorValueObject.create("#REF!");
30250
+ const embeddedError = this._matchErrorLiteral(refTextValue);
30251
+ if (embeddedError != null) return ErrorValueObject.create(embeddedError);
29350
30252
  const refTextV = this._convertToDefinedName(refTextValue);
29351
30253
  if (a1Value === 0) {
29352
30254
  const { range, sheetName, unitId } = deserializeRangeForR1C1(refTextV);
@@ -29385,6 +30287,10 @@ var Indirect = class extends BaseFunction {
29385
30287
  if (formulaOrRefString.startsWith("=")) return formulaOrRefString.slice(1);
29386
30288
  return formulaOrRefString;
29387
30289
  }
30290
+ _matchErrorLiteral(refText) {
30291
+ const normalizedRefText = refText.toUpperCase();
30292
+ return INDIRECT_ERROR_LITERALS.find((errorType) => normalizedRefText.includes(errorType));
30293
+ }
29388
30294
  };
29389
30295
 
29390
30296
  //#endregion
@@ -29452,7 +30358,7 @@ var Match = class extends BaseFunction {
29452
30358
  const columnCountLookup = lookupArray.getColumnCount();
29453
30359
  if (rowCountLookup !== 1 && columnCountLookup !== 1) return ErrorValueObject.create("#N/A");
29454
30360
  if (matchType === null || matchType === void 0 ? void 0 : matchType.isError()) return ErrorValueObject.create("#N/A");
29455
- const matchTypeValue = this.getMatchTypeValue(matchType);
30361
+ const matchTypeValue = (matchType === null || matchType === void 0 ? void 0 : matchType.isNull()) ? 0 : this.getMatchTypeValue(matchType);
29456
30362
  if (matchTypeValue == null) return ErrorValueObject.create("#VALUE!");
29457
30363
  if (lookupValue.isArray()) return lookupValue.map((value) => this._handleSingleObject(value, lookupArray, matchTypeValue));
29458
30364
  return this._handleSingleObject(lookupValue, lookupArray, matchTypeValue);
@@ -29871,9 +30777,10 @@ var Sort = class extends BaseFunction {
29871
30777
  }
29872
30778
  calculate(array, sortIndex, sortOrder, byCol) {
29873
30779
  let _sortIndex = sortIndex !== null && sortIndex !== void 0 ? sortIndex : NumberValueObject.create(1);
29874
- const _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
30780
+ let _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
29875
30781
  const _byCol = byCol !== null && byCol !== void 0 ? byCol : BooleanValueObject.create(false);
29876
30782
  if (_sortIndex.isNull()) _sortIndex = NumberValueObject.create(1);
30783
+ if (_sortOrder.isNull()) _sortOrder = NumberValueObject.create(1);
29877
30784
  if (_byCol.isArray()) {
29878
30785
  const byColRowCount = _byCol.getRowCount();
29879
30786
  const byColColumnCount = _byCol.getColumnCount();
@@ -30638,9 +31545,26 @@ var Vlookup = class extends BaseFunction {
30638
31545
  return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
30639
31546
  }
30640
31547
  _handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
30641
- if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
31548
+ if (rangeLookupValue === 0) {
31549
+ if (value.isNull()) return this._equalSearchBlankLookupValue(searchArray, resultArray);
31550
+ return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
31551
+ }
30642
31552
  return this.binarySearch(value, searchArray, resultArray);
30643
31553
  }
31554
+ _equalSearchBlankLookupValue(searchArray, resultArray) {
31555
+ var _resultArrayValue$;
31556
+ const zero = NumberValueObject.create(0);
31557
+ const matched = searchArray.mapValue((value) => {
31558
+ if (value.isNull()) return BooleanValueObject.create(false);
31559
+ return value.isEqual(zero);
31560
+ });
31561
+ const resultArrayValue = resultArray.pickRaw(matched);
31562
+ return this._blankResultAsZero(((_resultArrayValue$ = resultArrayValue[0]) === null || _resultArrayValue$ === void 0 ? void 0 : _resultArrayValue$[0]) || ErrorValueObject.create("#N/A"));
31563
+ }
31564
+ _blankResultAsZero(value) {
31565
+ if (value.isNull()) return NumberValueObject.create(0);
31566
+ return value;
31567
+ }
30644
31568
  };
30645
31569
 
30646
31570
  //#endregion
@@ -30810,7 +31734,8 @@ var Xlookup = class extends BaseFunction {
30810
31734
  if (matchMode === null || matchMode === void 0 ? void 0 : matchMode.isNull()) _matchMode = NumberValueObject.create(0);
30811
31735
  let _searchMode = searchMode !== null && searchMode !== void 0 ? searchMode : NumberValueObject.create(1);
30812
31736
  if (searchMode === null || searchMode === void 0 ? void 0 : searchMode.isNull()) _searchMode = NumberValueObject.create(1);
30813
- if (lookupValue.isError()) return lookupValue;
31737
+ const _lookupValue = this._legacyImplicitLookupValue(lookupValue);
31738
+ if (_lookupValue.isError()) return _lookupValue;
30814
31739
  const rowCountLookup = lookupArray.isArray() ? lookupArray.getRowCount() : 1;
30815
31740
  const columnCountLookup = lookupArray.isArray() ? lookupArray.getColumnCount() : 1;
30816
31741
  const rowCountReturn = returnArray.isArray() ? returnArray.getRowCount() : 1;
@@ -30822,7 +31747,7 @@ var Xlookup = class extends BaseFunction {
30822
31747
  if (matchModeValue instanceof ErrorValueObject) return matchModeValue;
30823
31748
  const searchModeValue = this.getIndexNumValue(_searchMode);
30824
31749
  if (searchModeValue instanceof ErrorValueObject) return searchModeValue;
30825
- return this._getResult(lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
31750
+ return this._getResult(_lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
30826
31751
  }
30827
31752
  _getResult(lookupValue, lookupArray, returnArray, ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn) {
30828
31753
  const lookupValueRowCount = lookupValue.isArray() ? lookupValue.getRowCount() : 1;
@@ -30837,7 +31762,7 @@ var Xlookup = class extends BaseFunction {
30837
31762
  if (checkErrorCombination) return checkErrorCombination;
30838
31763
  const result = this._handleSingleObject(value, lookupArray, resultArray, matchModeValue, searchModeValue);
30839
31764
  if (result.isError()) return ifNotFound;
30840
- return result;
31765
+ return this._blankResultAsZero(result);
30841
31766
  });
30842
31767
  }
30843
31768
  const _lookupValue = lookupValue.isArray() ? lookupValue.get(0, 0) : lookupValue;
@@ -30846,7 +31771,7 @@ var Xlookup = class extends BaseFunction {
30846
31771
  if (checkErrorCombination) return checkErrorCombination;
30847
31772
  const result = this._handleSingleObject(_lookupValue, lookupArray, returnArray, matchModeValue, searchModeValue);
30848
31773
  if (result.isError()) return ifNotFound;
30849
- return result;
31774
+ return this._blankResultAsZero(result);
30850
31775
  }
30851
31776
  let axis = 0;
30852
31777
  /**
@@ -30858,6 +31783,32 @@ var Xlookup = class extends BaseFunction {
30858
31783
  if (resultArray == null) return ErrorValueObject.create("#N/A");
30859
31784
  return resultArray;
30860
31785
  }
31786
+ _legacyImplicitLookupValue(lookupValue) {
31787
+ if (!lookupValue.isArray()) return lookupValue;
31788
+ const array = lookupValue;
31789
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return lookupValue;
31790
+ const startRow = array.getCurrentRow();
31791
+ const startColumn = array.getCurrentColumn();
31792
+ const rowCount = array.getRowCount();
31793
+ const columnCount = array.getColumnCount();
31794
+ let rowIndex = -1;
31795
+ let columnIndex = -1;
31796
+ if (rowCount === 1 && columnCount === 1) {
31797
+ rowIndex = 0;
31798
+ columnIndex = 0;
31799
+ } else if (rowCount === 1) {
31800
+ rowIndex = 0;
31801
+ columnIndex = this.column - startColumn;
31802
+ } else if (columnCount === 1) {
31803
+ rowIndex = this.row - startRow;
31804
+ columnIndex = 0;
31805
+ } else {
31806
+ rowIndex = this.row - startRow;
31807
+ columnIndex = this.column - startColumn;
31808
+ }
31809
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
31810
+ return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
31811
+ }
30861
31812
  _handleExpandObject(value, searchArray, resultArray, matchModeValue, searchModeValue, axis = 0) {
30862
31813
  if ((searchModeValue === 2 || searchModeValue === -2) && matchModeValue !== 2) {
30863
31814
  const searchType = getSearchModeValue(searchModeValue);
@@ -30878,6 +31829,10 @@ var Xlookup = class extends BaseFunction {
30878
31829
  if (matchModeValue === -1 || matchModeValue === 1) return this.orderSearch(value, searchArray, resultArray, matchModeValue === 1 ? 2 : 1, searchModeValue === -1);
30879
31830
  return this.equalSearch(value, searchArray, resultArray, searchModeValue !== -1);
30880
31831
  }
31832
+ _blankResultAsZero(value) {
31833
+ if (value.isNull()) return NumberValueObject.create(0);
31834
+ return value;
31835
+ }
30881
31836
  /**
30882
31837
  * Wildcard matching and binary search cannot appear at the same time
30883
31838
  * @param matchModeValue
@@ -30994,6 +31949,7 @@ var Xmatch = class extends BaseFunction {
30994
31949
  */
30995
31950
  const functionLookup = [
30996
31951
  [Address, "ADDRESS"],
31952
+ [Anchorarray, "ANCHORARRAY"],
30997
31953
  [Areas, "AREAS"],
30998
31954
  [Choose, "CHOOSE"],
30999
31955
  [Choosecols, "CHOOSECOLS"],
@@ -32099,7 +33055,7 @@ var Int = class extends BaseFunction {
32099
33055
  let _number = number;
32100
33056
  if (_number.isString()) _number = _number.convertToNumberObjectValue();
32101
33057
  if (_number.isError()) return _number;
32102
- const numberValue = Math.floor(+_number.getValue());
33058
+ const numberValue = Math.floor(stripErrorMargin(+_number.getValue()));
32103
33059
  return NumberValueObject.create(numberValue);
32104
33060
  }
32105
33061
  };
@@ -33451,6 +34407,7 @@ var Sum = class extends BaseFunction {
33451
34407
  let accumulatorAll = NumberValueObject.create(0);
33452
34408
  for (let i = 0; i < variants.length; i++) {
33453
34409
  let variant = variants[i];
34410
+ variant = this._legacyImplicitDerivedArray(variant);
33454
34411
  if (variant.isString()) variant = variant.convertToNumberObjectValue();
33455
34412
  if (variant.isError()) return variant;
33456
34413
  if (variant.isArray()) variant = variant.sum();
@@ -33460,6 +34417,30 @@ var Sum = class extends BaseFunction {
33460
34417
  }
33461
34418
  return accumulatorAll;
33462
34419
  }
34420
+ _legacyImplicitDerivedArray(variant) {
34421
+ if (!variant.isArray()) return variant;
34422
+ const array = variant;
34423
+ if (array.usesInvertedIndexCache() || !array.usesLegacyImplicitForAggregate()) return variant;
34424
+ const startRow = array.getCurrentRow();
34425
+ const startColumn = array.getCurrentColumn();
34426
+ if (startRow < 0 || startColumn < 0) return variant;
34427
+ const rowCount = array.getRowCount();
34428
+ const columnCount = array.getColumnCount();
34429
+ let rowIndex = -1;
34430
+ let columnIndex = -1;
34431
+ if (rowCount === 1) {
34432
+ rowIndex = 0;
34433
+ columnIndex = this.column - startColumn;
34434
+ } else if (columnCount === 1) {
34435
+ rowIndex = this.row - startRow;
34436
+ columnIndex = 0;
34437
+ } else {
34438
+ rowIndex = this.row - startRow;
34439
+ columnIndex = this.column - startColumn;
34440
+ }
34441
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
34442
+ return array.get(rowIndex, columnIndex) || variant;
34443
+ }
33463
34444
  };
33464
34445
 
33465
34446
  //#endregion
@@ -34033,8 +35014,17 @@ var Compare = class extends BaseFunction {
34033
35014
  calculate(variant1, variant2) {
34034
35015
  if (variant1.isError()) return variant1;
34035
35016
  if (variant2.isError()) return variant2;
35017
+ const variant1Error = this._coerceErrorLiteral(variant1);
35018
+ if (variant1Error) return variant1Error;
35019
+ const variant2Error = this._coerceErrorLiteral(variant2);
35020
+ if (variant2Error) return variant2Error;
34036
35021
  return variant1.compare(variant2, this._compareType);
34037
35022
  }
35023
+ _coerceErrorLiteral(variant) {
35024
+ const value = variant.getValue();
35025
+ if (typeof value === "string" && ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
35026
+ return null;
35027
+ }
34038
35028
  };
34039
35029
 
34040
35030
  //#endregion
@@ -34292,6 +35282,7 @@ var Average = class extends BaseFunction {
34292
35282
  let accumulatorCount = NumberValueObject.create(0);
34293
35283
  for (let i = 0; i < variants.length; i++) {
34294
35284
  let variant = variants[i];
35285
+ variant = this._legacyImplicitDerivedArray(variant);
34295
35286
  if (variant.isString() || variant.isBoolean()) variant = variant.convertToNumberObjectValue();
34296
35287
  if (variant.isError()) return variant;
34297
35288
  if (variant.isArray()) {
@@ -34305,6 +35296,30 @@ var Average = class extends BaseFunction {
34305
35296
  }
34306
35297
  return accumulatorSum.divided(accumulatorCount);
34307
35298
  }
35299
+ _legacyImplicitDerivedArray(variant) {
35300
+ if (!variant.isArray()) return variant;
35301
+ const array = variant;
35302
+ if (array.usesInvertedIndexCache()) return variant;
35303
+ const startRow = array.getCurrentRow();
35304
+ const startColumn = array.getCurrentColumn();
35305
+ if (startRow < 0 || startColumn < 0) return variant;
35306
+ const rowCount = array.getRowCount();
35307
+ const columnCount = array.getColumnCount();
35308
+ let rowIndex = -1;
35309
+ let columnIndex = -1;
35310
+ if (rowCount === 1) {
35311
+ rowIndex = 0;
35312
+ columnIndex = this.column - startColumn;
35313
+ } else if (columnCount === 1) {
35314
+ rowIndex = this.row - startRow;
35315
+ columnIndex = 0;
35316
+ } else {
35317
+ rowIndex = this.row - startRow;
35318
+ columnIndex = this.column - startColumn;
35319
+ }
35320
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
35321
+ return array.get(rowIndex, columnIndex) || variant;
35322
+ }
34308
35323
  };
34309
35324
 
34310
35325
  //#endregion
@@ -34837,7 +35852,13 @@ var Countif = class extends BaseFunction {
34837
35852
  calculate(range, criteria) {
34838
35853
  if (!range.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
34839
35854
  let _criteria = criteria;
34840
- if (criteria.isReferenceObject()) _criteria = criteria.toArrayValueObject();
35855
+ if (criteria.isReferenceObject()) {
35856
+ _criteria = criteria.toArrayValueObject();
35857
+ if (_criteria.getRowCount() === 1 && _criteria.getColumnCount() === 1) {
35858
+ const firstCriteria = _criteria.get(0, 0);
35859
+ _criteria = firstCriteria.isNull() ? NumberValueObject.create(0) : firstCriteria;
35860
+ }
35861
+ }
34841
35862
  if (_criteria.isArray()) {
34842
35863
  const resultArray = _criteria.mapValue((criteriaObject) => this._handleSingleObject(range, criteriaObject));
34843
35864
  if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
@@ -34872,7 +35893,7 @@ var Countifs = class extends BaseFunction {
34872
35893
  _defineProperty(this, "needsReferenceObject", true);
34873
35894
  }
34874
35895
  calculate(...variants) {
34875
- const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(variants);
35896
+ const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(this._legacyImplicitDerivedCriteria(variants));
34876
35897
  if (isError) return errorObject;
34877
35898
  if (rangeIsDifferentSize) {
34878
35899
  if (criteriaMaxRowLength === 1 && criteriaMaxColumnLength === 1) return ErrorValueObject.create("#VALUE!");
@@ -34895,6 +35916,32 @@ var Countifs = class extends BaseFunction {
34895
35916
  column: this.column
34896
35917
  });
34897
35918
  }
35919
+ _legacyImplicitDerivedCriteria(variants) {
35920
+ return variants.map((variant, index) => {
35921
+ if (index % 2 === 0 || !variant.isArray()) return variant;
35922
+ const array = variant;
35923
+ if (array.usesInvertedIndexCache()) return variant;
35924
+ const startRow = array.getCurrentRow();
35925
+ const startColumn = array.getCurrentColumn();
35926
+ if (startRow < 0 || startColumn < 0) return variant;
35927
+ const rowCount = array.getRowCount();
35928
+ const columnCount = array.getColumnCount();
35929
+ let rowIndex = -1;
35930
+ let columnIndex = -1;
35931
+ if (rowCount === 1) {
35932
+ rowIndex = 0;
35933
+ columnIndex = this.column - startColumn;
35934
+ } else if (columnCount === 1) {
35935
+ rowIndex = this.row - startRow;
35936
+ columnIndex = 0;
35937
+ } else {
35938
+ rowIndex = this.row - startRow;
35939
+ columnIndex = this.column - startColumn;
35940
+ }
35941
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
35942
+ return array.get(rowIndex, columnIndex) || variant;
35943
+ });
35944
+ }
34898
35945
  };
34899
35946
 
34900
35947
  //#endregion
@@ -35672,6 +36719,7 @@ var Linest = class extends BaseFunction {
35672
36719
  super(..._args);
35673
36720
  _defineProperty(this, "minParams", 1);
35674
36721
  _defineProperty(this, "maxParams", 4);
36722
+ _defineProperty(this, "returnsLegacyArrayAsScalar", true);
35675
36723
  }
35676
36724
  calculate(knownYs, knownXs, constb, stats) {
35677
36725
  const { isError, errorObject } = checkKnownsArrayDimensions(knownYs, knownXs);
@@ -36201,7 +37249,11 @@ var Median = class extends BaseFunction {
36201
37249
  if (isError) return errorObject;
36202
37250
  } else {
36203
37251
  if (variant.isError()) return variant;
36204
- if (variant.isNull() || variant.isBoolean()) continue;
37252
+ if (variant.isNull()) continue;
37253
+ if (variant.isBoolean()) {
37254
+ values.push(variant.getValue() ? 1 : 0);
37255
+ continue;
37256
+ }
36205
37257
  if (variant.isString()) {
36206
37258
  const _variant = variant.convertToNumberObjectValue();
36207
37259
  if (_variant.isError()) return _variant;
@@ -36811,6 +37863,11 @@ var QuartileExc = class extends BaseFunction {
36811
37863
 
36812
37864
  //#endregion
36813
37865
  //#region src/functions/statistical/rank-avg/index.ts
37866
+ function isSameRankNumber$1(left, right) {
37867
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
37868
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
37869
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
37870
+ }
36814
37871
  var RankAvg = class extends BaseFunction {
36815
37872
  constructor(..._args) {
36816
37873
  super(..._args);
@@ -36842,14 +37899,9 @@ var RankAvg = class extends BaseFunction {
36842
37899
  return resultArray;
36843
37900
  }
36844
37901
  _getResult(numberValue, orderValue, refNumbers) {
36845
- const refOrderNumbers = refNumbers.sort((a, b) => !orderValue ? b - a : a - b);
36846
- let index = refOrderNumbers.indexOf(numberValue);
37902
+ const refOrderNumbers = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b);
36847
37903
  const results = [];
36848
- while (index >= 0) {
36849
- const start = index + 1;
36850
- results.push(start);
36851
- index = refOrderNumbers.indexOf(numberValue, start);
36852
- }
37904
+ for (let index = 0; index < refOrderNumbers.length; index++) if (isSameRankNumber$1(refOrderNumbers[index], numberValue)) results.push(index + 1);
36853
37905
  if (results.length === 0) return ErrorValueObject.create("#N/A");
36854
37906
  const result = results.reduce((acc, cur) => acc + cur, 0) / results.length;
36855
37907
  return NumberValueObject.create(result);
@@ -36858,12 +37910,12 @@ var RankAvg = class extends BaseFunction {
36858
37910
  let refHasError = false;
36859
37911
  let refErrorObject = ErrorValueObject.create("#N/A");
36860
37912
  const refNumbers = [];
36861
- if (!ref.isReferenceObject()) return {
37913
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
36862
37914
  refHasError: true,
36863
37915
  refErrorObject,
36864
37916
  refNumbers
36865
37917
  };
36866
- ref.toArrayValueObject().iterator((refObject) => {
37918
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
36867
37919
  const _refObject = refObject;
36868
37920
  if (_refObject.isError()) {
36869
37921
  refHasError = true;
@@ -36885,6 +37937,11 @@ var RankAvg = class extends BaseFunction {
36885
37937
 
36886
37938
  //#endregion
36887
37939
  //#region src/functions/statistical/rank-eq/index.ts
37940
+ function isSameRankNumber(left, right) {
37941
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
37942
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
37943
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
37944
+ }
36888
37945
  var RankEq = class extends BaseFunction {
36889
37946
  constructor(..._args) {
36890
37947
  super(..._args);
@@ -36910,7 +37967,7 @@ var RankEq = class extends BaseFunction {
36910
37967
  const numberValue = +numberObject.getValue();
36911
37968
  const orderValue = +orderObject.getValue();
36912
37969
  if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
36913
- const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).indexOf(numberValue);
37970
+ const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber(refNumber, numberValue));
36914
37971
  if (result === -1) return ErrorValueObject.create("#N/A");
36915
37972
  return NumberValueObject.create(result + 1);
36916
37973
  });
@@ -36921,12 +37978,12 @@ var RankEq = class extends BaseFunction {
36921
37978
  let refHasError = false;
36922
37979
  let refErrorObject = ErrorValueObject.create("#N/A");
36923
37980
  const refNumbers = [];
36924
- if (!ref.isReferenceObject()) return {
37981
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
36925
37982
  refHasError: true,
36926
37983
  refErrorObject,
36927
37984
  refNumbers
36928
37985
  };
36929
- ref.toArrayValueObject().iterator((refObject) => {
37986
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
36930
37987
  const _refObject = refObject;
36931
37988
  if (_refObject.isError()) {
36932
37989
  refHasError = true;
@@ -37998,11 +39055,10 @@ var Concat = class extends BaseFunction {
37998
39055
  isError = valueObject;
37999
39056
  return false;
38000
39057
  }
38001
- if (valueObject.isBoolean()) concatenatedString += `${valueObject.getValue()}`.toLocaleUpperCase();
38002
- else if (valueObject.isString() || valueObject.isNumber()) concatenatedString += valueObject.getValue();
39058
+ concatenatedString += formatValueForFormulaText(valueObject.getValue());
38003
39059
  });
38004
39060
  if (isError) return isError;
38005
- } else if (!textValue.isError() && !textValue.isNull()) concatenatedString += textValue.getValue();
39061
+ } else if (!textValue.isError() && !textValue.isNull()) concatenatedString += formatValueForFormulaText(textValue.getValue());
38006
39062
  return StringValueObject.create(concatenatedString);
38007
39063
  }
38008
39064
  };
@@ -38029,20 +39085,27 @@ var Concatenate = class extends BaseFunction {
38029
39085
  }
38030
39086
  });
38031
39087
  let result = null;
39088
+ const referenceSource = textValues.find((textValue) => {
39089
+ if (!textValue.isArray()) return false;
39090
+ const arrayValue = textValue;
39091
+ return arrayValue.getUnitId() !== "" && arrayValue.getSheetId() !== "" && arrayValue.getCurrentRow() >= 0 && arrayValue.getCurrentColumn() >= 0;
39092
+ });
38032
39093
  for (const textValue of textValues) result = expandArrayValueObject(maxRowLength, maxColumnLength, textValue, ErrorValueObject.create("#N/A")).mapValue((textValueObject, rowIndex, columnIndex) => {
38033
- var _resultValue, _textValue;
39094
+ var _resultValueObject$ge, _textValueObject$getV;
38034
39095
  const resultValueObject = result && result.get(rowIndex, columnIndex);
38035
39096
  if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isError()) return resultValueObject;
38036
39097
  if (textValueObject.isError()) return textValueObject;
38037
- let resultValue = resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.getValue();
38038
- let textValue = textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.getValue();
38039
- if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isBoolean()) resultValue = `${resultValue}`.toLocaleUpperCase();
38040
- if (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isBoolean()) textValue = `${textValue}`.toLocaleUpperCase();
38041
- const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : (_resultValue = resultValue) !== null && _resultValue !== void 0 ? _resultValue : "";
38042
- const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : (_textValue = textValue) !== null && _textValue !== void 0 ? _textValue : "";
39098
+ const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : formatValueForFormulaText((_resultValueObject$ge = resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.getValue()) !== null && _resultValueObject$ge !== void 0 ? _resultValueObject$ge : null);
39099
+ const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : formatValueForFormulaText((_textValueObject$getV = textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.getValue()) !== null && _textValueObject$getV !== void 0 ? _textValueObject$getV : null);
38043
39100
  return StringValueObject.create(`${resultValueObjectString}${textValueObjectString}`);
38044
39101
  });
38045
39102
  if (!result) return ErrorValueObject.create("#VALUE!");
39103
+ if (referenceSource && result.isArray()) {
39104
+ const resultArray = result;
39105
+ resultArray.setUnitId(referenceSource.getUnitId());
39106
+ resultArray.setSheetId(referenceSource.getSheetId());
39107
+ resultArray.setCurrent(referenceSource.getCurrentRow(), referenceSource.getCurrentColumn());
39108
+ }
38046
39109
  return result;
38047
39110
  }
38048
39111
  };
@@ -39809,13 +40872,17 @@ var Text = class extends BaseFunction {
39809
40872
  }
39810
40873
  if (formatTextValue.isNull()) formatTextValue = StringValueObject.create(" ");
39811
40874
  const formatTextValueString = `${formatTextValue.getValue()}`;
39812
- const previewText = getFormatPreview(formatTextValueString, textValueNumber);
40875
+ const previewText = getFormatPreview(normalizeExcelWeekdayFormat(formatTextValueString), textValueNumber);
39813
40876
  return StringValueObject.create(formatTextValueString === " " ? previewText.trimEnd() : previewText);
39814
40877
  });
39815
40878
  if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
39816
40879
  return resultArray;
39817
40880
  }
39818
40881
  };
40882
+ function normalizeExcelWeekdayFormat(formatText) {
40883
+ if (!formatText.includes("Å")) return formatText;
40884
+ return formatText.replace(/\u00C5{4,}/g, "dddd").replace(/\u00C5{1,3}/g, "ddd");
40885
+ }
39819
40886
 
39820
40887
  //#endregion
39821
40888
  //#region src/functions/text/textafter/index.ts
@@ -40190,9 +41257,19 @@ var Textsplit = class extends BaseFunction {
40190
41257
  const _ignoreEmpty = ignoreEmpty !== null && ignoreEmpty !== void 0 ? ignoreEmpty : NumberValueObject.create(0);
40191
41258
  const _matchMode = matchMode !== null && matchMode !== void 0 ? matchMode : NumberValueObject.create(0);
40192
41259
  const _padWith = padWith !== null && padWith !== void 0 ? padWith : StringValueObject.create("#N/A");
40193
- const { _variant: _colDelimiter, values: colDelimiterValue } = this._getStringValues(colDelimiter);
40194
41260
  const { _variant, values: rowDelimiterValue } = this._getStringValues(_rowDelimiter, false);
40195
41261
  _rowDelimiter = _variant;
41262
+ const allowBlankColDelimiter = rowDelimiter != null && !rowDelimiter.isNull() && !_rowDelimiter.isError() && rowDelimiterValue.length > 0;
41263
+ let _colDelimiter;
41264
+ let colDelimiterValue;
41265
+ if (allowBlankColDelimiter && this._isBlankScalarDelimiter(colDelimiter)) {
41266
+ _colDelimiter = colDelimiter;
41267
+ colDelimiterValue = [];
41268
+ } else {
41269
+ const { _variant: colDelimiterVariant, values } = this._getStringValues(colDelimiter);
41270
+ _colDelimiter = colDelimiterVariant;
41271
+ colDelimiterValue = values;
41272
+ }
40196
41273
  const maxRowLength = Math.max(text.isArray() ? text.getRowCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getRowCount() : 1, _matchMode.isArray() ? _matchMode.getRowCount() : 1);
40197
41274
  const maxColumnLength = Math.max(text.isArray() ? text.getColumnCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getColumnCount() : 1, _matchMode.isArray() ? _matchMode.getColumnCount() : 1);
40198
41275
  const textArray = expandArrayValueObject(maxRowLength, maxColumnLength, text, ErrorValueObject.create("#N/A"));
@@ -40270,7 +41347,7 @@ var Textsplit = class extends BaseFunction {
40270
41347
  const resultRows = textValue.split(rowDelimiterRegExp);
40271
41348
  let resultColsMaxCount = 1;
40272
41349
  let result = resultRows.map((row) => {
40273
- let cols = row.split(colDelimiterRegExp);
41350
+ let cols = colDelimiterValue.length > 0 ? row.split(colDelimiterRegExp) : [row];
40274
41351
  if (ignoreEmptyValue) cols = cols.filter((col) => col !== "");
40275
41352
  resultColsMaxCount = Math.max(resultColsMaxCount, cols.length);
40276
41353
  return cols;
@@ -40294,7 +41371,10 @@ var Textsplit = class extends BaseFunction {
40294
41371
  if (valueObject.isNull()) value = "\\s";
40295
41372
  if (valueObject.isBoolean()) value = value ? "TRUE" : "FALSE";
40296
41373
  value += "";
40297
- return (0, _univerjs_core.escapeRegExp)(value);
41374
+ return _univerjs_core.regexp.escapeRegExp(value);
41375
+ }
41376
+ _isBlankScalarDelimiter(valueObject) {
41377
+ return !valueObject.isArray() && (valueObject.isNull() || `${valueObject.getValue()}` === "");
40298
41378
  }
40299
41379
  };
40300
41380
 
@@ -40523,6 +41603,7 @@ const functionText = [
40523
41603
  [Numbervalue, "NUMBERVALUE"],
40524
41604
  [Regexextract, "REGEXEXTRACT"],
40525
41605
  [Regexmatch, "REGEXMATCH"],
41606
+ [Regexmatch, "REGEXTEST"],
40526
41607
  [Regexreplace, "REGEXREPLACE"],
40527
41608
  [Proper, "PROPER"],
40528
41609
  [Replace, "REPLACE"],
@@ -40590,6 +41671,58 @@ var Encodeurl = class extends BaseFunction {
40590
41671
  }
40591
41672
  };
40592
41673
 
41674
+ //#endregion
41675
+ //#region src/functions/web/filterxml/index.ts
41676
+ var Filterxml = class extends BaseFunction {
41677
+ constructor(..._args) {
41678
+ super(..._args);
41679
+ _defineProperty(this, "minParams", 2);
41680
+ _defineProperty(this, "maxParams", 2);
41681
+ }
41682
+ calculate(xml, xpath) {
41683
+ if (xml.isError()) return xml;
41684
+ if (xpath.isError()) return xpath;
41685
+ const tagName = getDescendantTagName(`${xpath.getValue()}`);
41686
+ if (tagName == null) return ErrorValueObject.create("#VALUE!");
41687
+ const values = extractTagTexts(`${xml.getValue()}`, tagName);
41688
+ if (values.length === 0) return ErrorValueObject.create("#VALUE!");
41689
+ return ArrayValueObject.create({
41690
+ calculateValueList: transformToValueObject(values.map((value) => [value])),
41691
+ rowCount: values.length,
41692
+ columnCount: 1,
41693
+ unitId: "",
41694
+ sheetId: "",
41695
+ row: 0,
41696
+ column: 0
41697
+ });
41698
+ }
41699
+ };
41700
+ function getDescendantTagName(xpath) {
41701
+ const text = xpath.trim();
41702
+ if (!text.startsWith("//")) return null;
41703
+ const tagName = text.slice(2).replace(/\/text\(\)$/, "").trim();
41704
+ return /^[A-Za-z0-9_.-]+$/.test(tagName) ? tagName : null;
41705
+ }
41706
+ function extractTagTexts(xml, tagName) {
41707
+ const open = `<${tagName}>`;
41708
+ const close = `</${tagName}>`;
41709
+ const values = [];
41710
+ let offset = 0;
41711
+ while (offset < xml.length) {
41712
+ const openIndex = xml.indexOf(open, offset);
41713
+ if (openIndex < 0) break;
41714
+ const valueStart = openIndex + open.length;
41715
+ const closeIndex = xml.indexOf(close, valueStart);
41716
+ if (closeIndex < 0) break;
41717
+ values.push(decodeXmlEntities(xml.slice(valueStart, closeIndex)));
41718
+ offset = closeIndex + close.length;
41719
+ }
41720
+ return values;
41721
+ }
41722
+ function decodeXmlEntities(value) {
41723
+ return value.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");
41724
+ }
41725
+
40593
41726
  //#endregion
40594
41727
  //#region src/functions/web/function-map.ts
40595
41728
  /**
@@ -40607,7 +41740,7 @@ var Encodeurl = class extends BaseFunction {
40607
41740
  * See the License for the specific language governing permissions and
40608
41741
  * limitations under the License.
40609
41742
  */
40610
- const functionWeb = [[Encodeurl, "ENCODEURL"]];
41743
+ const functionWeb = [[Encodeurl, "ENCODEURL"], [Filterxml, "FILTERXML"]];
40611
41744
 
40612
41745
  //#endregion
40613
41746
  //#region src/functions/index.ts
@@ -40677,7 +41810,7 @@ function getObjectValue(result, isUseStrip = false) {
40677
41810
  //#endregion
40678
41811
  //#region package.json
40679
41812
  var name = "@univerjs/engine-formula";
40680
- var version = "1.0.0-alpha.1";
41813
+ var version = "1.0.0-alpha.3";
40681
41814
 
40682
41815
  //#endregion
40683
41816
  //#region src/services/global-computing-status.service.ts
@@ -40968,36 +42101,151 @@ SetOtherFormulaController = __decorate([
40968
42101
  ], SetOtherFormulaController);
40969
42102
 
40970
42103
  //#endregion
40971
- //#region src/services/active-dirty-manager.service.ts
40972
- /**
40973
- * Actively mark as dirty, calculate the dirty area based on the command,
40974
- * and plugins can register the ref range they affect into the formula engine.
40975
- */
40976
- var ActiveDirtyManagerService = class extends _univerjs_core.Disposable {
40977
- constructor(..._args) {
40978
- super(..._args);
40979
- _defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
42104
+ //#region src/services/formula-calculation-trigger.service.ts
42105
+ const LOCAL_ONLY = { onlyLocal: true };
42106
+ const CALCULATION_DEBOUNCE_TIME = 100;
42107
+ let FormulaCalculationTriggerService = class FormulaCalculationTriggerService extends _univerjs_core.Disposable {
42108
+ constructor(_commandService, _activeDirtyManagerService) {
42109
+ super();
42110
+ this._commandService = _commandService;
42111
+ this._activeDirtyManagerService = _activeDirtyManagerService;
42112
+ _defineProperty(this, "_waitingCommandQueue", []);
42113
+ _defineProperty(this, "_executingDirtyData", createEmptyDirtyData());
42114
+ _defineProperty(this, "_timer", void 0);
42115
+ _defineProperty(this, "_executionInProgress", false);
42116
+ _defineProperty(this, "_restartCalculation", false);
42117
+ this._initialize();
40980
42118
  }
40981
42119
  dispose() {
40982
- this._dirtyConversionMap.clear();
42120
+ clearTimeout(this._timer);
42121
+ this._waitingCommandQueue = [];
42122
+ this._executingDirtyData = createEmptyDirtyData();
42123
+ super.dispose();
40983
42124
  }
40984
- remove(commandId) {
40985
- this._dirtyConversionMap.delete(commandId);
42125
+ _initialize() {
42126
+ this.disposeWithMe(this._commandService.onCommandExecuted((command, options) => {
42127
+ var _conversion$shouldTri;
42128
+ if (command.id === SetFormulaCalculationStartMutation.id) {
42129
+ this._executionInProgress = true;
42130
+ return;
42131
+ }
42132
+ if (command.id === SetFormulaCalculationNotificationMutation.id) {
42133
+ this._handleCalculationNotification(command.params);
42134
+ return;
42135
+ }
42136
+ const conversion = this._activeDirtyManagerService.get(command.id);
42137
+ if (!conversion) return;
42138
+ if (((_conversion$shouldTri = conversion.shouldTrigger) === null || _conversion$shouldTri === void 0 ? void 0 : _conversion$shouldTri.call(conversion, command, options)) === false) return;
42139
+ this._waitingCommandQueue.push(command);
42140
+ clearTimeout(this._timer);
42141
+ this._timer = setTimeout(() => this._flush(), CALCULATION_DEBOUNCE_TIME);
42142
+ }));
40986
42143
  }
40987
- get(commandId) {
40988
- return this._dirtyConversionMap.get(commandId);
42144
+ _flush() {
42145
+ const dirtyData = this._generateDirty(this._waitingCommandQueue);
42146
+ this._waitingCommandQueue = [];
42147
+ this._timer = void 0;
42148
+ if (!hasDirtyData(dirtyData)) return;
42149
+ this._executingDirtyData = mergeDirtyData(this._executingDirtyData, dirtyData);
42150
+ if (this._executionInProgress) {
42151
+ this._restartCalculation = true;
42152
+ this._commandService.executeCommand(SetFormulaCalculationStopMutation.id, {}, LOCAL_ONLY);
42153
+ return;
42154
+ }
42155
+ this._startCalculation();
40989
42156
  }
40990
- has(commandId) {
40991
- return this._dirtyConversionMap.has(commandId);
42157
+ _startCalculation() {
42158
+ this._executionInProgress = true;
42159
+ this._commandService.executeCommand(SetFormulaCalculationStartMutation.id, { ...this._executingDirtyData }, LOCAL_ONLY);
40992
42160
  }
40993
- register(commandId, dirtyConversion) {
40994
- this._dirtyConversionMap.set(commandId, dirtyConversion);
42161
+ _handleCalculationNotification(params) {
42162
+ if (params.stageInfo != null) {
42163
+ this._executionInProgress = true;
42164
+ return;
42165
+ }
42166
+ const state = params.functionsExecutedState;
42167
+ if (state == null) return;
42168
+ this._executionInProgress = false;
42169
+ if (state === 1 && this._restartCalculation) {
42170
+ this._restartCalculation = false;
42171
+ this._startCalculation();
42172
+ return;
42173
+ }
42174
+ this._restartCalculation = false;
42175
+ this._executingDirtyData = createEmptyDirtyData();
40995
42176
  }
40996
- getDirtyConversionMap() {
40997
- return this._dirtyConversionMap;
42177
+ _generateDirty(commands) {
42178
+ return commands.reduce((result, command) => {
42179
+ const conversion = this._activeDirtyManagerService.get(command.id);
42180
+ return conversion ? mergeDirtyData(result, conversion.getDirtyData(command)) : result;
42181
+ }, createEmptyDirtyData());
40998
42182
  }
40999
42183
  };
41000
- const IActiveDirtyManagerService = (0, _univerjs_core.createIdentifier)("univer.formula.active-dirty-manager.service");
42184
+ FormulaCalculationTriggerService = __decorate([__decorateParam(0, _univerjs_core.ICommandService), __decorateParam(1, IActiveDirtyManagerService)], FormulaCalculationTriggerService);
42185
+ function createEmptyDirtyData() {
42186
+ return {
42187
+ forceCalculation: false,
42188
+ dirtyRanges: [],
42189
+ dirtyNameMap: {},
42190
+ dirtyDefinedNameMap: {},
42191
+ dirtySuperTableMap: {},
42192
+ dirtyUnitFeatureMap: {},
42193
+ dirtyUnitOtherFormulaMap: {},
42194
+ clearDependencyTreeCache: {}
42195
+ };
42196
+ }
42197
+ function mergeDirtyData(left, right) {
42198
+ var _right$dirtyRanges, _left$dirtySuperTable;
42199
+ const dirtyRanges = [...left.dirtyRanges];
42200
+ mergeDirtyRanges(dirtyRanges, (_right$dirtyRanges = right.dirtyRanges) !== null && _right$dirtyRanges !== void 0 ? _right$dirtyRanges : []);
42201
+ return {
42202
+ dirtyRanges,
42203
+ dirtyNameMap: mergeDirtyUnitStringMap(left.dirtyNameMap, right.dirtyNameMap),
42204
+ dirtyDefinedNameMap: mergeDirtyUnitStringMap(left.dirtyDefinedNameMap, right.dirtyDefinedNameMap),
42205
+ dirtySuperTableMap: mergeDirtyUnitStringMap((_left$dirtySuperTable = left.dirtySuperTableMap) !== null && _left$dirtySuperTable !== void 0 ? _left$dirtySuperTable : {}, right.dirtySuperTableMap),
42206
+ dirtyUnitFeatureMap: mergeDirtyUnitNestedMap(left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap),
42207
+ dirtyUnitOtherFormulaMap: mergeDirtyUnitNestedMap(left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap),
42208
+ clearDependencyTreeCache: mergeDirtyUnitStringMap(left.clearDependencyTreeCache, right.clearDependencyTreeCache),
42209
+ forceCalculation: left.forceCalculation || Boolean(right.forceCalculation)
42210
+ };
42211
+ }
42212
+ function mergeDirtyRanges(target, source) {
42213
+ source.forEach((range) => {
42214
+ if (!target.some((item) => item.unitId === range.unitId && item.sheetId === range.sheetId && item.range.startRow === range.range.startRow && item.range.startColumn === range.range.startColumn && item.range.endRow === range.range.endRow && item.range.endColumn === range.range.endColumn)) target.push(range);
42215
+ });
42216
+ }
42217
+ function mergeDirtyUnitStringMap(left, right) {
42218
+ const result = { ...left };
42219
+ Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, values]) => {
42220
+ result[unitId] = {
42221
+ ...result[unitId],
42222
+ ...values
42223
+ };
42224
+ });
42225
+ return result;
42226
+ }
42227
+ function mergeDirtyUnitNestedMap(left, right) {
42228
+ const result = { ...left };
42229
+ Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, sheets]) => {
42230
+ const unitResult = { ...result[unitId] };
42231
+ Object.entries(sheets !== null && sheets !== void 0 ? sheets : {}).forEach(([sheetId, values]) => {
42232
+ unitResult[sheetId] = {
42233
+ ...unitResult[sheetId],
42234
+ ...values
42235
+ };
42236
+ });
42237
+ result[unitId] = unitResult;
42238
+ });
42239
+ return result;
42240
+ }
42241
+ function hasDirtyData(dirtyData) {
42242
+ return dirtyData.forceCalculation || dirtyData.dirtyRanges.length > 0 || hasNestedValue(dirtyData.dirtyNameMap) || hasNestedValue(dirtyData.dirtyDefinedNameMap) || hasNestedValue(dirtyData.dirtySuperTableMap) || hasNestedValue(dirtyData.dirtyUnitFeatureMap) || hasNestedValue(dirtyData.dirtyUnitOtherFormulaMap) || hasNestedValue(dirtyData.clearDependencyTreeCache);
42243
+ }
42244
+ function hasNestedValue(value) {
42245
+ if (value == null) return false;
42246
+ if (typeof value !== "object") return true;
42247
+ return Object.values(value).some(hasNestedValue);
42248
+ }
41001
42249
 
41002
42250
  //#endregion
41003
42251
  //#region src/services/formula-common.ts
@@ -41199,7 +42447,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends _univerj
41199
42447
  }
41200
42448
  onReady() {
41201
42449
  var _this$_config;
41202
- (0, _univerjs_core.touchDependencies)(this._injector, [[FormulaController]]);
42450
+ (0, _univerjs_core.touchDependencies)(this._injector, [[FormulaController], [SuperTableActiveDirtyController]]);
41203
42451
  if (!((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.notExecuteFormula)) (0, _univerjs_core.touchDependencies)(this._injector, [
41204
42452
  [SetOtherFormulaController],
41205
42453
  [SetFeatureCalculationController],
@@ -41217,6 +42465,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends _univerj
41217
42465
  [IFunctionService, { useClass: FunctionService }],
41218
42466
  [IDefinedNamesService, { useClass: DefinedNamesService }],
41219
42467
  [IActiveDirtyManagerService, { useClass: ActiveDirtyManagerService }],
42468
+ [FormulaCalculationTriggerService],
41220
42469
  [RegisterOtherFormulaService],
41221
42470
  [IHyperlinkEngineFormulaService, { useClass: HyperlinkEngineFormulaService }],
41222
42471
  [ISheetRowFilteredService, { useClass: SheetRowFilteredService }],
@@ -41224,6 +42473,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends _univerj
41224
42473
  [GlobalComputingStatusService],
41225
42474
  [FormulaDataModel],
41226
42475
  [FormulaController],
42476
+ [SuperTableActiveDirtyController],
41227
42477
  [ComputingStatusReporterController]
41228
42478
  ];
41229
42479
  if (shouldPerformComputing) dependencies.push([IOtherFormulaManagerService, { useClass: OtherFormulaManagerService }], [IFormulaRuntimeService, { useClass: FormulaRuntimeService }], [IFormulaCurrentConfigService, { useClass: FormulaCurrentConfigService }], [IFeatureCalculationManagerService, { useClass: FeatureCalculationManagerService }], [CalculateController], [SetOtherFormulaController], [SetDependencyController], [SetFeatureCalculationController], [Interpreter], [AstTreeBuilder], [Lexer], [AstRootNodeFactory], [FunctionNodeFactory], [LambdaNodeFactory], [LambdaParameterNodeFactory], [OperatorNodeFactory], [PrefixNodeFactory], [ReferenceNodeFactory], [SuffixNodeFactory], [UnionNodeFactory], [ValueNodeFactory]);
@@ -41316,6 +42566,12 @@ exports.FUNCTION_NAMES_TEXT = FUNCTION_NAMES_TEXT;
41316
42566
  exports.FUNCTION_NAMES_UNIVER = FUNCTION_NAMES_UNIVER;
41317
42567
  exports.FUNCTION_NAMES_WEB = FUNCTION_NAMES_WEB;
41318
42568
  exports.FeatureCalculationManagerService = FeatureCalculationManagerService;
42569
+ Object.defineProperty(exports, 'FormulaCalculationTriggerService', {
42570
+ enumerable: true,
42571
+ get: function () {
42572
+ return FormulaCalculationTriggerService;
42573
+ }
42574
+ });
41319
42575
  Object.defineProperty(exports, 'FormulaCurrentConfigService', {
41320
42576
  enumerable: true,
41321
42577
  get: function () {
@@ -41467,6 +42723,12 @@ Object.defineProperty(exports, 'SuffixNodeFactory', {
41467
42723
  return SuffixNodeFactory;
41468
42724
  }
41469
42725
  });
42726
+ Object.defineProperty(exports, 'SuperTableActiveDirtyController', {
42727
+ enumerable: true,
42728
+ get: function () {
42729
+ return SuperTableActiveDirtyController;
42730
+ }
42731
+ });
41470
42732
  exports.SuperTableService = SuperTableService;
41471
42733
  Object.defineProperty(exports, 'UnionNodeFactory', {
41472
42734
  enumerable: true,