@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,881 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic Array Functions — Native RuntimeValue Implementation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fnFILTER = fnFILTER;
|
|
7
|
+
exports.fnSORT = fnSORT;
|
|
8
|
+
exports.fnUNIQUE = fnUNIQUE;
|
|
9
|
+
exports.fnSORTBY = fnSORTBY;
|
|
10
|
+
exports.fnSUBTOTAL = fnSUBTOTAL;
|
|
11
|
+
exports.fnAGGREGATE = fnAGGREGATE;
|
|
12
|
+
exports.fnSEQUENCE = fnSEQUENCE;
|
|
13
|
+
exports.fnRANDARRAY = fnRANDARRAY;
|
|
14
|
+
exports.fnTOCOL = fnTOCOL;
|
|
15
|
+
exports.fnTOROW = fnTOROW;
|
|
16
|
+
exports.fnCHOOSEROWS = fnCHOOSEROWS;
|
|
17
|
+
exports.fnCHOOSECOLS = fnCHOOSECOLS;
|
|
18
|
+
exports.fnVSTACK = fnVSTACK;
|
|
19
|
+
exports.fnHSTACK = fnHSTACK;
|
|
20
|
+
exports.fnTAKE = fnTAKE;
|
|
21
|
+
exports.fnDROP = fnDROP;
|
|
22
|
+
exports.fnWRAPROWS = fnWRAPROWS;
|
|
23
|
+
exports.fnWRAPCOLS = fnWRAPCOLS;
|
|
24
|
+
exports.fnEXPAND = fnEXPAND;
|
|
25
|
+
const values_1 = require("../runtime/values");
|
|
26
|
+
const _shared_1 = require("./_shared");
|
|
27
|
+
const math_1 = require("./math");
|
|
28
|
+
const statistical_1 = require("./statistical");
|
|
29
|
+
function isScalarError(v) {
|
|
30
|
+
return v.kind === 4 /* RVKind.Error */;
|
|
31
|
+
}
|
|
32
|
+
function isScalarBlankOrEmpty(v) {
|
|
33
|
+
return v.kind === 0 /* RVKind.Blank */ || (v.kind === 2 /* RVKind.String */ && v.value === "");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Kind-priority ordering for cross-type sorting.
|
|
37
|
+
*
|
|
38
|
+
* `compareScalarsSameKind` returns `NaN` when the two operands have
|
|
39
|
+
* different kinds, so SORT/SORTBY need a deterministic tiebreak. Excel's
|
|
40
|
+
* workbook-grade sort groups values by kind — Numbers before Strings,
|
|
41
|
+
* Strings before Booleans, Booleans before Blanks/Errors — which is the
|
|
42
|
+
* priority we encode here.
|
|
43
|
+
*/
|
|
44
|
+
function kindPriority(k) {
|
|
45
|
+
switch (k) {
|
|
46
|
+
case 1 /* RVKind.Number */:
|
|
47
|
+
return 0;
|
|
48
|
+
case 2 /* RVKind.String */:
|
|
49
|
+
return 1;
|
|
50
|
+
case 3 /* RVKind.Boolean */:
|
|
51
|
+
return 2;
|
|
52
|
+
case 0 /* RVKind.Blank */:
|
|
53
|
+
return 3;
|
|
54
|
+
case 4 /* RVKind.Error */:
|
|
55
|
+
return 4;
|
|
56
|
+
default:
|
|
57
|
+
return 5;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Locale-independent comparator for SORT / SORTBY.
|
|
62
|
+
*
|
|
63
|
+
* Uses `compareScalarsSameKind` for same-kind ordering (strings compared
|
|
64
|
+
* case-insensitively, not via `localeCompare`, so results are stable
|
|
65
|
+
* across machines) and falls back to `kindPriority` when the operands
|
|
66
|
+
* differ in kind.
|
|
67
|
+
*/
|
|
68
|
+
function compareForSort(a, b) {
|
|
69
|
+
if (a.kind !== b.kind) {
|
|
70
|
+
return kindPriority(a.kind) - kindPriority(b.kind);
|
|
71
|
+
}
|
|
72
|
+
const cmp = (0, values_1.compareScalarsSameKind)(a, b);
|
|
73
|
+
return Number.isNaN(cmp) ? 0 : cmp;
|
|
74
|
+
}
|
|
75
|
+
function fnFILTER(args) {
|
|
76
|
+
const dataArr = (0, _shared_1.asArray)(args[0]);
|
|
77
|
+
const includeArr = (0, _shared_1.asArray)(args[1]);
|
|
78
|
+
if (!dataArr || !includeArr) {
|
|
79
|
+
return values_1.ERRORS.VALUE;
|
|
80
|
+
}
|
|
81
|
+
// Excel requires `include` to be a 1-column vector matching data's
|
|
82
|
+
// height (the common row-filter shape). A mismatched shape previously
|
|
83
|
+
// let rows slip through silently because `getCell` out-of-bounds
|
|
84
|
+
// returns BLANK, which reads as FALSE.
|
|
85
|
+
if (includeArr.width !== 1 || includeArr.height !== dataArr.height) {
|
|
86
|
+
return values_1.ERRORS.VALUE;
|
|
87
|
+
}
|
|
88
|
+
const ifEmpty = args.length > 2 ? (0, values_1.topLeft)(args[2]) : null;
|
|
89
|
+
const resultRows = [];
|
|
90
|
+
for (let r = 0; r < dataArr.height; r++) {
|
|
91
|
+
const inc = (0, _shared_1.getCell)(includeArr, r, 0);
|
|
92
|
+
if (inc.kind === 4 /* RVKind.Error */) {
|
|
93
|
+
return inc;
|
|
94
|
+
}
|
|
95
|
+
if ((inc.kind === 3 /* RVKind.Boolean */ && inc.value) ||
|
|
96
|
+
(inc.kind === 1 /* RVKind.Number */ && inc.value !== 0)) {
|
|
97
|
+
const row = [];
|
|
98
|
+
for (let c = 0; c < dataArr.width; c++) {
|
|
99
|
+
row.push((0, _shared_1.getCell)(dataArr, r, c));
|
|
100
|
+
}
|
|
101
|
+
resultRows.push(row);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (resultRows.length === 0) {
|
|
105
|
+
return ifEmpty !== null ? (0, values_1.rvArray)([[ifEmpty]]) : values_1.ERRORS.CALC;
|
|
106
|
+
}
|
|
107
|
+
return (0, values_1.rvArray)(resultRows);
|
|
108
|
+
}
|
|
109
|
+
function fnSORT(args) {
|
|
110
|
+
const dataArr = (0, _shared_1.asArray)(args[0]);
|
|
111
|
+
if (!dataArr) {
|
|
112
|
+
return values_1.ERRORS.VALUE;
|
|
113
|
+
}
|
|
114
|
+
const rows = [];
|
|
115
|
+
for (let r = 0; r < dataArr.height; r++) {
|
|
116
|
+
const row = [];
|
|
117
|
+
for (let c = 0; c < dataArr.width; c++) {
|
|
118
|
+
row.push((0, _shared_1.getCell)(dataArr, r, c));
|
|
119
|
+
}
|
|
120
|
+
rows.push(row);
|
|
121
|
+
}
|
|
122
|
+
const sortIndexV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(1);
|
|
123
|
+
if ((0, values_1.isError)(sortIndexV)) {
|
|
124
|
+
return sortIndexV;
|
|
125
|
+
}
|
|
126
|
+
const sortOrderV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(1);
|
|
127
|
+
if ((0, values_1.isError)(sortOrderV)) {
|
|
128
|
+
return sortOrderV;
|
|
129
|
+
}
|
|
130
|
+
const byColV = args.length > 3 ? (0, values_1.toBooleanRV)(args[3]) : { kind: 3 /* RVKind.Boolean */, value: false };
|
|
131
|
+
if ((0, values_1.isError)(byColV)) {
|
|
132
|
+
return byColV;
|
|
133
|
+
}
|
|
134
|
+
// Truncate the index so fractional inputs don't silently become NaN
|
|
135
|
+
// when used as array subscripts. Then bounds-check against the axis
|
|
136
|
+
// SORT will actually walk — this turns `SORT(arr, 0)` / out-of-range
|
|
137
|
+
// values into the documented #VALUE! instead of a soft-fail.
|
|
138
|
+
const sortIndex = Math.trunc(sortIndexV.value);
|
|
139
|
+
if (byColV.value) {
|
|
140
|
+
if (sortIndex < 1 || sortIndex > dataArr.height) {
|
|
141
|
+
return values_1.ERRORS.VALUE;
|
|
142
|
+
}
|
|
143
|
+
const colIndices = Array.from({ length: dataArr.width }, (_, i) => i);
|
|
144
|
+
const rowIdx = sortIndex - 1;
|
|
145
|
+
colIndices.sort((a, b) => {
|
|
146
|
+
const va = (0, _shared_1.getCell)(dataArr, rowIdx, a);
|
|
147
|
+
const vb = (0, _shared_1.getCell)(dataArr, rowIdx, b);
|
|
148
|
+
return compareForSort(va, vb) * sortOrderV.value;
|
|
149
|
+
});
|
|
150
|
+
return (0, values_1.rvArray)(rows.map(row => colIndices.map(c => row[c])));
|
|
151
|
+
}
|
|
152
|
+
if (sortIndex < 1 || sortIndex > dataArr.width) {
|
|
153
|
+
return values_1.ERRORS.VALUE;
|
|
154
|
+
}
|
|
155
|
+
const col = sortIndex - 1;
|
|
156
|
+
rows.sort((a, b) => compareForSort(a[col], b[col]) * sortOrderV.value);
|
|
157
|
+
return (0, values_1.rvArray)(rows);
|
|
158
|
+
}
|
|
159
|
+
function fnUNIQUE(args) {
|
|
160
|
+
const dataArr = (0, _shared_1.asArray)(args[0]);
|
|
161
|
+
if (!dataArr) {
|
|
162
|
+
return values_1.ERRORS.VALUE;
|
|
163
|
+
}
|
|
164
|
+
const byColV = args.length > 1 ? (0, values_1.toBooleanRV)(args[1]) : { kind: 3 /* RVKind.Boolean */, value: false };
|
|
165
|
+
if ((0, values_1.isError)(byColV)) {
|
|
166
|
+
return byColV;
|
|
167
|
+
}
|
|
168
|
+
const exactlyOnceV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : { kind: 3 /* RVKind.Boolean */, value: false };
|
|
169
|
+
if ((0, values_1.isError)(exactlyOnceV)) {
|
|
170
|
+
return exactlyOnceV;
|
|
171
|
+
}
|
|
172
|
+
if (byColV.value) {
|
|
173
|
+
const transposed = [];
|
|
174
|
+
for (let c = 0; c < dataArr.width; c++) {
|
|
175
|
+
const col = [];
|
|
176
|
+
for (let r = 0; r < dataArr.height; r++) {
|
|
177
|
+
col.push((0, _shared_1.getCell)(dataArr, r, c));
|
|
178
|
+
}
|
|
179
|
+
transposed.push(col);
|
|
180
|
+
}
|
|
181
|
+
const unique = applyUnique(transposed, exactlyOnceV.value);
|
|
182
|
+
if (unique.length === 0) {
|
|
183
|
+
return values_1.ERRORS.VALUE;
|
|
184
|
+
}
|
|
185
|
+
const numRows = unique[0].length;
|
|
186
|
+
const result = [];
|
|
187
|
+
for (let r = 0; r < numRows; r++) {
|
|
188
|
+
result.push(unique.map(ci => ci[r]));
|
|
189
|
+
}
|
|
190
|
+
return (0, values_1.rvArray)(result);
|
|
191
|
+
}
|
|
192
|
+
const dataRows = [];
|
|
193
|
+
for (let r = 0; r < dataArr.height; r++) {
|
|
194
|
+
const row = [];
|
|
195
|
+
for (let c = 0; c < dataArr.width; c++) {
|
|
196
|
+
row.push((0, _shared_1.getCell)(dataArr, r, c));
|
|
197
|
+
}
|
|
198
|
+
dataRows.push(row);
|
|
199
|
+
}
|
|
200
|
+
const result = applyUnique(dataRows, exactlyOnceV.value);
|
|
201
|
+
return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.VALUE;
|
|
202
|
+
}
|
|
203
|
+
function applyUnique(rows, exactlyOnce) {
|
|
204
|
+
const keyCount = new Map();
|
|
205
|
+
const keyToRows = new Map();
|
|
206
|
+
const order = [];
|
|
207
|
+
for (const row of rows) {
|
|
208
|
+
// Key the row by (kind, textual form) per cell so that UNIQUE preserves
|
|
209
|
+
// Excel's type-aware equality: the number `1` and the string `"1"` are
|
|
210
|
+
// distinct entries. Without the kind prefix they would collide because
|
|
211
|
+
// `toStringRV` renders both as `"1"`.
|
|
212
|
+
const key = row.map(c => `${c.kind}\u0001${scalarUniqueKey(c)}`).join("\u0002");
|
|
213
|
+
if (!keyCount.has(key)) {
|
|
214
|
+
order.push(key);
|
|
215
|
+
keyToRows.set(key, row);
|
|
216
|
+
}
|
|
217
|
+
keyCount.set(key, (keyCount.get(key) ?? 0) + 1);
|
|
218
|
+
}
|
|
219
|
+
const result = [];
|
|
220
|
+
for (const key of order) {
|
|
221
|
+
if (exactlyOnce && (keyCount.get(key) ?? 0) > 1) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
result.push(keyToRows.get(key));
|
|
225
|
+
}
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Produce a string that fully identifies a scalar for equality purposes,
|
|
230
|
+
* distinguishing kinds that stringify identically but must not merge.
|
|
231
|
+
*/
|
|
232
|
+
function scalarUniqueKey(v) {
|
|
233
|
+
if (v.kind === 1 /* RVKind.Number */) {
|
|
234
|
+
// Using `toString` instead of localised formatting keeps NaN/Infinity
|
|
235
|
+
// / -0 distinguishable from `0`, which matters for exact duplication
|
|
236
|
+
// detection.
|
|
237
|
+
return Object.is(v.value, -0) ? "-0" : String(v.value);
|
|
238
|
+
}
|
|
239
|
+
if (v.kind === 3 /* RVKind.Boolean */) {
|
|
240
|
+
return v.value ? "1" : "0";
|
|
241
|
+
}
|
|
242
|
+
if (v.kind === 4 /* RVKind.Error */) {
|
|
243
|
+
return v.code;
|
|
244
|
+
}
|
|
245
|
+
if (v.kind === 0 /* RVKind.Blank */) {
|
|
246
|
+
return "";
|
|
247
|
+
}
|
|
248
|
+
return v.value.toLowerCase();
|
|
249
|
+
}
|
|
250
|
+
function fnSORTBY(args) {
|
|
251
|
+
const dataArr = (0, _shared_1.asArray)(args[0]);
|
|
252
|
+
if (!dataArr || args.length < 2) {
|
|
253
|
+
return values_1.ERRORS.VALUE;
|
|
254
|
+
}
|
|
255
|
+
const data = [];
|
|
256
|
+
for (let r = 0; r < dataArr.height; r++) {
|
|
257
|
+
const row = [];
|
|
258
|
+
for (let c = 0; c < dataArr.width; c++) {
|
|
259
|
+
row.push((0, _shared_1.getCell)(dataArr, r, c));
|
|
260
|
+
}
|
|
261
|
+
data.push({ row, idx: r });
|
|
262
|
+
}
|
|
263
|
+
const sortKeys = [];
|
|
264
|
+
for (let i = 1; i < args.length; i += 2) {
|
|
265
|
+
const keyArr = (0, _shared_1.asArray)(args[i]);
|
|
266
|
+
if (!keyArr) {
|
|
267
|
+
return values_1.ERRORS.VALUE;
|
|
268
|
+
}
|
|
269
|
+
const orderV = i + 1 < args.length ? (0, values_1.toNumberRV)(args[i + 1]) : (0, values_1.rvNumber)(1);
|
|
270
|
+
if ((0, values_1.isError)(orderV)) {
|
|
271
|
+
return orderV;
|
|
272
|
+
}
|
|
273
|
+
sortKeys.push({ arr: keyArr, order: orderV.value });
|
|
274
|
+
}
|
|
275
|
+
data.sort((a, b) => {
|
|
276
|
+
for (const sk of sortKeys) {
|
|
277
|
+
const va = (0, _shared_1.getCell)(sk.arr, a.idx, 0);
|
|
278
|
+
const vb = (0, _shared_1.getCell)(sk.arr, b.idx, 0);
|
|
279
|
+
const cmp = compareForSort(va, vb);
|
|
280
|
+
if (cmp !== 0) {
|
|
281
|
+
return cmp * sk.order;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return 0;
|
|
285
|
+
});
|
|
286
|
+
return (0, values_1.rvArray)(data.map(d => d.row));
|
|
287
|
+
}
|
|
288
|
+
function fnSUBTOTAL(args) {
|
|
289
|
+
const funcNumV = (0, values_1.toNumberRV)(args[0]);
|
|
290
|
+
if ((0, values_1.isError)(funcNumV)) {
|
|
291
|
+
return funcNumV;
|
|
292
|
+
}
|
|
293
|
+
// Excel skips cells whose own formula is SUBTOTAL/AGGREGATE to avoid
|
|
294
|
+
// double-counting when an outer aggregate spans a totals row or another
|
|
295
|
+
// subtotal cell. `buildRangeArray` marks those cells via
|
|
296
|
+
// `subtotalMask`; we strip them here before handing off to the
|
|
297
|
+
// underlying aggregator.
|
|
298
|
+
let dataArgs = (0, _shared_1.stripSubtotalMaskedCells)(args.slice(1));
|
|
299
|
+
// Truncate toward zero: Excel rejects non-integer function codes, so
|
|
300
|
+
// `SUBTOTAL(9.5, …)` should behave as `SUBTOTAL(9, …)` rather than
|
|
301
|
+
// slipping through the switch and returning #VALUE!. (R6-P1-9)
|
|
302
|
+
const rawFn = Math.trunc(funcNumV.value);
|
|
303
|
+
const fn = rawFn > 100 ? rawFn - 100 : rawFn;
|
|
304
|
+
// The 1xx variants (101-111) additionally skip hidden rows. Excel's
|
|
305
|
+
// plain 1-11 codes only skip filter-hidden rows — but our worksheet
|
|
306
|
+
// model carries a single `row.hidden` boolean that conflates the two
|
|
307
|
+
// states, so we apply hidden-row stripping only to the 1xx variants
|
|
308
|
+
// (matching manual-hide semantics; filter-hide remains a limitation
|
|
309
|
+
// at the adapter layer, not here).
|
|
310
|
+
if (rawFn > 100) {
|
|
311
|
+
dataArgs = (0, _shared_1.stripHiddenRowCells)(dataArgs);
|
|
312
|
+
}
|
|
313
|
+
switch (fn) {
|
|
314
|
+
case 1:
|
|
315
|
+
return (0, math_1.fnAVERAGE)(dataArgs);
|
|
316
|
+
case 2:
|
|
317
|
+
return (0, math_1.fnCOUNT)(dataArgs);
|
|
318
|
+
case 3:
|
|
319
|
+
return (0, math_1.fnCOUNTA)(dataArgs);
|
|
320
|
+
case 4:
|
|
321
|
+
return (0, math_1.fnMAX)(dataArgs);
|
|
322
|
+
case 5:
|
|
323
|
+
return (0, math_1.fnMIN)(dataArgs);
|
|
324
|
+
case 6:
|
|
325
|
+
return (0, math_1.fnPRODUCT)(dataArgs);
|
|
326
|
+
case 7:
|
|
327
|
+
return (0, statistical_1.fnSTDEV)(dataArgs);
|
|
328
|
+
case 8:
|
|
329
|
+
return (0, statistical_1.fnSTDEVP)(dataArgs);
|
|
330
|
+
case 9:
|
|
331
|
+
return (0, math_1.fnSUM)(dataArgs);
|
|
332
|
+
case 10:
|
|
333
|
+
return (0, statistical_1.fnVAR)(dataArgs);
|
|
334
|
+
case 11:
|
|
335
|
+
return (0, statistical_1.fnVARP)(dataArgs);
|
|
336
|
+
default:
|
|
337
|
+
return values_1.ERRORS.VALUE;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
function fnAGGREGATE(args) {
|
|
341
|
+
const funcNumV = (0, values_1.toNumberRV)(args[0]);
|
|
342
|
+
if ((0, values_1.isError)(funcNumV)) {
|
|
343
|
+
return funcNumV;
|
|
344
|
+
}
|
|
345
|
+
// Resolve the "options" parameter (arg[1]). Excel's option codes
|
|
346
|
+
// (0–7) control which cells to skip:
|
|
347
|
+
// 0 or omitted → ignore nested SUBTOTAL/AGGREGATE
|
|
348
|
+
// 1 → ignore hidden rows + nested
|
|
349
|
+
// 2 → ignore errors + nested
|
|
350
|
+
// 3 → ignore hidden rows + errors + nested
|
|
351
|
+
// 4 → ignore nothing
|
|
352
|
+
// 5 → ignore hidden rows (keep nested)
|
|
353
|
+
// 6 → ignore errors (keep nested)
|
|
354
|
+
// 7 → ignore hidden rows + errors (keep nested)
|
|
355
|
+
const optV = args[1] !== undefined ? (0, values_1.toNumberRV)(args[1]) : undefined;
|
|
356
|
+
if (optV && (0, values_1.isError)(optV)) {
|
|
357
|
+
return optV;
|
|
358
|
+
}
|
|
359
|
+
const option = optV ? Math.trunc(optV.value) : 0;
|
|
360
|
+
const skipNested = option <= 3; // 0,1,2,3 skip nested SUBTOTAL/AGGREGATE
|
|
361
|
+
const skipHidden = option === 1 || option === 3 || option === 5 || option === 7;
|
|
362
|
+
const skipErrors = option === 2 || option === 3 || option === 6 || option === 7;
|
|
363
|
+
let dataArgs = args.slice(2);
|
|
364
|
+
if (skipNested) {
|
|
365
|
+
dataArgs = (0, _shared_1.stripSubtotalMaskedCells)(dataArgs);
|
|
366
|
+
}
|
|
367
|
+
if (skipHidden) {
|
|
368
|
+
dataArgs = (0, _shared_1.stripHiddenRowCells)(dataArgs);
|
|
369
|
+
}
|
|
370
|
+
if (skipErrors) {
|
|
371
|
+
dataArgs = (0, _shared_1.stripErrorCells)(dataArgs);
|
|
372
|
+
}
|
|
373
|
+
// Excel rejects non-integer function codes; truncate toward zero
|
|
374
|
+
// so AGGREGATE(9.5, …) behaves as AGGREGATE(9, …), matching SUBTOTAL.
|
|
375
|
+
const fnCode = Math.trunc(funcNumV.value);
|
|
376
|
+
switch (fnCode) {
|
|
377
|
+
case 1:
|
|
378
|
+
return (0, math_1.fnAVERAGE)(dataArgs);
|
|
379
|
+
case 2:
|
|
380
|
+
return (0, math_1.fnCOUNT)(dataArgs);
|
|
381
|
+
case 3:
|
|
382
|
+
return (0, math_1.fnCOUNTA)(dataArgs);
|
|
383
|
+
case 4:
|
|
384
|
+
return (0, math_1.fnMAX)(dataArgs);
|
|
385
|
+
case 5:
|
|
386
|
+
return (0, math_1.fnMIN)(dataArgs);
|
|
387
|
+
case 6:
|
|
388
|
+
return (0, math_1.fnPRODUCT)(dataArgs);
|
|
389
|
+
case 7:
|
|
390
|
+
return (0, statistical_1.fnSTDEV)(dataArgs);
|
|
391
|
+
case 8:
|
|
392
|
+
return (0, statistical_1.fnSTDEVP)(dataArgs);
|
|
393
|
+
case 9:
|
|
394
|
+
return (0, math_1.fnSUM)(dataArgs);
|
|
395
|
+
case 10:
|
|
396
|
+
return (0, statistical_1.fnVAR)(dataArgs);
|
|
397
|
+
case 11:
|
|
398
|
+
return (0, statistical_1.fnVARP)(dataArgs);
|
|
399
|
+
case 12:
|
|
400
|
+
return (0, statistical_1.fnMEDIAN)(dataArgs);
|
|
401
|
+
case 13:
|
|
402
|
+
return (0, statistical_1.fnMODE)(dataArgs);
|
|
403
|
+
case 14:
|
|
404
|
+
return (0, statistical_1.fnLARGE)(dataArgs);
|
|
405
|
+
case 15:
|
|
406
|
+
return (0, statistical_1.fnSMALL)(dataArgs);
|
|
407
|
+
case 16:
|
|
408
|
+
return (0, statistical_1.fnPERCENTILE)(dataArgs);
|
|
409
|
+
case 17:
|
|
410
|
+
return (0, statistical_1.fnQUARTILE)(dataArgs);
|
|
411
|
+
case 18:
|
|
412
|
+
return (0, statistical_1.fnPERCENTILEEXC)(dataArgs);
|
|
413
|
+
case 19:
|
|
414
|
+
return (0, statistical_1.fnQUARTILEEXC)(dataArgs);
|
|
415
|
+
default:
|
|
416
|
+
return values_1.ERRORS.VALUE;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
function fnSEQUENCE(args) {
|
|
420
|
+
const rowsV = (0, values_1.toNumberRV)(args[0]);
|
|
421
|
+
if ((0, values_1.isError)(rowsV)) {
|
|
422
|
+
return rowsV;
|
|
423
|
+
}
|
|
424
|
+
const colsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(1);
|
|
425
|
+
if ((0, values_1.isError)(colsV)) {
|
|
426
|
+
return colsV;
|
|
427
|
+
}
|
|
428
|
+
const startV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(1);
|
|
429
|
+
if ((0, values_1.isError)(startV)) {
|
|
430
|
+
return startV;
|
|
431
|
+
}
|
|
432
|
+
const stepV = args.length > 3 ? (0, values_1.toNumberRV)(args[3]) : (0, values_1.rvNumber)(1);
|
|
433
|
+
if ((0, values_1.isError)(stepV)) {
|
|
434
|
+
return stepV;
|
|
435
|
+
}
|
|
436
|
+
// Excel truncates row/col counts toward zero and rejects anything
|
|
437
|
+
// below 1. Without this guard `SEQUENCE(-3)` would produce an empty
|
|
438
|
+
// ArrayValue which breaks downstream rectangularisation, and
|
|
439
|
+
// `SEQUENCE(2.5, 2)` would generate 3 rows instead of Excel's 2.
|
|
440
|
+
const rowCount = Math.trunc(rowsV.value);
|
|
441
|
+
const colCount = Math.trunc(colsV.value);
|
|
442
|
+
if (!Number.isFinite(rowCount) || !Number.isFinite(colCount) || rowCount < 1 || colCount < 1) {
|
|
443
|
+
return values_1.ERRORS.NUM;
|
|
444
|
+
}
|
|
445
|
+
// Bound the output to the same 10M-cell budget the rest of the array
|
|
446
|
+
// pipeline uses. SEQUENCE(1e9, 1e9) would otherwise try to allocate
|
|
447
|
+
// 1e18 scalars before OOM-ing (R6-P1-4).
|
|
448
|
+
if (rowCount * colCount > 10000000) {
|
|
449
|
+
return values_1.ERRORS.NUM;
|
|
450
|
+
}
|
|
451
|
+
const result = [];
|
|
452
|
+
let val = startV.value;
|
|
453
|
+
for (let r = 0; r < rowCount; r++) {
|
|
454
|
+
const row = [];
|
|
455
|
+
for (let c = 0; c < colCount; c++) {
|
|
456
|
+
row.push((0, values_1.rvNumber)(val));
|
|
457
|
+
val += stepV.value;
|
|
458
|
+
}
|
|
459
|
+
result.push(row);
|
|
460
|
+
}
|
|
461
|
+
return (0, values_1.rvArray)(result);
|
|
462
|
+
}
|
|
463
|
+
function fnRANDARRAY(args) {
|
|
464
|
+
const rowsV = args.length > 0 ? (0, values_1.toNumberRV)(args[0]) : (0, values_1.rvNumber)(1);
|
|
465
|
+
if ((0, values_1.isError)(rowsV)) {
|
|
466
|
+
return rowsV;
|
|
467
|
+
}
|
|
468
|
+
const colsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(1);
|
|
469
|
+
if ((0, values_1.isError)(colsV)) {
|
|
470
|
+
return colsV;
|
|
471
|
+
}
|
|
472
|
+
const minV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(0);
|
|
473
|
+
if ((0, values_1.isError)(minV)) {
|
|
474
|
+
return minV;
|
|
475
|
+
}
|
|
476
|
+
const maxV = args.length > 3 ? (0, values_1.toNumberRV)(args[3]) : (0, values_1.rvNumber)(1);
|
|
477
|
+
if ((0, values_1.isError)(maxV)) {
|
|
478
|
+
return maxV;
|
|
479
|
+
}
|
|
480
|
+
const wholeV = args.length > 4 ? (0, values_1.toBooleanRV)(args[4]) : { kind: 3 /* RVKind.Boolean */, value: false };
|
|
481
|
+
if ((0, values_1.isError)(wholeV)) {
|
|
482
|
+
return wholeV;
|
|
483
|
+
}
|
|
484
|
+
const rowCount = Math.trunc(rowsV.value);
|
|
485
|
+
const colCount = Math.trunc(colsV.value);
|
|
486
|
+
// Excel rejects rows/cols < 1 and min > max with #VALUE!, and when the
|
|
487
|
+
// `whole` flag is TRUE it additionally requires integer min/max.
|
|
488
|
+
if (!Number.isFinite(rowCount) ||
|
|
489
|
+
!Number.isFinite(colCount) ||
|
|
490
|
+
rowCount < 1 ||
|
|
491
|
+
colCount < 1 ||
|
|
492
|
+
minV.value > maxV.value) {
|
|
493
|
+
return values_1.ERRORS.VALUE;
|
|
494
|
+
}
|
|
495
|
+
if (wholeV.value && (!Number.isInteger(minV.value) || !Number.isInteger(maxV.value))) {
|
|
496
|
+
return values_1.ERRORS.VALUE;
|
|
497
|
+
}
|
|
498
|
+
// Same 10M-cell budget as SEQUENCE / MAKEARRAY / broadcastBinaryOp —
|
|
499
|
+
// otherwise `RANDARRAY(1e6, 1e6)` OOMs the host. (R6-P1-4)
|
|
500
|
+
if (rowCount * colCount > 10000000) {
|
|
501
|
+
return values_1.ERRORS.NUM;
|
|
502
|
+
}
|
|
503
|
+
const result = [];
|
|
504
|
+
for (let r = 0; r < rowCount; r++) {
|
|
505
|
+
const row = [];
|
|
506
|
+
for (let c = 0; c < colCount; c++) {
|
|
507
|
+
if (wholeV.value) {
|
|
508
|
+
// Draw a uniform integer in [min, max] inclusive. The old code
|
|
509
|
+
// did `Math.floor(min + random() * (max - min))` which excluded
|
|
510
|
+
// `max` almost always.
|
|
511
|
+
const span = maxV.value - minV.value + 1;
|
|
512
|
+
row.push((0, values_1.rvNumber)(minV.value + Math.floor(Math.random() * span)));
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
row.push((0, values_1.rvNumber)(minV.value + Math.random() * (maxV.value - minV.value)));
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
result.push(row);
|
|
519
|
+
}
|
|
520
|
+
return (0, values_1.rvArray)(result);
|
|
521
|
+
}
|
|
522
|
+
function fnTOCOL(args) {
|
|
523
|
+
if (!(0, values_1.isArray)(args[0])) {
|
|
524
|
+
return (0, values_1.rvArray)([[(0, values_1.topLeft)(args[0])]]);
|
|
525
|
+
}
|
|
526
|
+
const arr = args[0];
|
|
527
|
+
const ignoreV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(0);
|
|
528
|
+
if ((0, values_1.isError)(ignoreV)) {
|
|
529
|
+
return ignoreV;
|
|
530
|
+
}
|
|
531
|
+
const scanV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : { kind: 3 /* RVKind.Boolean */, value: false };
|
|
532
|
+
if ((0, values_1.isError)(scanV)) {
|
|
533
|
+
return scanV;
|
|
534
|
+
}
|
|
535
|
+
const result = [];
|
|
536
|
+
const addCell = (v) => {
|
|
537
|
+
if (ignoreV.value === 1 && isScalarBlankOrEmpty(v)) {
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
if (ignoreV.value === 2 && isScalarError(v)) {
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (ignoreV.value === 3 && (isScalarBlankOrEmpty(v) || isScalarError(v))) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
result.push([v]);
|
|
547
|
+
};
|
|
548
|
+
if (scanV.value) {
|
|
549
|
+
for (let c = 0; c < arr.width; c++) {
|
|
550
|
+
for (let r = 0; r < arr.height; r++) {
|
|
551
|
+
addCell((0, _shared_1.getCell)(arr, r, c));
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
for (let r = 0; r < arr.height; r++) {
|
|
557
|
+
for (let c = 0; c < arr.width; c++) {
|
|
558
|
+
addCell((0, _shared_1.getCell)(arr, r, c));
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.CALC;
|
|
563
|
+
}
|
|
564
|
+
function fnTOROW(args) {
|
|
565
|
+
if (!(0, values_1.isArray)(args[0])) {
|
|
566
|
+
return (0, values_1.rvArray)([[(0, values_1.topLeft)(args[0])]]);
|
|
567
|
+
}
|
|
568
|
+
const arr = args[0];
|
|
569
|
+
const ignoreV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(0);
|
|
570
|
+
if ((0, values_1.isError)(ignoreV)) {
|
|
571
|
+
return ignoreV;
|
|
572
|
+
}
|
|
573
|
+
const scanV = args.length > 2 ? (0, values_1.toBooleanRV)(args[2]) : { kind: 3 /* RVKind.Boolean */, value: false };
|
|
574
|
+
if ((0, values_1.isError)(scanV)) {
|
|
575
|
+
return scanV;
|
|
576
|
+
}
|
|
577
|
+
const result = [];
|
|
578
|
+
const addCell = (v) => {
|
|
579
|
+
if (ignoreV.value === 1 && isScalarBlankOrEmpty(v)) {
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
if (ignoreV.value === 2 && isScalarError(v)) {
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
if (ignoreV.value === 3 && (isScalarBlankOrEmpty(v) || isScalarError(v))) {
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
result.push(v);
|
|
589
|
+
};
|
|
590
|
+
if (scanV.value) {
|
|
591
|
+
for (let c = 0; c < arr.width; c++) {
|
|
592
|
+
for (let r = 0; r < arr.height; r++) {
|
|
593
|
+
addCell((0, _shared_1.getCell)(arr, r, c));
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
for (let r = 0; r < arr.height; r++) {
|
|
599
|
+
for (let c = 0; c < arr.width; c++) {
|
|
600
|
+
addCell((0, _shared_1.getCell)(arr, r, c));
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
return result.length > 0 ? (0, values_1.rvArray)([result]) : values_1.ERRORS.CALC;
|
|
605
|
+
}
|
|
606
|
+
function fnCHOOSEROWS(args) {
|
|
607
|
+
const d = (0, _shared_1.asArray)(args[0]);
|
|
608
|
+
if (!d) {
|
|
609
|
+
return values_1.ERRORS.VALUE;
|
|
610
|
+
}
|
|
611
|
+
const result = [];
|
|
612
|
+
for (let i = 1; i < args.length; i++) {
|
|
613
|
+
const nV = (0, values_1.toNumberRV)(args[i]);
|
|
614
|
+
if ((0, values_1.isError)(nV)) {
|
|
615
|
+
return nV;
|
|
616
|
+
}
|
|
617
|
+
const idx = nV.value > 0 ? nV.value - 1 : d.height + nV.value;
|
|
618
|
+
if (idx < 0 || idx >= d.height) {
|
|
619
|
+
return values_1.ERRORS.VALUE;
|
|
620
|
+
}
|
|
621
|
+
const row = [];
|
|
622
|
+
for (let c = 0; c < d.width; c++) {
|
|
623
|
+
row.push((0, _shared_1.getCell)(d, idx, c));
|
|
624
|
+
}
|
|
625
|
+
result.push(row);
|
|
626
|
+
}
|
|
627
|
+
return (0, values_1.rvArray)(result);
|
|
628
|
+
}
|
|
629
|
+
function fnCHOOSECOLS(args) {
|
|
630
|
+
const d = (0, _shared_1.asArray)(args[0]);
|
|
631
|
+
if (!d) {
|
|
632
|
+
return values_1.ERRORS.VALUE;
|
|
633
|
+
}
|
|
634
|
+
const ci = [];
|
|
635
|
+
for (let i = 1; i < args.length; i++) {
|
|
636
|
+
const nV = (0, values_1.toNumberRV)(args[i]);
|
|
637
|
+
if ((0, values_1.isError)(nV)) {
|
|
638
|
+
return nV;
|
|
639
|
+
}
|
|
640
|
+
const idx = nV.value > 0 ? nV.value - 1 : d.width + nV.value;
|
|
641
|
+
if (idx < 0 || idx >= d.width) {
|
|
642
|
+
return values_1.ERRORS.VALUE;
|
|
643
|
+
}
|
|
644
|
+
ci.push(idx);
|
|
645
|
+
}
|
|
646
|
+
const result = [];
|
|
647
|
+
for (let r = 0; r < d.height; r++) {
|
|
648
|
+
result.push(ci.map(c => (0, _shared_1.getCell)(d, r, c)));
|
|
649
|
+
}
|
|
650
|
+
return (0, values_1.rvArray)(result);
|
|
651
|
+
}
|
|
652
|
+
function fnVSTACK(args) {
|
|
653
|
+
const rows = [];
|
|
654
|
+
let maxWidth = 0;
|
|
655
|
+
for (const a of args) {
|
|
656
|
+
if (a.kind === 5 /* RVKind.Array */) {
|
|
657
|
+
for (let r = 0; r < a.height; r++) {
|
|
658
|
+
const row = [];
|
|
659
|
+
for (let c = 0; c < a.width; c++) {
|
|
660
|
+
row.push(a.rows[r][c]);
|
|
661
|
+
}
|
|
662
|
+
rows.push(row);
|
|
663
|
+
if (a.width > maxWidth) {
|
|
664
|
+
maxWidth = a.width;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
else {
|
|
669
|
+
rows.push([(0, values_1.topLeft)(a)]);
|
|
670
|
+
if (maxWidth < 1) {
|
|
671
|
+
maxWidth = 1;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
if (rows.length === 0) {
|
|
676
|
+
return values_1.ERRORS.VALUE;
|
|
677
|
+
}
|
|
678
|
+
// Pad with #N/A (not BLANK) to match Excel, and to stay symmetric with
|
|
679
|
+
// HSTACK's existing behaviour. The previous code left short rows to be
|
|
680
|
+
// rectangularised by `rvArray`, which used BLANK — visually wrong and
|
|
681
|
+
// inconsistent with how HSTACK reports "missing" cells.
|
|
682
|
+
for (const row of rows) {
|
|
683
|
+
while (row.length < maxWidth) {
|
|
684
|
+
row.push(values_1.ERRORS.NA);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
return (0, values_1.rvArray)(rows);
|
|
688
|
+
}
|
|
689
|
+
function fnHSTACK(args) {
|
|
690
|
+
let maxRows = 0;
|
|
691
|
+
const arrays = [];
|
|
692
|
+
for (const a of args) {
|
|
693
|
+
if (a.kind === 5 /* RVKind.Array */) {
|
|
694
|
+
arrays.push(a);
|
|
695
|
+
if (a.height > maxRows) {
|
|
696
|
+
maxRows = a.height;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
arrays.push((0, values_1.rvArray)([[(0, values_1.topLeft)(a)]]));
|
|
701
|
+
if (maxRows < 1) {
|
|
702
|
+
maxRows = 1;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
const result = [];
|
|
707
|
+
for (let r = 0; r < maxRows; r++) {
|
|
708
|
+
const row = [];
|
|
709
|
+
for (const arr of arrays) {
|
|
710
|
+
if (r < arr.height) {
|
|
711
|
+
for (let c = 0; c < arr.width; c++) {
|
|
712
|
+
row.push(arr.rows[r][c]);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
for (let c = 0; c < arr.width; c++) {
|
|
717
|
+
row.push(values_1.ERRORS.NA);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
result.push(row);
|
|
722
|
+
}
|
|
723
|
+
return (0, values_1.rvArray)(result);
|
|
724
|
+
}
|
|
725
|
+
function fnTAKE(args) {
|
|
726
|
+
const d = (0, _shared_1.asArray)(args[0]);
|
|
727
|
+
if (!d) {
|
|
728
|
+
return values_1.ERRORS.VALUE;
|
|
729
|
+
}
|
|
730
|
+
const rowsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(d.height);
|
|
731
|
+
if ((0, values_1.isError)(rowsV)) {
|
|
732
|
+
return rowsV;
|
|
733
|
+
}
|
|
734
|
+
const colsV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(d.width);
|
|
735
|
+
if ((0, values_1.isError)(colsV)) {
|
|
736
|
+
return colsV;
|
|
737
|
+
}
|
|
738
|
+
const rS = rowsV.value >= 0 ? 0 : Math.max(0, d.height + rowsV.value);
|
|
739
|
+
const rE = rowsV.value >= 0 ? Math.min(rowsV.value, d.height) : d.height;
|
|
740
|
+
const cS = colsV.value >= 0 ? 0 : Math.max(0, d.width + colsV.value);
|
|
741
|
+
const cE = colsV.value >= 0 ? Math.min(colsV.value, d.width) : d.width;
|
|
742
|
+
const result = [];
|
|
743
|
+
for (let r = rS; r < rE; r++) {
|
|
744
|
+
const row = [];
|
|
745
|
+
for (let c = cS; c < cE; c++) {
|
|
746
|
+
row.push((0, _shared_1.getCell)(d, r, c));
|
|
747
|
+
}
|
|
748
|
+
result.push(row);
|
|
749
|
+
}
|
|
750
|
+
return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.CALC;
|
|
751
|
+
}
|
|
752
|
+
function fnDROP(args) {
|
|
753
|
+
const d = (0, _shared_1.asArray)(args[0]);
|
|
754
|
+
if (!d) {
|
|
755
|
+
return values_1.ERRORS.VALUE;
|
|
756
|
+
}
|
|
757
|
+
const rowsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(0);
|
|
758
|
+
if ((0, values_1.isError)(rowsV)) {
|
|
759
|
+
return rowsV;
|
|
760
|
+
}
|
|
761
|
+
const colsV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(0);
|
|
762
|
+
if ((0, values_1.isError)(colsV)) {
|
|
763
|
+
return colsV;
|
|
764
|
+
}
|
|
765
|
+
const rS = rowsV.value >= 0 ? rowsV.value : 0;
|
|
766
|
+
const rE = rowsV.value >= 0 ? d.height : d.height + rowsV.value;
|
|
767
|
+
const cS = colsV.value >= 0 ? colsV.value : 0;
|
|
768
|
+
const cE = colsV.value >= 0 ? d.width : d.width + colsV.value;
|
|
769
|
+
const result = [];
|
|
770
|
+
for (let r = rS; r < rE; r++) {
|
|
771
|
+
const row = [];
|
|
772
|
+
for (let c = cS; c < cE; c++) {
|
|
773
|
+
row.push((0, _shared_1.getCell)(d, r, c));
|
|
774
|
+
}
|
|
775
|
+
if (row.length > 0) {
|
|
776
|
+
result.push(row);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
return result.length > 0 ? (0, values_1.rvArray)(result) : values_1.ERRORS.CALC;
|
|
780
|
+
}
|
|
781
|
+
function fnWRAPROWS(args) {
|
|
782
|
+
if (!(0, values_1.isArray)(args[0])) {
|
|
783
|
+
return values_1.ERRORS.VALUE;
|
|
784
|
+
}
|
|
785
|
+
const arr = args[0];
|
|
786
|
+
const flat = [];
|
|
787
|
+
for (let r = 0; r < arr.height; r++) {
|
|
788
|
+
for (let c = 0; c < arr.width; c++) {
|
|
789
|
+
flat.push((0, _shared_1.getCell)(arr, r, c));
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
const wcV = (0, values_1.toNumberRV)(args[1]);
|
|
793
|
+
if ((0, values_1.isError)(wcV)) {
|
|
794
|
+
return wcV;
|
|
795
|
+
}
|
|
796
|
+
if (wcV.value < 1) {
|
|
797
|
+
return values_1.ERRORS.VALUE;
|
|
798
|
+
}
|
|
799
|
+
const pad = args.length > 2 ? (0, values_1.topLeft)(args[2]) : values_1.ERRORS.NA;
|
|
800
|
+
const result = [];
|
|
801
|
+
for (let i = 0; i < flat.length; i += wcV.value) {
|
|
802
|
+
const row = flat.slice(i, i + wcV.value);
|
|
803
|
+
while (row.length < wcV.value) {
|
|
804
|
+
row.push(pad);
|
|
805
|
+
}
|
|
806
|
+
result.push(row);
|
|
807
|
+
}
|
|
808
|
+
return (0, values_1.rvArray)(result);
|
|
809
|
+
}
|
|
810
|
+
function fnWRAPCOLS(args) {
|
|
811
|
+
if (!(0, values_1.isArray)(args[0])) {
|
|
812
|
+
return values_1.ERRORS.VALUE;
|
|
813
|
+
}
|
|
814
|
+
const arr = args[0];
|
|
815
|
+
const flat = [];
|
|
816
|
+
for (let r = 0; r < arr.height; r++) {
|
|
817
|
+
for (let c = 0; c < arr.width; c++) {
|
|
818
|
+
flat.push((0, _shared_1.getCell)(arr, r, c));
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
const wcV = (0, values_1.toNumberRV)(args[1]);
|
|
822
|
+
if ((0, values_1.isError)(wcV)) {
|
|
823
|
+
return wcV;
|
|
824
|
+
}
|
|
825
|
+
if (wcV.value < 1) {
|
|
826
|
+
return values_1.ERRORS.VALUE;
|
|
827
|
+
}
|
|
828
|
+
const pad = args.length > 2 ? (0, values_1.topLeft)(args[2]) : values_1.ERRORS.NA;
|
|
829
|
+
const numCols = Math.ceil(flat.length / wcV.value);
|
|
830
|
+
const result = [];
|
|
831
|
+
for (let r = 0; r < wcV.value; r++) {
|
|
832
|
+
const row = [];
|
|
833
|
+
for (let c = 0; c < numCols; c++) {
|
|
834
|
+
const idx = c * wcV.value + r;
|
|
835
|
+
row.push(idx < flat.length ? flat[idx] : pad);
|
|
836
|
+
}
|
|
837
|
+
result.push(row);
|
|
838
|
+
}
|
|
839
|
+
return (0, values_1.rvArray)(result);
|
|
840
|
+
}
|
|
841
|
+
function fnEXPAND(args) {
|
|
842
|
+
const d = (0, _shared_1.asArray)(args[0]);
|
|
843
|
+
if (!d) {
|
|
844
|
+
return values_1.ERRORS.VALUE;
|
|
845
|
+
}
|
|
846
|
+
const rowsV = args.length > 1 ? (0, values_1.toNumberRV)(args[1]) : (0, values_1.rvNumber)(d.height);
|
|
847
|
+
if ((0, values_1.isError)(rowsV)) {
|
|
848
|
+
return rowsV;
|
|
849
|
+
}
|
|
850
|
+
const colsV = args.length > 2 ? (0, values_1.toNumberRV)(args[2]) : (0, values_1.rvNumber)(d.width);
|
|
851
|
+
if ((0, values_1.isError)(colsV)) {
|
|
852
|
+
return colsV;
|
|
853
|
+
}
|
|
854
|
+
// Excel requires the target to be at least as large as the source, and
|
|
855
|
+
// both dimensions to be positive. Without Math.trunc the inner loop
|
|
856
|
+
// runs `c < rowsV.value` comparisons against a float, which produces
|
|
857
|
+
// an off-by-one depending on the fractional part (R6-P1-5).
|
|
858
|
+
const rowCount = Math.trunc(rowsV.value);
|
|
859
|
+
const colCount = Math.trunc(colsV.value);
|
|
860
|
+
if (!Number.isFinite(rowCount) ||
|
|
861
|
+
!Number.isFinite(colCount) ||
|
|
862
|
+
rowCount < d.height ||
|
|
863
|
+
colCount < d.width) {
|
|
864
|
+
return values_1.ERRORS.VALUE;
|
|
865
|
+
}
|
|
866
|
+
// Cap the output size to the same 10M-cell budget the other dynamic
|
|
867
|
+
// array producers use (see MAKEARRAY, broadcastBinaryOp).
|
|
868
|
+
if (rowCount * colCount > 10000000) {
|
|
869
|
+
return values_1.ERRORS.NUM;
|
|
870
|
+
}
|
|
871
|
+
const pad = args.length > 3 ? (0, values_1.topLeft)(args[3]) : values_1.ERRORS.NA;
|
|
872
|
+
const result = [];
|
|
873
|
+
for (let r = 0; r < rowCount; r++) {
|
|
874
|
+
const row = [];
|
|
875
|
+
for (let c = 0; c < colCount; c++) {
|
|
876
|
+
row.push(r < d.height && c < d.width ? (0, _shared_1.getCell)(d, r, c) : pad);
|
|
877
|
+
}
|
|
878
|
+
result.push(row);
|
|
879
|
+
}
|
|
880
|
+
return (0, values_1.rvArray)(result);
|
|
881
|
+
}
|