@cj-tech-master/excelts 9.2.1 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -2
- package/README_zh.md +29 -6
- package/dist/browser/index.browser.d.ts +1 -1
- package/dist/browser/index.browser.js +4 -0
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/index.js +4 -0
- package/dist/browser/modules/excel/cell.d.ts +17 -3
- package/dist/browser/modules/excel/cell.js +170 -22
- package/dist/browser/modules/excel/defined-names.d.ts +96 -1
- package/dist/browser/modules/excel/defined-names.js +411 -21
- package/dist/browser/modules/excel/image.d.ts +11 -0
- package/dist/browser/modules/excel/image.js +24 -1
- package/dist/browser/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +14 -0
- package/dist/browser/modules/excel/stream/workbook-reader.d.ts +2 -1
- package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +48 -1
- package/dist/browser/modules/excel/stream/workbook-writer.d.ts +3 -2
- package/dist/browser/modules/excel/stream/worksheet-reader.js +17 -1
- package/dist/browser/modules/excel/stream/worksheet-writer.d.ts +39 -6
- package/dist/browser/modules/excel/stream/worksheet-writer.js +45 -5
- package/dist/browser/modules/excel/table.js +15 -2
- package/dist/browser/modules/excel/types.d.ts +133 -2
- package/dist/browser/modules/excel/utils/col-cache.d.ts +1 -0
- package/dist/browser/modules/excel/utils/col-cache.js +15 -0
- package/dist/browser/modules/excel/utils/drawing-utils.d.ts +3 -3
- package/dist/browser/modules/excel/utils/drawing-utils.js +4 -0
- package/dist/browser/modules/excel/utils/external-link-formula.d.ts +76 -0
- package/dist/browser/modules/excel/utils/external-link-formula.js +208 -0
- package/dist/browser/modules/excel/utils/iterate-stream.d.ts +9 -3
- package/dist/browser/modules/excel/utils/iterate-stream.js +3 -1
- package/dist/browser/modules/excel/utils/ooxml-paths.d.ts +19 -0
- package/dist/browser/modules/excel/utils/ooxml-paths.js +37 -2
- package/dist/browser/modules/excel/utils/shared-strings.d.ts +8 -3
- package/dist/browser/modules/excel/utils/shared-strings.js +21 -2
- package/dist/browser/modules/excel/utils/workbook-protection.d.ts +30 -0
- package/dist/browser/modules/excel/utils/workbook-protection.js +30 -0
- package/dist/browser/modules/excel/workbook.browser.d.ts +257 -6
- package/dist/browser/modules/excel/workbook.browser.js +318 -34
- package/dist/browser/modules/excel/workbook.d.ts +1 -1
- package/dist/browser/modules/excel/worksheet.d.ts +3 -1
- package/dist/browser/modules/excel/worksheet.js +21 -2
- package/dist/browser/modules/excel/xlsx/rel-type.d.ts +15 -0
- package/dist/browser/modules/excel/xlsx/rel-type.js +16 -1
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
- package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
- package/dist/browser/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
- package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
- package/dist/browser/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
- package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
- package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
- package/dist/browser/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
- package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
- package/dist/browser/modules/excel/xlsx/xform/style/border-xform.js +4 -1
- package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +410 -20
- package/dist/browser/modules/excel/xlsx/xlsx.d.ts +7 -4
- package/dist/browser/modules/excel/xlsx/xlsx.js +4 -5
- package/dist/browser/modules/formula/compile/address-utils.d.ts +62 -0
- package/dist/browser/modules/formula/compile/address-utils.js +83 -0
- package/dist/browser/modules/formula/compile/binder.d.ts +42 -0
- package/dist/browser/modules/formula/compile/binder.js +487 -0
- package/dist/browser/modules/formula/compile/bound-ast.d.ts +230 -0
- package/dist/browser/modules/formula/compile/bound-ast.js +80 -0
- package/dist/browser/modules/formula/compile/compiled-formula.d.ts +137 -0
- package/dist/browser/modules/formula/compile/compiled-formula.js +383 -0
- package/dist/browser/modules/formula/compile/dependency-analysis.d.ts +93 -0
- package/dist/browser/modules/formula/compile/dependency-analysis.js +432 -0
- package/dist/browser/modules/formula/compile/structured-ref-utils.d.ts +93 -0
- package/dist/browser/modules/formula/compile/structured-ref-utils.js +136 -0
- package/dist/browser/modules/formula/default-syntax-probe.d.ts +79 -0
- package/dist/browser/modules/formula/default-syntax-probe.js +83 -0
- package/dist/browser/modules/formula/functions/_date-context.d.ts +4 -0
- package/dist/browser/modules/formula/functions/_date-context.js +29 -0
- package/dist/browser/modules/formula/functions/_shared.d.ts +121 -0
- package/dist/browser/modules/formula/functions/_shared.js +381 -0
- package/dist/browser/modules/formula/functions/conditional.d.ts +27 -0
- package/dist/browser/modules/formula/functions/conditional.js +343 -0
- package/dist/browser/modules/formula/functions/database.d.ts +37 -0
- package/dist/browser/modules/formula/functions/database.js +274 -0
- package/dist/browser/modules/formula/functions/date.d.ts +61 -0
- package/dist/browser/modules/formula/functions/date.js +855 -0
- package/dist/browser/modules/formula/functions/dynamic-array.d.ts +23 -0
- package/dist/browser/modules/formula/functions/dynamic-array.js +860 -0
- package/dist/browser/modules/formula/functions/engineering.d.ts +57 -0
- package/dist/browser/modules/formula/functions/engineering.js +1128 -0
- package/dist/browser/modules/formula/functions/financial.d.ts +202 -0
- package/dist/browser/modules/formula/functions/financial.js +2296 -0
- package/dist/browser/modules/formula/functions/lookup.d.ts +18 -0
- package/dist/browser/modules/formula/functions/lookup.js +886 -0
- package/dist/browser/modules/formula/functions/math.d.ts +114 -0
- package/dist/browser/modules/formula/functions/math.js +1406 -0
- package/dist/browser/modules/formula/functions/statistical.d.ts +193 -0
- package/dist/browser/modules/formula/functions/statistical.js +3390 -0
- package/dist/browser/modules/formula/functions/text.d.ts +86 -0
- package/dist/browser/modules/formula/functions/text.js +1845 -0
- package/dist/browser/modules/formula/host-registry.d.ts +53 -0
- package/dist/browser/modules/formula/host-registry.js +69 -0
- package/dist/browser/modules/formula/index.d.ts +39 -0
- package/dist/browser/modules/formula/index.js +49 -0
- package/dist/browser/modules/formula/install.d.ts +62 -0
- package/dist/browser/modules/formula/install.js +88 -0
- package/dist/browser/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
- package/dist/browser/modules/formula/integration/apply-writeback-plan.js +210 -0
- package/dist/browser/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
- package/dist/browser/modules/formula/integration/calculate-formulas-impl.js +616 -0
- package/dist/browser/modules/formula/integration/calculate-formulas.d.ts +67 -0
- package/dist/browser/modules/formula/integration/calculate-formulas.js +68 -0
- package/dist/browser/modules/formula/integration/formula-instance.d.ts +64 -0
- package/dist/browser/modules/formula/integration/formula-instance.js +79 -0
- package/dist/browser/modules/formula/integration/workbook-adapter.d.ts +26 -0
- package/dist/browser/modules/formula/integration/workbook-adapter.js +324 -0
- package/dist/browser/modules/formula/integration/workbook-snapshot.d.ts +267 -0
- package/dist/browser/modules/formula/integration/workbook-snapshot.js +77 -0
- package/dist/browser/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
- package/dist/browser/modules/formula/materialize/build-writeback-plan.js +473 -0
- package/dist/browser/modules/formula/materialize/spill-engine.d.ts +9 -0
- package/dist/browser/modules/formula/materialize/spill-engine.js +38 -0
- package/dist/browser/modules/formula/materialize/types.d.ts +179 -0
- package/dist/browser/modules/formula/materialize/types.js +29 -0
- package/dist/browser/modules/formula/materialize/writeback-plan.d.ts +167 -0
- package/dist/browser/modules/formula/materialize/writeback-plan.js +27 -0
- package/dist/browser/modules/formula/runtime/evaluator.d.ts +151 -0
- package/dist/browser/modules/formula/runtime/evaluator.js +2291 -0
- package/dist/browser/modules/formula/runtime/function-registry.d.ts +47 -0
- package/dist/browser/modules/formula/runtime/function-registry.js +840 -0
- package/dist/browser/modules/formula/runtime/values.d.ts +211 -0
- package/dist/browser/modules/formula/runtime/values.js +385 -0
- package/dist/browser/modules/formula/syntax/ast.d.ts +129 -0
- package/dist/browser/modules/formula/syntax/ast.js +28 -0
- package/dist/browser/modules/formula/syntax/parser.d.ts +18 -0
- package/dist/browser/modules/formula/syntax/parser.js +439 -0
- package/dist/browser/modules/formula/syntax/token-types.d.ts +153 -0
- package/dist/browser/modules/formula/syntax/token-types.js +59 -0
- package/dist/browser/modules/formula/syntax/tokenizer.d.ts +10 -0
- package/dist/browser/modules/formula/syntax/tokenizer.js +1074 -0
- package/dist/browser/modules/pdf/excel-bridge.js +9 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/modules/excel/cell.js +170 -22
- package/dist/cjs/modules/excel/defined-names.js +411 -21
- package/dist/cjs/modules/excel/image.js +24 -1
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +14 -0
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +48 -1
- package/dist/cjs/modules/excel/stream/worksheet-reader.js +17 -1
- package/dist/cjs/modules/excel/stream/worksheet-writer.js +45 -5
- package/dist/cjs/modules/excel/table.js +15 -2
- package/dist/cjs/modules/excel/utils/col-cache.js +15 -0
- package/dist/cjs/modules/excel/utils/drawing-utils.js +4 -0
- package/dist/cjs/modules/excel/utils/external-link-formula.js +212 -0
- package/dist/cjs/modules/excel/utils/iterate-stream.js +3 -1
- package/dist/cjs/modules/excel/utils/ooxml-paths.js +42 -2
- package/dist/cjs/modules/excel/utils/shared-strings.js +21 -2
- package/dist/cjs/modules/excel/utils/workbook-protection.js +33 -0
- package/dist/cjs/modules/excel/workbook.browser.js +318 -34
- package/dist/cjs/modules/excel/worksheet.js +20 -1
- package/dist/cjs/modules/excel/xlsx/rel-type.js +16 -1
- package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
- package/dist/cjs/modules/excel/xlsx/xform/book/external-link-xform.js +333 -0
- package/dist/cjs/modules/excel/xlsx/xform/book/external-reference-xform.js +27 -0
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-protection-xform.js +69 -0
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
- package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +18 -0
- package/dist/cjs/modules/excel/xlsx/xform/core/metadata-xform.js +161 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +108 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
- package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +83 -0
- package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
- package/dist/cjs/modules/excel/xlsx/xform/style/border-xform.js +4 -1
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +408 -18
- package/dist/cjs/modules/excel/xlsx/xlsx.js +4 -5
- package/dist/cjs/modules/formula/compile/address-utils.js +89 -0
- package/dist/cjs/modules/formula/compile/binder.js +489 -0
- package/dist/cjs/modules/formula/compile/bound-ast.js +68 -0
- package/dist/cjs/modules/formula/compile/compiled-formula.js +387 -0
- package/dist/cjs/modules/formula/compile/dependency-analysis.js +437 -0
- package/dist/cjs/modules/formula/compile/structured-ref-utils.js +141 -0
- package/dist/cjs/modules/formula/default-syntax-probe.js +87 -0
- package/dist/cjs/modules/formula/functions/_date-context.js +33 -0
- package/dist/cjs/modules/formula/functions/_shared.js +396 -0
- package/dist/cjs/modules/formula/functions/conditional.js +354 -0
- package/dist/cjs/modules/formula/functions/database.js +288 -0
- package/dist/cjs/modules/formula/functions/date.js +883 -0
- package/dist/cjs/modules/formula/functions/dynamic-array.js +881 -0
- package/dist/cjs/modules/formula/functions/engineering.js +1183 -0
- package/dist/cjs/modules/formula/functions/financial.js +2348 -0
- package/dist/cjs/modules/formula/functions/lookup.js +902 -0
- package/dist/cjs/modules/formula/functions/math.js +1487 -0
- package/dist/cjs/modules/formula/functions/statistical.js +3488 -0
- package/dist/cjs/modules/formula/functions/text.js +1889 -0
- package/dist/cjs/modules/formula/host-registry.js +75 -0
- package/dist/cjs/modules/formula/index.js +58 -0
- package/dist/cjs/modules/formula/install.js +93 -0
- package/dist/cjs/modules/formula/integration/apply-writeback-plan.js +213 -0
- package/dist/cjs/modules/formula/integration/calculate-formulas-impl.js +619 -0
- package/dist/cjs/modules/formula/integration/calculate-formulas.js +71 -0
- package/dist/cjs/modules/formula/integration/formula-instance.js +82 -0
- package/dist/cjs/modules/formula/integration/workbook-adapter.js +327 -0
- package/dist/cjs/modules/formula/integration/workbook-snapshot.js +84 -0
- package/dist/cjs/modules/formula/materialize/build-writeback-plan.js +475 -0
- package/dist/cjs/modules/formula/materialize/spill-engine.js +42 -0
- package/dist/cjs/modules/formula/materialize/types.js +32 -0
- package/dist/cjs/modules/formula/materialize/writeback-plan.js +28 -0
- package/dist/cjs/modules/formula/runtime/evaluator.js +2298 -0
- package/dist/cjs/modules/formula/runtime/function-registry.js +846 -0
- package/dist/cjs/modules/formula/runtime/values.js +385 -0
- package/dist/cjs/modules/formula/syntax/ast.js +8 -0
- package/dist/cjs/modules/formula/syntax/parser.js +440 -0
- package/dist/cjs/modules/formula/syntax/token-types.js +32 -0
- package/dist/cjs/modules/formula/syntax/tokenizer.js +1076 -0
- package/dist/cjs/modules/pdf/excel-bridge.js +9 -0
- package/dist/esm/index.browser.js +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/modules/excel/cell.js +170 -22
- package/dist/esm/modules/excel/defined-names.js +411 -21
- package/dist/esm/modules/excel/image.js +24 -1
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +14 -0
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +48 -1
- package/dist/esm/modules/excel/stream/worksheet-reader.js +17 -1
- package/dist/esm/modules/excel/stream/worksheet-writer.js +45 -5
- package/dist/esm/modules/excel/table.js +15 -2
- package/dist/esm/modules/excel/utils/col-cache.js +15 -0
- package/dist/esm/modules/excel/utils/drawing-utils.js +4 -0
- package/dist/esm/modules/excel/utils/external-link-formula.js +208 -0
- package/dist/esm/modules/excel/utils/iterate-stream.js +3 -1
- package/dist/esm/modules/excel/utils/ooxml-paths.js +37 -2
- package/dist/esm/modules/excel/utils/shared-strings.js +21 -2
- package/dist/esm/modules/excel/utils/workbook-protection.js +30 -0
- package/dist/esm/modules/excel/workbook.browser.js +318 -34
- package/dist/esm/modules/excel/worksheet.js +21 -2
- package/dist/esm/modules/excel/xlsx/rel-type.js +16 -1
- package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +21 -86
- package/dist/esm/modules/excel/xlsx/xform/book/external-link-xform.js +330 -0
- package/dist/esm/modules/excel/xlsx/xform/book/external-reference-xform.js +24 -0
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.js +11 -2
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-protection-xform.js +66 -0
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +38 -5
- package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +19 -1
- package/dist/esm/modules/excel/xlsx/xform/core/metadata-xform.js +158 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.js +105 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +3 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/drawing-xform.js +10 -2
- package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +166 -8
- package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/ignored-errors-xform.js +80 -0
- package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +9 -4
- package/dist/esm/modules/excel/xlsx/xform/style/border-xform.js +4 -1
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +410 -20
- package/dist/esm/modules/excel/xlsx/xlsx.js +4 -5
- package/dist/esm/modules/formula/compile/address-utils.js +83 -0
- package/dist/esm/modules/formula/compile/binder.js +487 -0
- package/dist/esm/modules/formula/compile/bound-ast.js +80 -0
- package/dist/esm/modules/formula/compile/compiled-formula.js +383 -0
- package/dist/esm/modules/formula/compile/dependency-analysis.js +432 -0
- package/dist/esm/modules/formula/compile/structured-ref-utils.js +136 -0
- package/dist/esm/modules/formula/default-syntax-probe.js +83 -0
- package/dist/esm/modules/formula/functions/_date-context.js +29 -0
- package/dist/esm/modules/formula/functions/_shared.js +381 -0
- package/dist/esm/modules/formula/functions/conditional.js +343 -0
- package/dist/esm/modules/formula/functions/database.js +274 -0
- package/dist/esm/modules/formula/functions/date.js +855 -0
- package/dist/esm/modules/formula/functions/dynamic-array.js +860 -0
- package/dist/esm/modules/formula/functions/engineering.js +1128 -0
- package/dist/esm/modules/formula/functions/financial.js +2296 -0
- package/dist/esm/modules/formula/functions/lookup.js +886 -0
- package/dist/esm/modules/formula/functions/math.js +1406 -0
- package/dist/esm/modules/formula/functions/statistical.js +3390 -0
- package/dist/esm/modules/formula/functions/text.js +1845 -0
- package/dist/esm/modules/formula/host-registry.js +69 -0
- package/dist/esm/modules/formula/index.js +49 -0
- package/dist/esm/modules/formula/install.js +88 -0
- package/dist/esm/modules/formula/integration/apply-writeback-plan.js +210 -0
- package/dist/esm/modules/formula/integration/calculate-formulas-impl.js +616 -0
- package/dist/esm/modules/formula/integration/calculate-formulas.js +68 -0
- package/dist/esm/modules/formula/integration/formula-instance.js +79 -0
- package/dist/esm/modules/formula/integration/workbook-adapter.js +324 -0
- package/dist/esm/modules/formula/integration/workbook-snapshot.js +77 -0
- package/dist/esm/modules/formula/materialize/build-writeback-plan.js +473 -0
- package/dist/esm/modules/formula/materialize/spill-engine.js +38 -0
- package/dist/esm/modules/formula/materialize/types.js +29 -0
- package/dist/esm/modules/formula/materialize/writeback-plan.js +27 -0
- package/dist/esm/modules/formula/runtime/evaluator.js +2291 -0
- package/dist/esm/modules/formula/runtime/function-registry.js +840 -0
- package/dist/esm/modules/formula/runtime/values.js +385 -0
- package/dist/esm/modules/formula/syntax/ast.js +28 -0
- package/dist/esm/modules/formula/syntax/parser.js +439 -0
- package/dist/esm/modules/formula/syntax/token-types.js +59 -0
- package/dist/esm/modules/formula/syntax/tokenizer.js +1074 -0
- package/dist/esm/modules/pdf/excel-bridge.js +9 -0
- package/dist/iife/excelts.iife.js +2302 -373
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +34 -34
- package/dist/types/index.browser.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/modules/excel/cell.d.ts +17 -3
- package/dist/types/modules/excel/defined-names.d.ts +96 -1
- package/dist/types/modules/excel/image.d.ts +11 -0
- package/dist/types/modules/excel/stream/workbook-reader.browser.d.ts +9 -3
- package/dist/types/modules/excel/stream/workbook-reader.d.ts +2 -1
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +39 -5
- package/dist/types/modules/excel/stream/workbook-writer.d.ts +3 -2
- package/dist/types/modules/excel/stream/worksheet-writer.d.ts +39 -6
- package/dist/types/modules/excel/types.d.ts +133 -2
- package/dist/types/modules/excel/utils/col-cache.d.ts +1 -0
- package/dist/types/modules/excel/utils/drawing-utils.d.ts +3 -3
- package/dist/types/modules/excel/utils/external-link-formula.d.ts +76 -0
- package/dist/types/modules/excel/utils/iterate-stream.d.ts +9 -3
- package/dist/types/modules/excel/utils/ooxml-paths.d.ts +19 -0
- package/dist/types/modules/excel/utils/shared-strings.d.ts +8 -3
- package/dist/types/modules/excel/utils/workbook-protection.d.ts +30 -0
- package/dist/types/modules/excel/workbook.browser.d.ts +257 -6
- package/dist/types/modules/excel/workbook.d.ts +1 -1
- package/dist/types/modules/excel/worksheet.d.ts +3 -1
- package/dist/types/modules/excel/xlsx/rel-type.d.ts +15 -0
- package/dist/types/modules/excel/xlsx/xform/book/defined-name-xform.d.ts +6 -5
- package/dist/types/modules/excel/xlsx/xform/book/external-link-xform.d.ts +84 -0
- package/dist/types/modules/excel/xlsx/xform/book/external-reference-xform.d.ts +17 -0
- package/dist/types/modules/excel/xlsx/xform/book/workbook-calc-properties-xform.d.ts +3 -0
- package/dist/types/modules/excel/xlsx/xform/book/workbook-protection-xform.d.ts +20 -0
- package/dist/types/modules/excel/xlsx/xform/core/metadata-xform.d.ts +56 -0
- package/dist/types/modules/excel/xlsx/xform/drawing/absolute-anchor-xform.d.ts +26 -0
- package/dist/types/modules/excel/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/ignored-errors-xform.d.ts +21 -0
- package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +172 -13
- package/dist/types/modules/excel/xlsx/xlsx.d.ts +7 -4
- package/dist/types/modules/formula/compile/address-utils.d.ts +62 -0
- package/dist/types/modules/formula/compile/binder.d.ts +42 -0
- package/dist/types/modules/formula/compile/bound-ast.d.ts +230 -0
- package/dist/types/modules/formula/compile/compiled-formula.d.ts +137 -0
- package/dist/types/modules/formula/compile/dependency-analysis.d.ts +93 -0
- package/dist/types/modules/formula/compile/structured-ref-utils.d.ts +93 -0
- package/dist/types/modules/formula/default-syntax-probe.d.ts +79 -0
- package/dist/types/modules/formula/functions/_date-context.d.ts +4 -0
- package/dist/types/modules/formula/functions/_shared.d.ts +121 -0
- package/dist/types/modules/formula/functions/conditional.d.ts +27 -0
- package/dist/types/modules/formula/functions/database.d.ts +37 -0
- package/dist/types/modules/formula/functions/date.d.ts +61 -0
- package/dist/types/modules/formula/functions/dynamic-array.d.ts +23 -0
- package/dist/types/modules/formula/functions/engineering.d.ts +57 -0
- package/dist/types/modules/formula/functions/financial.d.ts +202 -0
- package/dist/types/modules/formula/functions/lookup.d.ts +18 -0
- package/dist/types/modules/formula/functions/math.d.ts +114 -0
- package/dist/types/modules/formula/functions/statistical.d.ts +193 -0
- package/dist/types/modules/formula/functions/text.d.ts +86 -0
- package/dist/types/modules/formula/host-registry.d.ts +53 -0
- package/dist/types/modules/formula/index.d.ts +39 -0
- package/dist/types/modules/formula/install.d.ts +62 -0
- package/dist/types/modules/formula/integration/apply-writeback-plan.d.ts +26 -0
- package/dist/types/modules/formula/integration/calculate-formulas-impl.d.ts +30 -0
- package/dist/types/modules/formula/integration/calculate-formulas.d.ts +67 -0
- package/dist/types/modules/formula/integration/formula-instance.d.ts +64 -0
- package/dist/types/modules/formula/integration/workbook-adapter.d.ts +26 -0
- package/dist/types/modules/formula/integration/workbook-snapshot.d.ts +267 -0
- package/dist/types/modules/formula/materialize/build-writeback-plan.d.ts +34 -0
- package/dist/types/modules/formula/materialize/spill-engine.d.ts +9 -0
- package/dist/types/modules/formula/materialize/types.d.ts +179 -0
- package/dist/types/modules/formula/materialize/writeback-plan.d.ts +167 -0
- package/dist/types/modules/formula/runtime/evaluator.d.ts +151 -0
- package/dist/types/modules/formula/runtime/function-registry.d.ts +47 -0
- package/dist/types/modules/formula/runtime/values.d.ts +211 -0
- package/dist/types/modules/formula/syntax/ast.d.ts +129 -0
- package/dist/types/modules/formula/syntax/parser.d.ts +18 -0
- package/dist/types/modules/formula/syntax/token-types.d.ts +153 -0
- package/dist/types/modules/formula/syntax/tokenizer.d.ts +10 -0
- package/package.json +28 -28
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Conditional Aggregate Functions — Native RuntimeValue Implementation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildCriteriaPredicateRV = buildCriteriaPredicateRV;
|
|
7
|
+
exports.fnSUMIF = fnSUMIF;
|
|
8
|
+
exports.fnSUMIFS = fnSUMIFS;
|
|
9
|
+
exports.fnCOUNTIF = fnCOUNTIF;
|
|
10
|
+
exports.fnCOUNTIFS = fnCOUNTIFS;
|
|
11
|
+
exports.fnAVERAGEIF = fnAVERAGEIF;
|
|
12
|
+
exports.fnAVERAGEIFS = fnAVERAGEIFS;
|
|
13
|
+
exports.fnMAXIFS = fnMAXIFS;
|
|
14
|
+
exports.fnMINIFS = fnMINIFS;
|
|
15
|
+
const values_1 = require("../runtime/values");
|
|
16
|
+
const _shared_1 = require("./_shared");
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Criteria Predicate Builder (RuntimeValue version)
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Build a criteria predicate from a ScalarValue.
|
|
22
|
+
* Matches Excel SUMIF/COUNTIF criteria semantics:
|
|
23
|
+
* - number → exact numeric match
|
|
24
|
+
* - boolean → exact boolean match
|
|
25
|
+
* - string with operator prefix (">5", "<=10", "<>abc") → comparison
|
|
26
|
+
* - string with wildcards (* ?) → pattern match
|
|
27
|
+
* - plain string → case-insensitive exact match (or numeric if parseable)
|
|
28
|
+
*/
|
|
29
|
+
function buildCriteriaPredicateRV(criteria) {
|
|
30
|
+
if (criteria.kind === 1 /* RVKind.Number */) {
|
|
31
|
+
const n = criteria.value;
|
|
32
|
+
return v => v.kind === 1 /* RVKind.Number */ && v.value === n;
|
|
33
|
+
}
|
|
34
|
+
if (criteria.kind === 3 /* RVKind.Boolean */) {
|
|
35
|
+
const b = criteria.value;
|
|
36
|
+
return v => v.kind === 3 /* RVKind.Boolean */ && v.value === b;
|
|
37
|
+
}
|
|
38
|
+
if (criteria.kind === 4 /* RVKind.Error */) {
|
|
39
|
+
return () => false;
|
|
40
|
+
}
|
|
41
|
+
// Blank criteria: match blank/empty-string
|
|
42
|
+
if (criteria.kind === 0 /* RVKind.Blank */) {
|
|
43
|
+
return v => v.kind === 0 /* RVKind.Blank */ || (v.kind === 2 /* RVKind.String */ && v.value === "");
|
|
44
|
+
}
|
|
45
|
+
// String criteria
|
|
46
|
+
const s = criteria.kind === 2 /* RVKind.String */ ? criteria.value : "";
|
|
47
|
+
// Operator-prefixed criteria. Order the regex alternatives longest-first
|
|
48
|
+
// so that `<>abc` matches the `<>` branch (not `<` with `>abc` as the
|
|
49
|
+
// value). Without the explicit ordering, `/^[<>]=?/` would greedily
|
|
50
|
+
// consume just `<` and silently mis-route every not-equal criterion to
|
|
51
|
+
// the `<` branch.
|
|
52
|
+
const opMatch = /^(<>|<=|>=|<|>|=)(.*)$/.exec(s);
|
|
53
|
+
if (opMatch) {
|
|
54
|
+
const [, op, valStr] = opMatch;
|
|
55
|
+
const numVal = Number(valStr);
|
|
56
|
+
const isNum = !isNaN(numVal) && valStr.trim() !== "";
|
|
57
|
+
// For numeric comparisons Excel coerces booleans (TRUE→1, FALSE→0) and
|
|
58
|
+
// blank (→0); numeric strings are NOT coerced (COUNTIF stays textual
|
|
59
|
+
// for those). Only real Number / Boolean / Blank cells participate in
|
|
60
|
+
// numeric comparisons; everything else falls back to string compare.
|
|
61
|
+
const numericOf = (v) => {
|
|
62
|
+
if (v.kind === 1 /* RVKind.Number */) {
|
|
63
|
+
return v.value;
|
|
64
|
+
}
|
|
65
|
+
if (v.kind === 3 /* RVKind.Boolean */) {
|
|
66
|
+
return v.value ? 1 : 0;
|
|
67
|
+
}
|
|
68
|
+
if (v.kind === 0 /* RVKind.Blank */) {
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
return Number.NaN;
|
|
72
|
+
};
|
|
73
|
+
return (v) => {
|
|
74
|
+
const vn = numericOf(v);
|
|
75
|
+
const vs = (0, values_1.toStringRV)(v).toLowerCase();
|
|
76
|
+
const cs = valStr.toLowerCase();
|
|
77
|
+
switch (op) {
|
|
78
|
+
case "=":
|
|
79
|
+
return isNum ? vn === numVal : vs === cs;
|
|
80
|
+
case "<>":
|
|
81
|
+
return isNum ? vn !== numVal : vs !== cs;
|
|
82
|
+
case ">":
|
|
83
|
+
return isNum ? vn > numVal : vs > cs;
|
|
84
|
+
case "<":
|
|
85
|
+
return isNum ? vn < numVal : vs < cs;
|
|
86
|
+
case ">=":
|
|
87
|
+
return isNum ? vn >= numVal : vs >= cs;
|
|
88
|
+
case "<=":
|
|
89
|
+
return isNum ? vn <= numVal : vs <= cs;
|
|
90
|
+
default:
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Wildcard match (case-insensitive). Excel treats `~*`, `~?`, `~~` as
|
|
96
|
+
// literal `*`, `?`, `~` and everything else as a regex special character
|
|
97
|
+
// that must be escaped. Only an unescaped `*` or `?` triggers the wildcard
|
|
98
|
+
// path; a pattern like `~*` matches a literal asterisk.
|
|
99
|
+
if ((0, _shared_1.hasUnescapedWildcard)(s)) {
|
|
100
|
+
try {
|
|
101
|
+
const re = new RegExp("^" + (0, _shared_1.excelWildcardToRegex)(s) + "$", "i");
|
|
102
|
+
return v => re.test((0, values_1.toStringRV)(v));
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
const literal = (0, _shared_1.unescapeExcelWildcard)(s).toLowerCase();
|
|
106
|
+
return v => (0, values_1.toStringRV)(v).toLowerCase() === literal;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// No wildcards: strip any `~` escapes and do a literal case-insensitive compare.
|
|
110
|
+
const literal = (0, _shared_1.unescapeExcelWildcard)(s);
|
|
111
|
+
// Exact match (case-insensitive for strings, numeric for numbers)
|
|
112
|
+
const numCriteria = Number(literal);
|
|
113
|
+
if (!isNaN(numCriteria) && literal.trim() !== "") {
|
|
114
|
+
return v => v.kind === 1 /* RVKind.Number */ && v.value === numCriteria;
|
|
115
|
+
}
|
|
116
|
+
const literalLc = literal.toLowerCase();
|
|
117
|
+
return v => (0, values_1.toStringRV)(v).toLowerCase() === literalLc;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Scan a criteria string for an unescaped `*` or `?`. A backslash-style
|
|
121
|
+
* escape in Excel is `~`; so `~*` and `~?` are literals, while `*` and `?`
|
|
122
|
+
* on their own or at a position not preceded by `~` count as wildcards.
|
|
123
|
+
*/
|
|
124
|
+
// ── Wildcard helpers live in `_shared.ts` and are re-used by SEARCH / MATCH /
|
|
125
|
+
// XLOOKUP / SUMIF / COUNTIF so every function agrees on the same escape
|
|
126
|
+
// semantics (`~*`, `~?`, `~~`). See `excelWildcardToRegex`,
|
|
127
|
+
// `hasUnescapedWildcard`, and `unescapeExcelWildcard`.
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// Functions
|
|
130
|
+
// ============================================================================
|
|
131
|
+
function fnSUMIF(args) {
|
|
132
|
+
const rangeArr = (0, _shared_1.asArray)(args[0]);
|
|
133
|
+
if (!rangeArr) {
|
|
134
|
+
return values_1.ERRORS.VALUE;
|
|
135
|
+
}
|
|
136
|
+
const criteriaScalar = (0, values_1.topLeft)(args[1]);
|
|
137
|
+
if ((0, values_1.isError)(criteriaScalar)) {
|
|
138
|
+
return criteriaScalar;
|
|
139
|
+
}
|
|
140
|
+
const pred = buildCriteriaPredicateRV(criteriaScalar);
|
|
141
|
+
const sumArr = args.length > 2 ? ((0, _shared_1.asArray)(args[2]) ?? rangeArr) : rangeArr;
|
|
142
|
+
let sum = 0;
|
|
143
|
+
for (let r = 0; r < rangeArr.height; r++) {
|
|
144
|
+
for (let c = 0; c < rangeArr.width; c++) {
|
|
145
|
+
if (pred((0, _shared_1.getCell)(rangeArr, r, c))) {
|
|
146
|
+
const sv = (0, _shared_1.getCell)(sumArr, r, c);
|
|
147
|
+
if (sv.kind === 1 /* RVKind.Number */) {
|
|
148
|
+
sum += sv.value;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return (0, values_1.rvNumber)(sum);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Scan successive `(range, criteria)` argument pairs starting at
|
|
157
|
+
* `startIdx`. Returns a list of `{ arr, pred }` ready for iteration, or
|
|
158
|
+
* an `{ error }` sentinel when a range argument is missing, a criteria
|
|
159
|
+
* value is itself an error, or a criteria range's shape does not match
|
|
160
|
+
* `target`'s shape (Excel's SUMIFS/COUNTIFS require identical shapes —
|
|
161
|
+
* silently zero-extending with `BLANK` produced wrong counts).
|
|
162
|
+
*
|
|
163
|
+
* Used by SUMIFS/COUNTIFS/AVERAGEIFS/MAXIFS/MINIFS which share the
|
|
164
|
+
* "target array + N criteria pairs" shape.
|
|
165
|
+
*/
|
|
166
|
+
function collectCriteriaPairs(args, startIdx, target) {
|
|
167
|
+
const pairs = [];
|
|
168
|
+
for (let i = startIdx; i < args.length - 1; i += 2) {
|
|
169
|
+
const critRange = (0, _shared_1.asArray)(args[i]);
|
|
170
|
+
if (!critRange) {
|
|
171
|
+
return { error: values_1.ERRORS.VALUE };
|
|
172
|
+
}
|
|
173
|
+
if (critRange.height !== target.height || critRange.width !== target.width) {
|
|
174
|
+
return { error: values_1.ERRORS.VALUE };
|
|
175
|
+
}
|
|
176
|
+
const cs = (0, values_1.topLeft)(args[i + 1]);
|
|
177
|
+
if ((0, values_1.isError)(cs)) {
|
|
178
|
+
return { error: cs };
|
|
179
|
+
}
|
|
180
|
+
pairs.push({ arr: critRange, pred: buildCriteriaPredicateRV(cs) });
|
|
181
|
+
}
|
|
182
|
+
return { pairs };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Walk every (row, col) position in `target` and invoke `onMatch(r, c)`
|
|
186
|
+
* whenever all criteria predicates evaluate true at that position. The
|
|
187
|
+
* criteria arrays are expected to share `target`'s shape — Excel returns
|
|
188
|
+
* `#VALUE!` at the call site if they don't, which callers can detect by
|
|
189
|
+
* checking `target.height` / `target.width` before invoking this helper.
|
|
190
|
+
*/
|
|
191
|
+
function iterateMultiCriteria(target, pairs, onMatch) {
|
|
192
|
+
const rows = target.height;
|
|
193
|
+
const cols = target.width;
|
|
194
|
+
for (let r = 0; r < rows; r++) {
|
|
195
|
+
for (let c = 0; c < cols; c++) {
|
|
196
|
+
let allMatch = true;
|
|
197
|
+
for (const p of pairs) {
|
|
198
|
+
if (!p.pred((0, _shared_1.getCell)(p.arr, r, c))) {
|
|
199
|
+
allMatch = false;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (allMatch) {
|
|
204
|
+
onMatch(r, c);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function fnSUMIFS(args) {
|
|
210
|
+
const sumArr = (0, _shared_1.asArray)(args[0]);
|
|
211
|
+
if (!sumArr || args.length < 3) {
|
|
212
|
+
return values_1.ERRORS.VALUE;
|
|
213
|
+
}
|
|
214
|
+
const pairs = collectCriteriaPairs(args, 1, sumArr);
|
|
215
|
+
if ("error" in pairs) {
|
|
216
|
+
return pairs.error;
|
|
217
|
+
}
|
|
218
|
+
let sum = 0;
|
|
219
|
+
iterateMultiCriteria(sumArr, pairs.pairs, (r, c) => {
|
|
220
|
+
const sv = (0, _shared_1.getCell)(sumArr, r, c);
|
|
221
|
+
if (sv.kind === 1 /* RVKind.Number */) {
|
|
222
|
+
sum += sv.value;
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
return (0, values_1.rvNumber)(sum);
|
|
226
|
+
}
|
|
227
|
+
function fnCOUNTIF(args) {
|
|
228
|
+
const rangeArr = (0, _shared_1.asArray)(args[0]);
|
|
229
|
+
if (!rangeArr) {
|
|
230
|
+
return values_1.ERRORS.VALUE;
|
|
231
|
+
}
|
|
232
|
+
const cs = (0, values_1.topLeft)(args[1]);
|
|
233
|
+
if ((0, values_1.isError)(cs)) {
|
|
234
|
+
return cs;
|
|
235
|
+
}
|
|
236
|
+
const pred = buildCriteriaPredicateRV(cs);
|
|
237
|
+
let count = 0;
|
|
238
|
+
for (let r = 0; r < rangeArr.height; r++) {
|
|
239
|
+
for (let c = 0; c < rangeArr.width; c++) {
|
|
240
|
+
if (pred((0, _shared_1.getCell)(rangeArr, r, c))) {
|
|
241
|
+
count++;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return (0, values_1.rvNumber)(count);
|
|
246
|
+
}
|
|
247
|
+
function fnCOUNTIFS(args) {
|
|
248
|
+
if (args.length < 2 || !(0, values_1.isArray)(args[0])) {
|
|
249
|
+
return values_1.ERRORS.VALUE;
|
|
250
|
+
}
|
|
251
|
+
// The first range defines the target shape; every subsequent criteria
|
|
252
|
+
// range must match. `collectCriteriaPairs` also validates args[0]
|
|
253
|
+
// against itself (trivially passes) as a nice-to-have for consistency.
|
|
254
|
+
const target = args[0];
|
|
255
|
+
const pairs = collectCriteriaPairs(args, 0, target);
|
|
256
|
+
if ("error" in pairs) {
|
|
257
|
+
return pairs.error;
|
|
258
|
+
}
|
|
259
|
+
let count = 0;
|
|
260
|
+
iterateMultiCriteria(target, pairs.pairs, () => {
|
|
261
|
+
count++;
|
|
262
|
+
});
|
|
263
|
+
return (0, values_1.rvNumber)(count);
|
|
264
|
+
}
|
|
265
|
+
function fnAVERAGEIF(args) {
|
|
266
|
+
const rangeArr = (0, _shared_1.asArray)(args[0]);
|
|
267
|
+
if (!rangeArr) {
|
|
268
|
+
return values_1.ERRORS.VALUE;
|
|
269
|
+
}
|
|
270
|
+
const cs = (0, values_1.topLeft)(args[1]);
|
|
271
|
+
if ((0, values_1.isError)(cs)) {
|
|
272
|
+
return cs;
|
|
273
|
+
}
|
|
274
|
+
const pred = buildCriteriaPredicateRV(cs);
|
|
275
|
+
const avgArr = args.length > 2 ? ((0, _shared_1.asArray)(args[2]) ?? rangeArr) : rangeArr;
|
|
276
|
+
let sum = 0;
|
|
277
|
+
let count = 0;
|
|
278
|
+
for (let r = 0; r < rangeArr.height; r++) {
|
|
279
|
+
for (let c = 0; c < rangeArr.width; c++) {
|
|
280
|
+
if (pred((0, _shared_1.getCell)(rangeArr, r, c))) {
|
|
281
|
+
const sv = (0, _shared_1.getCell)(avgArr, r, c);
|
|
282
|
+
if (sv.kind === 1 /* RVKind.Number */) {
|
|
283
|
+
sum += sv.value;
|
|
284
|
+
count++;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return count === 0 ? values_1.ERRORS.DIV0 : (0, values_1.rvNumber)(sum / count);
|
|
290
|
+
}
|
|
291
|
+
function fnAVERAGEIFS(args) {
|
|
292
|
+
const avgArr = (0, _shared_1.asArray)(args[0]);
|
|
293
|
+
if (!avgArr || args.length < 3) {
|
|
294
|
+
return values_1.ERRORS.VALUE;
|
|
295
|
+
}
|
|
296
|
+
const pairs = collectCriteriaPairs(args, 1, avgArr);
|
|
297
|
+
if ("error" in pairs) {
|
|
298
|
+
return pairs.error;
|
|
299
|
+
}
|
|
300
|
+
let sum = 0;
|
|
301
|
+
let count = 0;
|
|
302
|
+
iterateMultiCriteria(avgArr, pairs.pairs, (r, c) => {
|
|
303
|
+
const sv = (0, _shared_1.getCell)(avgArr, r, c);
|
|
304
|
+
if (sv.kind === 1 /* RVKind.Number */) {
|
|
305
|
+
sum += sv.value;
|
|
306
|
+
count++;
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
return count === 0 ? values_1.ERRORS.DIV0 : (0, values_1.rvNumber)(sum / count);
|
|
310
|
+
}
|
|
311
|
+
function fnMAXIFS(args) {
|
|
312
|
+
const maxArr = (0, _shared_1.asArray)(args[0]);
|
|
313
|
+
if (!maxArr || args.length < 3) {
|
|
314
|
+
return values_1.ERRORS.VALUE;
|
|
315
|
+
}
|
|
316
|
+
const pairs = collectCriteriaPairs(args, 1, maxArr);
|
|
317
|
+
if ("error" in pairs) {
|
|
318
|
+
return pairs.error;
|
|
319
|
+
}
|
|
320
|
+
let result = -Infinity;
|
|
321
|
+
let found = false;
|
|
322
|
+
iterateMultiCriteria(maxArr, pairs.pairs, (r, c) => {
|
|
323
|
+
const sv = (0, _shared_1.getCell)(maxArr, r, c);
|
|
324
|
+
if (sv.kind === 1 /* RVKind.Number */) {
|
|
325
|
+
if (sv.value > result) {
|
|
326
|
+
result = sv.value;
|
|
327
|
+
}
|
|
328
|
+
found = true;
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
return (0, values_1.rvNumber)(found ? result : 0);
|
|
332
|
+
}
|
|
333
|
+
function fnMINIFS(args) {
|
|
334
|
+
const minArr = (0, _shared_1.asArray)(args[0]);
|
|
335
|
+
if (!minArr || args.length < 3) {
|
|
336
|
+
return values_1.ERRORS.VALUE;
|
|
337
|
+
}
|
|
338
|
+
const pairs = collectCriteriaPairs(args, 1, minArr);
|
|
339
|
+
if ("error" in pairs) {
|
|
340
|
+
return pairs.error;
|
|
341
|
+
}
|
|
342
|
+
let result = Infinity;
|
|
343
|
+
let found = false;
|
|
344
|
+
iterateMultiCriteria(minArr, pairs.pairs, (r, c) => {
|
|
345
|
+
const sv = (0, _shared_1.getCell)(minArr, r, c);
|
|
346
|
+
if (sv.kind === 1 /* RVKind.Number */) {
|
|
347
|
+
if (sv.value < result) {
|
|
348
|
+
result = sv.value;
|
|
349
|
+
}
|
|
350
|
+
found = true;
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
return (0, values_1.rvNumber)(found ? result : 0);
|
|
354
|
+
}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Database Functions — Native RuntimeValue Implementation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fnDSUM = fnDSUM;
|
|
7
|
+
exports.fnDAVERAGE = fnDAVERAGE;
|
|
8
|
+
exports.fnDCOUNT = fnDCOUNT;
|
|
9
|
+
exports.fnDMAX = fnDMAX;
|
|
10
|
+
exports.fnDMIN = fnDMIN;
|
|
11
|
+
exports.fnDPRODUCT = fnDPRODUCT;
|
|
12
|
+
exports.fnDGET = fnDGET;
|
|
13
|
+
exports.fnDCOUNTA = fnDCOUNTA;
|
|
14
|
+
exports.fnDSTDEV = fnDSTDEV;
|
|
15
|
+
exports.fnDSTDEVP = fnDSTDEVP;
|
|
16
|
+
exports.fnDVAR = fnDVAR;
|
|
17
|
+
exports.fnDVARP = fnDVARP;
|
|
18
|
+
const values_1 = require("../runtime/values");
|
|
19
|
+
const _shared_1 = require("./_shared");
|
|
20
|
+
const conditional_1 = require("./conditional");
|
|
21
|
+
/**
|
|
22
|
+
* Collect the field-column values from every database row that satisfies the
|
|
23
|
+
* criteria range. The returned list preserves each matching cell's original
|
|
24
|
+
* `ScalarValue` (numbers, strings, booleans, blanks, errors) so that callers
|
|
25
|
+
* can decide how to aggregate — numeric aggregators filter to numbers while
|
|
26
|
+
* DGET inspects the raw value.
|
|
27
|
+
*
|
|
28
|
+
* Returns an error RuntimeValue when the inputs are malformed (invalid array
|
|
29
|
+
* shapes, unknown field name, etc.). On success, returns `ScalarValue[]`.
|
|
30
|
+
*/
|
|
31
|
+
function collectDatabaseMatches(args) {
|
|
32
|
+
const dbArr = (0, _shared_1.asArray)(args[0]);
|
|
33
|
+
const critArr = (0, _shared_1.asArray)(args[2]);
|
|
34
|
+
if (!dbArr || !critArr) {
|
|
35
|
+
return values_1.ERRORS.VALUE;
|
|
36
|
+
}
|
|
37
|
+
const fieldArg = (0, values_1.topLeft)(args[1]);
|
|
38
|
+
if (dbArr.height < 2 || critArr.height < 2) {
|
|
39
|
+
return values_1.ERRORS.VALUE;
|
|
40
|
+
}
|
|
41
|
+
// Determine field column index.
|
|
42
|
+
//
|
|
43
|
+
// Excel accepts the field argument as:
|
|
44
|
+
// - a 1-based integer column index (or TRUE/FALSE coerced to 1/0)
|
|
45
|
+
// - a string that matches one of the header cells (case-insensitive,
|
|
46
|
+
// and trimmed so imported data with stray whitespace still matches)
|
|
47
|
+
let fieldIdx = -1;
|
|
48
|
+
if (fieldArg.kind === 1 /* RVKind.Number */) {
|
|
49
|
+
fieldIdx = Math.trunc(fieldArg.value) - 1;
|
|
50
|
+
}
|
|
51
|
+
else if (fieldArg.kind === 3 /* RVKind.Boolean */) {
|
|
52
|
+
// TRUE → 1-based column 1 (index 0); FALSE → 0 → invalid (Excel
|
|
53
|
+
// rejects FALSE with #VALUE!). Match that routing explicitly.
|
|
54
|
+
fieldIdx = fieldArg.value ? 0 : -1;
|
|
55
|
+
}
|
|
56
|
+
else if (fieldArg.kind === 2 /* RVKind.String */) {
|
|
57
|
+
const want = fieldArg.value.trim().toLowerCase();
|
|
58
|
+
for (let c = 0; c < dbArr.width; c++) {
|
|
59
|
+
if ((0, values_1.toStringRV)((0, _shared_1.getCell)(dbArr, 0, c))
|
|
60
|
+
.trim()
|
|
61
|
+
.toLowerCase() === want) {
|
|
62
|
+
fieldIdx = c;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (fieldIdx < 0 || fieldIdx >= dbArr.width) {
|
|
68
|
+
return values_1.ERRORS.VALUE;
|
|
69
|
+
}
|
|
70
|
+
// Parse criteria: columns map to database header columns (trimmed,
|
|
71
|
+
// case-insensitive, same as the field-name path above).
|
|
72
|
+
const critColIndices = [];
|
|
73
|
+
for (let cc = 0; cc < critArr.width; cc++) {
|
|
74
|
+
const name = (0, values_1.toStringRV)((0, _shared_1.getCell)(critArr, 0, cc))
|
|
75
|
+
.trim()
|
|
76
|
+
.toLowerCase();
|
|
77
|
+
let idx = -1;
|
|
78
|
+
for (let hc = 0; hc < dbArr.width; hc++) {
|
|
79
|
+
if ((0, values_1.toStringRV)((0, _shared_1.getCell)(dbArr, 0, hc))
|
|
80
|
+
.trim()
|
|
81
|
+
.toLowerCase() === name) {
|
|
82
|
+
idx = hc;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
critColIndices.push(idx);
|
|
87
|
+
}
|
|
88
|
+
// Collect matching rows' field values
|
|
89
|
+
const matches = [];
|
|
90
|
+
for (let r = 1; r < dbArr.height; r++) {
|
|
91
|
+
let matchesAnyCritRow = false;
|
|
92
|
+
for (let cr = 1; cr < critArr.height; cr++) {
|
|
93
|
+
let allMatch = true;
|
|
94
|
+
for (let cc = 0; cc < critArr.width; cc++) {
|
|
95
|
+
const critVal = (0, _shared_1.getCell)(critArr, cr, cc);
|
|
96
|
+
if (critVal.kind === 0 /* RVKind.Blank */ ||
|
|
97
|
+
(critVal.kind === 2 /* RVKind.String */ && critVal.value === "")) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const dbCol = critColIndices[cc];
|
|
101
|
+
if (dbCol < 0) {
|
|
102
|
+
allMatch = false;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
const pred = (0, conditional_1.buildCriteriaPredicateRV)(critVal);
|
|
106
|
+
if (!pred((0, _shared_1.getCell)(dbArr, r, dbCol))) {
|
|
107
|
+
allMatch = false;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (allMatch) {
|
|
112
|
+
matchesAnyCritRow = true;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (matchesAnyCritRow) {
|
|
117
|
+
matches.push((0, _shared_1.getCell)(dbArr, r, fieldIdx));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return matches;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Shared wrapper for numeric aggregators (DSUM, DAVERAGE, DCOUNT, DMAX, DMIN,
|
|
124
|
+
* DPRODUCT). Collects matches, filters to numeric values, and delegates to the
|
|
125
|
+
* caller-supplied reducer.
|
|
126
|
+
*/
|
|
127
|
+
function databaseNumericAggregate(args, aggregator) {
|
|
128
|
+
const matches = collectDatabaseMatches(args);
|
|
129
|
+
if (!Array.isArray(matches)) {
|
|
130
|
+
return matches;
|
|
131
|
+
}
|
|
132
|
+
const values = [];
|
|
133
|
+
for (const v of matches) {
|
|
134
|
+
if (v.kind === 1 /* RVKind.Number */) {
|
|
135
|
+
values.push(v.value);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return aggregator(values);
|
|
139
|
+
}
|
|
140
|
+
function fnDSUM(args) {
|
|
141
|
+
return databaseNumericAggregate(args, vals => (0, values_1.rvNumber)(vals.reduce((a, b) => a + b, 0)));
|
|
142
|
+
}
|
|
143
|
+
function fnDAVERAGE(args) {
|
|
144
|
+
return databaseNumericAggregate(args, vals => vals.length === 0 ? values_1.ERRORS.DIV0 : (0, values_1.rvNumber)(vals.reduce((a, b) => a + b, 0) / vals.length));
|
|
145
|
+
}
|
|
146
|
+
function fnDCOUNT(args) {
|
|
147
|
+
return databaseNumericAggregate(args, vals => (0, values_1.rvNumber)(vals.length));
|
|
148
|
+
}
|
|
149
|
+
function fnDMAX(args) {
|
|
150
|
+
return databaseNumericAggregate(args, vals => {
|
|
151
|
+
if (vals.length === 0) {
|
|
152
|
+
return (0, values_1.rvNumber)(0);
|
|
153
|
+
}
|
|
154
|
+
// Avoid `Math.max(...vals)` — spreading a large numeric array onto the
|
|
155
|
+
// call stack throws `RangeError: Maximum call stack size exceeded` on
|
|
156
|
+
// databases with more than ~65k matching rows.
|
|
157
|
+
let m = vals[0];
|
|
158
|
+
for (let i = 1; i < vals.length; i++) {
|
|
159
|
+
if (vals[i] > m) {
|
|
160
|
+
m = vals[i];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return (0, values_1.rvNumber)(m);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function fnDMIN(args) {
|
|
167
|
+
return databaseNumericAggregate(args, vals => {
|
|
168
|
+
if (vals.length === 0) {
|
|
169
|
+
return (0, values_1.rvNumber)(0);
|
|
170
|
+
}
|
|
171
|
+
let m = vals[0];
|
|
172
|
+
for (let i = 1; i < vals.length; i++) {
|
|
173
|
+
if (vals[i] < m) {
|
|
174
|
+
m = vals[i];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return (0, values_1.rvNumber)(m);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
function fnDPRODUCT(args) {
|
|
181
|
+
return databaseNumericAggregate(args, vals => (0, values_1.rvNumber)(vals.length === 0 ? 0 : vals.reduce((a, b) => a * b, 1)));
|
|
182
|
+
}
|
|
183
|
+
function fnDGET(args) {
|
|
184
|
+
const matches = collectDatabaseMatches(args);
|
|
185
|
+
if (!Array.isArray(matches)) {
|
|
186
|
+
return matches;
|
|
187
|
+
}
|
|
188
|
+
// DGET aggregator semantics: 0 matches → #VALUE!, exactly 1 → the value,
|
|
189
|
+
// >1 → #NUM!.
|
|
190
|
+
if (matches.length === 0) {
|
|
191
|
+
return values_1.ERRORS.VALUE;
|
|
192
|
+
}
|
|
193
|
+
if (matches.length > 1) {
|
|
194
|
+
return values_1.ERRORS.NUM;
|
|
195
|
+
}
|
|
196
|
+
return matches[0];
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* DCOUNTA(database, field, criteria) — count non-empty cells that match
|
|
200
|
+
* the criteria, in the specified field. Unlike DCOUNT (numeric-only),
|
|
201
|
+
* DCOUNTA counts any non-blank cell including text and booleans.
|
|
202
|
+
*/
|
|
203
|
+
function fnDCOUNTA(args) {
|
|
204
|
+
const matches = collectDatabaseMatches(args);
|
|
205
|
+
if (!Array.isArray(matches)) {
|
|
206
|
+
return matches;
|
|
207
|
+
}
|
|
208
|
+
let count = 0;
|
|
209
|
+
for (const v of matches) {
|
|
210
|
+
// Count anything that is not Blank and not an empty string.
|
|
211
|
+
if (v.kind === 0 /* RVKind.Blank */) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (v.kind === 2 /* RVKind.String */ && v.value === "") {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
count++;
|
|
218
|
+
}
|
|
219
|
+
return (0, values_1.rvNumber)(count);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* DSTDEV(database, field, criteria) — sample standard deviation of
|
|
223
|
+
* numeric cells matching criteria in the specified field.
|
|
224
|
+
*/
|
|
225
|
+
function fnDSTDEV(args) {
|
|
226
|
+
return databaseNumericAggregate(args, vals => {
|
|
227
|
+
if (vals.length < 2) {
|
|
228
|
+
return values_1.ERRORS.DIV0;
|
|
229
|
+
}
|
|
230
|
+
const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
|
|
231
|
+
let ss = 0;
|
|
232
|
+
for (const v of vals) {
|
|
233
|
+
ss += (v - mean) * (v - mean);
|
|
234
|
+
}
|
|
235
|
+
return (0, values_1.rvNumber)(Math.sqrt(ss / (vals.length - 1)));
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* DSTDEVP(database, field, criteria) — population standard deviation
|
|
240
|
+
* of numeric cells matching criteria.
|
|
241
|
+
*/
|
|
242
|
+
function fnDSTDEVP(args) {
|
|
243
|
+
return databaseNumericAggregate(args, vals => {
|
|
244
|
+
if (vals.length === 0) {
|
|
245
|
+
return values_1.ERRORS.DIV0;
|
|
246
|
+
}
|
|
247
|
+
const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
|
|
248
|
+
let ss = 0;
|
|
249
|
+
for (const v of vals) {
|
|
250
|
+
ss += (v - mean) * (v - mean);
|
|
251
|
+
}
|
|
252
|
+
return (0, values_1.rvNumber)(Math.sqrt(ss / vals.length));
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* DVAR(database, field, criteria) — sample variance of matching numeric
|
|
257
|
+
* cells.
|
|
258
|
+
*/
|
|
259
|
+
function fnDVAR(args) {
|
|
260
|
+
return databaseNumericAggregate(args, vals => {
|
|
261
|
+
if (vals.length < 2) {
|
|
262
|
+
return values_1.ERRORS.DIV0;
|
|
263
|
+
}
|
|
264
|
+
const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
|
|
265
|
+
let ss = 0;
|
|
266
|
+
for (const v of vals) {
|
|
267
|
+
ss += (v - mean) * (v - mean);
|
|
268
|
+
}
|
|
269
|
+
return (0, values_1.rvNumber)(ss / (vals.length - 1));
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* DVARP(database, field, criteria) — population variance of matching
|
|
274
|
+
* numeric cells.
|
|
275
|
+
*/
|
|
276
|
+
function fnDVARP(args) {
|
|
277
|
+
return databaseNumericAggregate(args, vals => {
|
|
278
|
+
if (vals.length === 0) {
|
|
279
|
+
return values_1.ERRORS.DIV0;
|
|
280
|
+
}
|
|
281
|
+
const mean = vals.reduce((a, b) => a + b, 0) / vals.length;
|
|
282
|
+
let ss = 0;
|
|
283
|
+
for (const v of vals) {
|
|
284
|
+
ss += (v - mean) * (v - mean);
|
|
285
|
+
}
|
|
286
|
+
return (0, values_1.rvNumber)(ss / vals.length);
|
|
287
|
+
});
|
|
288
|
+
}
|