diff --git a/packages/engine-formula/src/engine/utils/value-object.ts b/packages/engine-formula/src/engine/utils/value-object.ts index 5d9b018320..0610cb43fa 100644 --- a/packages/engine-formula/src/engine/utils/value-object.ts +++ b/packages/engine-formula/src/engine/utils/value-object.ts @@ -129,3 +129,28 @@ export function objectValueToCellValue(objectValue: Nullable): }; } } + +/** + * The size of the extended range is determined by the maximum width and height of the criteria range. + * @param variants + * @returns + */ +export function calculateMaxDimensions(variants: BaseValueObject[]) { + let maxRowLength = 0; + let maxColumnLength = 0; + + variants.forEach((variant, i) => { + if (i % 2 === 1) { + if (variant.isArray()) { + const arrayValue = variant as ArrayValueObject; + maxRowLength = Math.max(maxRowLength, arrayValue.getRowCount()); + maxColumnLength = Math.max(maxColumnLength, arrayValue.getColumnCount()); + } else { + maxRowLength = Math.max(maxRowLength, 1); + maxColumnLength = Math.max(maxColumnLength, 1); + } + } + }); + + return { maxRowLength, maxColumnLength }; +} diff --git a/packages/engine-formula/src/functions/math/sumifs/index.ts b/packages/engine-formula/src/functions/math/sumifs/index.ts index cc17a5c0f0..eeec1e1cf3 100644 --- a/packages/engine-formula/src/functions/math/sumifs/index.ts +++ b/packages/engine-formula/src/functions/math/sumifs/index.ts @@ -17,6 +17,7 @@ import { ErrorType } from '../../../basics/error-type'; import { expandArrayValueObject } from '../../../engine/utils/array-object'; import { booleanObjectIntersection, valueObjectCompare } from '../../../engine/utils/object-compare'; +import { calculateMaxDimensions } from '../../../engine/utils/value-object'; import { ArrayValueObject } from '../../../engine/value-object/array-value-object'; import type { BaseValueObject, IArrayValueObject } from '../../../engine/value-object/base-value-object'; import { ErrorValueObject } from '../../../engine/value-object/base-value-object'; @@ -46,24 +47,10 @@ export class Sumifs extends BaseFunction { return ErrorValueObject.create(ErrorType.VALUE); } + const { maxRowLength, maxColumnLength } = calculateMaxDimensions(variants); + const sumRowLength = (sumRange as ArrayValueObject).getRowCount(); const sumColumnLength = (sumRange as ArrayValueObject).getColumnCount(); - // The size of the extended range is determined by the maximum width and height of the criteria range. - let maxRowLength = 0; - let maxColumnLength = 0; - - variants.forEach((variant, i) => { - if (i % 2 === 1) { - if (variant.isArray()) { - const arrayValue = variant as ArrayValueObject; - maxRowLength = Math.max(maxRowLength, arrayValue.getRowCount()); - maxColumnLength = Math.max(maxColumnLength, arrayValue.getColumnCount()); - } else { - maxRowLength = Math.max(maxRowLength, 1); - maxColumnLength = Math.max(maxColumnLength, 1); - } - } - }); const booleanResults: BaseValueObject[][] = []; diff --git a/packages/engine-formula/src/functions/statistical/maxifs/index.ts b/packages/engine-formula/src/functions/statistical/maxifs/index.ts index 13e829d14c..4d22ee8e30 100644 --- a/packages/engine-formula/src/functions/statistical/maxifs/index.ts +++ b/packages/engine-formula/src/functions/statistical/maxifs/index.ts @@ -17,6 +17,7 @@ import { ErrorType } from '../../../basics/error-type'; import { expandArrayValueObject } from '../../../engine/utils/array-object'; import { booleanObjectIntersection, valueObjectCompare } from '../../../engine/utils/object-compare'; +import { calculateMaxDimensions } from '../../../engine/utils/value-object'; import { ArrayValueObject } from '../../../engine/value-object/array-value-object'; import type { BaseValueObject, IArrayValueObject } from '../../../engine/value-object/base-value-object'; import { ErrorValueObject } from '../../../engine/value-object/base-value-object'; @@ -46,24 +47,10 @@ export class Maxifs extends BaseFunction { return ErrorValueObject.create(ErrorType.VALUE); } + const { maxRowLength, maxColumnLength } = calculateMaxDimensions(variants); + const sumRowLength = (maxRange as ArrayValueObject).getRowCount(); const sumColumnLength = (maxRange as ArrayValueObject).getColumnCount(); - // The size of the extended range is determined by the maximum width and height of the criteria range. - let maxRowLength = 0; - let maxColumnLength = 0; - - variants.forEach((variant, i) => { - if (i % 2 === 1) { - if (variant.isArray()) { - const arrayValue = variant as ArrayValueObject; - maxRowLength = Math.max(maxRowLength, arrayValue.getRowCount()); - maxColumnLength = Math.max(maxColumnLength, arrayValue.getColumnCount()); - } else { - maxRowLength = Math.max(maxRowLength, 1); - maxColumnLength = Math.max(maxColumnLength, 1); - } - } - }); const booleanResults: BaseValueObject[][] = []; @@ -128,3 +115,4 @@ export class Maxifs extends BaseFunction { return ArrayValueObject.create(arrayValueObjectData); } } + diff --git a/packages/engine-formula/src/functions/statistical/minifs/index.ts b/packages/engine-formula/src/functions/statistical/minifs/index.ts index 1e850bb596..d8ae37bb12 100644 --- a/packages/engine-formula/src/functions/statistical/minifs/index.ts +++ b/packages/engine-formula/src/functions/statistical/minifs/index.ts @@ -17,6 +17,7 @@ import { ErrorType } from '../../../basics/error-type'; import { expandArrayValueObject } from '../../../engine/utils/array-object'; import { booleanObjectIntersection, valueObjectCompare } from '../../../engine/utils/object-compare'; +import { calculateMaxDimensions } from '../../../engine/utils/value-object'; import { ArrayValueObject } from '../../../engine/value-object/array-value-object'; import type { BaseValueObject, IArrayValueObject } from '../../../engine/value-object/base-value-object'; import { ErrorValueObject } from '../../../engine/value-object/base-value-object'; @@ -46,24 +47,10 @@ export class Minifs extends BaseFunction { return ErrorValueObject.create(ErrorType.VALUE); } - const sumRowLength = (minRange as ArrayValueObject).getRowCount(); - const sumColumnLength = (minRange as ArrayValueObject).getColumnCount(); - // The size of the extended range is determined by the maximum width and height of the criteria range. - let maxRowLength = 0; - let maxColumnLength = 0; - - variants.forEach((variant, i) => { - if (i % 2 === 1) { - if (variant.isArray()) { - const arrayValue = variant as ArrayValueObject; - maxRowLength = Math.max(maxRowLength, arrayValue.getRowCount()); - maxColumnLength = Math.max(maxColumnLength, arrayValue.getColumnCount()); - } else { - maxRowLength = Math.max(maxRowLength, 1); - maxColumnLength = Math.max(maxColumnLength, 1); - } - } - }); + const { maxRowLength, maxColumnLength } = calculateMaxDimensions(variants); + + const minRowLength = (minRange as ArrayValueObject).getRowCount(); + const minColumnLength = (minRange as ArrayValueObject).getColumnCount(); const booleanResults: BaseValueObject[][] = []; @@ -74,7 +61,7 @@ export class Minifs extends BaseFunction { const rangeRowLength = range.getRowCount(); const rangeColumnLength = range.getColumnCount(); - if (rangeRowLength !== sumRowLength || rangeColumnLength !== sumColumnLength) { + if (rangeRowLength !== minRowLength || rangeColumnLength !== minColumnLength) { return expandArrayValueObject(maxRowLength, maxColumnLength, ErrorValueObject.create(ErrorType.NA)); }