diff --git a/packages/engine-formula/src/functions/math/subtotal/__tests__/index.spec.ts b/packages/engine-formula/src/functions/math/subtotal/__tests__/index.spec.ts index bdec5030b8..9a1282737d 100644 --- a/packages/engine-formula/src/functions/math/subtotal/__tests__/index.spec.ts +++ b/packages/engine-formula/src/functions/math/subtotal/__tests__/index.spec.ts @@ -275,12 +275,16 @@ describe('Test subtotal', () => { expect(result).toBe(11.157); }); it('Count, Var1 is array, var2 is array', async () => { - const result = await calculate('=SUBTOTAL(2,A1:B2,A3:F4)'); + let result = await calculate('=SUBTOTAL(2,A1:B2,A3:F4)'); expect(result).toBe(10); + result = await calculate('=SUBTOTAL(2,B1:C1)'); + expect(result).toBe(1); }); it('Counta, Var1 is array, var2 is array', async () => { - const result = await calculate('=SUBTOTAL(3,A1:B2,A3:F4)'); + let result = await calculate('=SUBTOTAL(3,A1:B2,A3:F4)'); expect(result).toBe(14); + result = await calculate('=SUBTOTAL(3,B1:C1)'); + expect(result).toBe(2); }); it('Max, Var1 is array, var2 is array', async () => { const result = await calculate('=SUBTOTAL(4,A1:B2,A3:F4)'); diff --git a/packages/engine-formula/src/functions/math/subtotal/index.ts b/packages/engine-formula/src/functions/math/subtotal/index.ts index 71976195fd..44ed0daf36 100644 --- a/packages/engine-formula/src/functions/math/subtotal/index.ts +++ b/packages/engine-formula/src/functions/math/subtotal/index.ts @@ -84,6 +84,7 @@ export class Subtotal extends BaseFunction { return this._handleSingleObject(functionNum as BaseValueObject, ...refs); } + // eslint-disable-next-line max-lines-per-function, complexity private _handleSingleObject(functionNum: Nullable, ...refs: FunctionVariantType[]) { const indexNum = this._getIndexNumValue(functionNum); let result; @@ -195,13 +196,28 @@ export class Subtotal extends BaseFunction { } private _count(ignoreHidden: boolean, ...refs: FunctionVariantType[]) { - const flattenArray = this._flattenRefArray(ignoreHidden, ...refs); + let accumulatorAll: BaseValueObject = NumberValueObject.create(0); + for (let i = 0; i < refs.length; i++) { + const variant = refs[i]; - if (flattenArray.isError()) { - return flattenArray; + if (!variant.isReferenceObject()) { + return ErrorValueObject.create(ErrorType.VALUE); + } + + const rowData = (variant as BaseReferenceObject).getRowData(); + + (variant as BaseReferenceObject).iterator((valueObject, rowIndex) => { + if (ignoreHidden && this._isRowHidden(rowData, rowIndex)) { + return true; + } + + if (valueObject?.isNumber()) { + accumulatorAll = accumulatorAll.plusBy(1); + } + }); } - return flattenArray.count(); + return accumulatorAll; } private _counta(ignoreHidden: boolean, ...refs: FunctionVariantType[]) { diff --git a/packages/umd/scripts/index.mjs b/packages/umd/scripts/index.mjs index 0027660ead..20b4d58cc3 100644 --- a/packages/umd/scripts/index.mjs +++ b/packages/umd/scripts/index.mjs @@ -167,6 +167,7 @@ function buildJS() { const libs = [ '@univerjs/protocol', '@univerjs/core', + '@univerjs/rpc', '@univerjs/design', '@univerjs/engine-render', '@univerjs/engine-numfmt', @@ -200,7 +201,6 @@ function buildJS() { '@univerjs/docs-drawing-ui', '@univerjs/slides', '@univerjs/slides-ui', - '@univerjs/rpc', '@univerjs/network', '@univerjs/facade', '@univerjs/uniscript',