@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,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formula Engine Registry
|
|
3
|
+
*
|
|
4
|
+
* A tiny indirection layer that lets `Workbook.calculateFormulas()` and
|
|
5
|
+
* the PDF bridge invoke a full formula engine **only if the host
|
|
6
|
+
* application has opted in** by calling `installFormulaEngine()` from
|
|
7
|
+
* `@cj-tech-master/excelts/formula`.
|
|
8
|
+
*
|
|
9
|
+
* ## Why a registry
|
|
10
|
+
*
|
|
11
|
+
* The formula engine ships 433 Excel functions, a tokenizer, a parser,
|
|
12
|
+
* a compiler, an evaluator, a dependency graph and a spill materialiser.
|
|
13
|
+
* Minified this is ~200 KB. Most Workbook users only need to read /
|
|
14
|
+
* write XLSX files and let Excel recalculate on open; pulling the
|
|
15
|
+
* engine into their bundle unconditionally would be a large, invisible
|
|
16
|
+
* cost.
|
|
17
|
+
*
|
|
18
|
+
* This file is the single point of indirection. Importing `Workbook`
|
|
19
|
+
* pulls it in (~2.5 KB) but does NOT pull in the engine; the engine's
|
|
20
|
+
* implementation only arrives once someone calls `installFormulaEngine()`,
|
|
21
|
+
* which bundlers can then resolve to the subpath import graph.
|
|
22
|
+
*
|
|
23
|
+
* If `calculateFormulas()` is called without `installFormulaEngine()`
|
|
24
|
+
* having run, a clear error is thrown telling the developer how to fix it.
|
|
25
|
+
*/
|
|
26
|
+
let installed = null;
|
|
27
|
+
/**
|
|
28
|
+
* Install a formula engine implementation. Called from
|
|
29
|
+
* `installFormulaEngine()` in the `@cj-tech-master/excelts/formula`
|
|
30
|
+
* subpath.
|
|
31
|
+
*
|
|
32
|
+
* Re-installing is allowed — the last registration wins. This keeps
|
|
33
|
+
* hot-reload tooling and tests simple. Passing `null` uninstalls the
|
|
34
|
+
* engine, which is useful for tests that exercise the
|
|
35
|
+
* "no engine" error path.
|
|
36
|
+
*/
|
|
37
|
+
export function registerFormulaEngine(engine) {
|
|
38
|
+
installed = engine;
|
|
39
|
+
}
|
|
40
|
+
/** Returns true when a formula engine has been installed. */
|
|
41
|
+
export function hasFormulaEngine() {
|
|
42
|
+
return installed !== null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Invoke the registered engine on `workbook`. Throws a descriptive error
|
|
46
|
+
* if no engine has been installed.
|
|
47
|
+
*/
|
|
48
|
+
export function invokeFormulaEngine(workbook) {
|
|
49
|
+
if (!installed) {
|
|
50
|
+
throw new Error("No formula engine is installed. " +
|
|
51
|
+
"Call `installFormulaEngine()` from `@cj-tech-master/excelts/formula` " +
|
|
52
|
+
"once at startup to enable `Workbook.calculateFormulas()` and " +
|
|
53
|
+
"automatic recalculation during `excelToPdf()`.");
|
|
54
|
+
}
|
|
55
|
+
installed(workbook);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Like {@link invokeFormulaEngine} but returns silently when no engine is
|
|
59
|
+
* installed. Used by `excelToPdf()` so that PDF export still works for
|
|
60
|
+
* workbooks whose cached formula results are already up to date (the
|
|
61
|
+
* common case when the XLSX was saved by Excel itself).
|
|
62
|
+
*/
|
|
63
|
+
export function tryInvokeFormulaEngine(workbook) {
|
|
64
|
+
if (!installed) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
installed(workbook);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry for the excelts formula engine.
|
|
3
|
+
*
|
|
4
|
+
* Two complementary usage styles are supported:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Functional, zero-side-effect**:
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { calculateFormulas } from "@cj-tech-master/excelts/formula";
|
|
9
|
+
* calculateFormulas(workbook);
|
|
10
|
+
* ```
|
|
11
|
+
* Perfect tree-shaking: unused exports are dropped, no module
|
|
12
|
+
* initialisation runs. Bundles that import only `tokenize` or
|
|
13
|
+
* `parse` never pull the evaluator or function registry in.
|
|
14
|
+
*
|
|
15
|
+
* 2. **Engine installation**, to enable `Workbook.calculateFormulas()`
|
|
16
|
+
* and automatic recalculation in `excelToPdf()`:
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { installFormulaEngine } from "@cj-tech-master/excelts/formula";
|
|
19
|
+
* installFormulaEngine(); // once, at startup
|
|
20
|
+
* workbook.calculateFormulas(); // now works
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* The engine is **never installed implicitly** — consumers pay for what
|
|
24
|
+
* they ask for. This keeps the root `package.json` `sideEffects: false`
|
|
25
|
+
* contract intact, so bundles that only use the functional API include
|
|
26
|
+
* exactly the code paths reachable from the exports they reference.
|
|
27
|
+
*
|
|
28
|
+
* Note: `installFormulaEngine` lives in a separate module
|
|
29
|
+
* (`./install.ts`) so that its host-registry import and the
|
|
30
|
+
* evaluator pipeline it carries don't get pulled in by consumers who
|
|
31
|
+
* only need the tokenizer, parser, or the functional `calculateFormulas`
|
|
32
|
+
* API. See `scripts/treeshake-verify.ts` for the bundler contracts.
|
|
33
|
+
*/
|
|
34
|
+
// Functional API — same capability exposed as a callable rather than
|
|
35
|
+
// going through `Workbook.calculateFormulas()`. Useful for server-side
|
|
36
|
+
// recalculation of cached XLSX files loaded via the excel module.
|
|
37
|
+
export { calculateFormulas } from "./integration/calculate-formulas.js";
|
|
38
|
+
// Low-level syntax surface — for tooling, static analysers and callers
|
|
39
|
+
// that want to pre-validate formulas without evaluating them.
|
|
40
|
+
export { tokenize } from "./syntax/tokenizer.js";
|
|
41
|
+
export { parse } from "./syntax/parser.js";
|
|
42
|
+
// Engine installer — isolated module so its imports don't leak into
|
|
43
|
+
// functional-only consumers. `createFormulaSyntaxProbe` is exported for
|
|
44
|
+
// callers that want a standalone probe (e.g. for per-Workbook injection
|
|
45
|
+
// via `new Workbook({ formulaSyntaxProbe })`) without touching
|
|
46
|
+
// process-global state. `uninstallFormulaEngine` is exported for
|
|
47
|
+
// symmetry and for test suites that exercise the cold-start
|
|
48
|
+
// classification path.
|
|
49
|
+
export { createFormulaSyntaxProbe, installFormulaEngine, uninstallFormulaEngine } from "./install.js";
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in engine installer.
|
|
3
|
+
*
|
|
4
|
+
* This file carries the imports that wire a concrete formula engine and
|
|
5
|
+
* a tokenizer+parser probe into the excel host. Keep these imports
|
|
6
|
+
* isolated in a separate module so callers who import only the
|
|
7
|
+
* tokenizer, parser, or the functional `calculateFormulas` API from
|
|
8
|
+
* `./index` never trigger this module — and its evaluator + function
|
|
9
|
+
* registry — at bundle time.
|
|
10
|
+
*
|
|
11
|
+
* Two process-wide slots are populated:
|
|
12
|
+
*
|
|
13
|
+
* 1. The formula-engine slot (`@formula/host-registry`) — enables
|
|
14
|
+
* `Workbook.calculateFormulas()` and the PDF bridge's automatic
|
|
15
|
+
* recalculation.
|
|
16
|
+
*
|
|
17
|
+
* 2. The default syntax-probe slot (`@excel/default-syntax-probe`) —
|
|
18
|
+
* enables strict classification of defined-name text (formula vs.
|
|
19
|
+
* opaque) during XLSX load. Without this, `DefinedNames` preserves
|
|
20
|
+
* unrecognised text verbatim as opaque, which is correct for
|
|
21
|
+
* round-trip but cannot evaluate.
|
|
22
|
+
*
|
|
23
|
+
* Both slots accept `null` to uninstall. See `createFormulaSyntaxProbe`
|
|
24
|
+
* for constructing a probe without touching the process-global slot
|
|
25
|
+
* (useful for tests and for per-Workbook injection via
|
|
26
|
+
* `new Workbook({ formulaSyntaxProbe })`).
|
|
27
|
+
*/
|
|
28
|
+
import { setDefaultSyntaxProbe } from "./default-syntax-probe.js";
|
|
29
|
+
import { registerFormulaEngine } from "./host-registry.js";
|
|
30
|
+
import { calculateFormulas } from "./integration/calculate-formulas.js";
|
|
31
|
+
import { parse } from "./syntax/parser.js";
|
|
32
|
+
import { tokenize } from "./syntax/tokenizer.js";
|
|
33
|
+
/**
|
|
34
|
+
* Build a standalone formula-syntax probe backed by the real
|
|
35
|
+
* tokenizer+parser. The returned function reports whether its argument
|
|
36
|
+
* parses as a formula expression.
|
|
37
|
+
*
|
|
38
|
+
* Unlike {@link installFormulaEngine}, calling this does **not** touch
|
|
39
|
+
* any process-global state. Inject the returned probe explicitly via
|
|
40
|
+
* `new Workbook({ formulaSyntaxProbe })` or `new DefinedNames(probe)`
|
|
41
|
+
* for deterministic, instance-scoped behaviour.
|
|
42
|
+
*/
|
|
43
|
+
export function createFormulaSyntaxProbe() {
|
|
44
|
+
return (text) => {
|
|
45
|
+
try {
|
|
46
|
+
const tokens = tokenize(text);
|
|
47
|
+
if (tokens.length === 0) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
parse(tokens);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Install the formula engine and the default syntax probe into the
|
|
60
|
+
* excel host.
|
|
61
|
+
*
|
|
62
|
+
* After calling this once, `Workbook.calculateFormulas()` and the PDF
|
|
63
|
+
* bridge's automatic recalculation run the full 433-function engine
|
|
64
|
+
* instead of throwing / using stale cached values, and every
|
|
65
|
+
* subsequently-loaded workbook's defined-name classification uses the
|
|
66
|
+
* real tokenizer+parser instead of the conservative "opaque" fallback.
|
|
67
|
+
*
|
|
68
|
+
* Safe to call more than once — the registry accepts the last
|
|
69
|
+
* registration.
|
|
70
|
+
*/
|
|
71
|
+
export function installFormulaEngine() {
|
|
72
|
+
registerFormulaEngine(wb => {
|
|
73
|
+
calculateFormulas(wb);
|
|
74
|
+
});
|
|
75
|
+
setDefaultSyntaxProbe(createFormulaSyntaxProbe());
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Uninstall both slots, restoring the cold-start state.
|
|
79
|
+
*
|
|
80
|
+
* Mainly useful for tests that need to exercise the "no engine" /
|
|
81
|
+
* "no probe" classification path. In production, calling this is
|
|
82
|
+
* rarely necessary — subsequent `installFormulaEngine()` calls simply
|
|
83
|
+
* overwrite the previous registration.
|
|
84
|
+
*/
|
|
85
|
+
export function uninstallFormulaEngine() {
|
|
86
|
+
registerFormulaEngine(null);
|
|
87
|
+
setDefaultSyntaxProbe(null);
|
|
88
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply Writeback Plan — Write formula results back to the live workbook.
|
|
3
|
+
*
|
|
4
|
+
* This is the **only** file that mutates live workbook/cell objects in the
|
|
5
|
+
* new engine pipeline. It reads a `WritebackPlan` and applies each operation
|
|
6
|
+
* to the workbook.
|
|
7
|
+
*
|
|
8
|
+
* ## Responsibilities
|
|
9
|
+
*
|
|
10
|
+
* 1. Apply `ScalarWrite` → set `cell.result`.
|
|
11
|
+
* 2. Apply `CSEWrite` → distribute array across CSE range, update session cache.
|
|
12
|
+
* 3. Apply `SpillWrite` → write source + ghost cells, update persistent maps.
|
|
13
|
+
* 4. Apply `SpillErrorWrite` → set #SPILL! on source cell.
|
|
14
|
+
* 5. Apply `CleanupWrite` → clear stale ghost cells.
|
|
15
|
+
* 6. Apply `PreserveWrite` → no-op (cell keeps existing result).
|
|
16
|
+
* 7. Update persistent spill maps and ghost snapshot maps.
|
|
17
|
+
*/
|
|
18
|
+
import { getGhostSnapshots, getPersistentSpillMap } from "../materialize/spill-engine.js";
|
|
19
|
+
import { CellValueTypeLike } from "../materialize/types.js";
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Apply Writeback Plan
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Apply a `WritebackPlan` to a live workbook.
|
|
25
|
+
*
|
|
26
|
+
* This mutates the workbook in-place. Operations are applied in order.
|
|
27
|
+
* After all operations, persistent spill metadata is updated.
|
|
28
|
+
*/
|
|
29
|
+
export function applyWritebackPlan(workbook, plan) {
|
|
30
|
+
// Apply each operation
|
|
31
|
+
for (const op of plan.operations) {
|
|
32
|
+
applyOperation(workbook, op);
|
|
33
|
+
}
|
|
34
|
+
// Update persistent spill metadata
|
|
35
|
+
const persistentSpills = getPersistentSpillMap(workbook);
|
|
36
|
+
const ghostSnapshots = getGhostSnapshots(workbook);
|
|
37
|
+
// Remove stale spill entries
|
|
38
|
+
for (const key of plan.spillState.removedSpillKeys) {
|
|
39
|
+
persistentSpills.delete(key);
|
|
40
|
+
}
|
|
41
|
+
// Update spill regions
|
|
42
|
+
for (const [key, region] of plan.spillState.spillRegions) {
|
|
43
|
+
persistentSpills.set(key, region);
|
|
44
|
+
}
|
|
45
|
+
// Update ghost value snapshots
|
|
46
|
+
for (const [key, value] of plan.spillState.ghostSnapshots) {
|
|
47
|
+
ghostSnapshots.set(key, snapshotValueToRaw(value));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Apply Individual Operations
|
|
52
|
+
// ============================================================================
|
|
53
|
+
function applyOperation(workbook, op) {
|
|
54
|
+
switch (op.type) {
|
|
55
|
+
case "scalar":
|
|
56
|
+
applyScalarWrite(workbook, op);
|
|
57
|
+
break;
|
|
58
|
+
case "cse":
|
|
59
|
+
applyCSEWrite(workbook, op);
|
|
60
|
+
break;
|
|
61
|
+
case "spill":
|
|
62
|
+
applySpillWrite(workbook, op);
|
|
63
|
+
break;
|
|
64
|
+
case "spill-error":
|
|
65
|
+
applySpillErrorWrite(workbook, op);
|
|
66
|
+
break;
|
|
67
|
+
case "cleanup":
|
|
68
|
+
applyCleanupWrite(workbook, op);
|
|
69
|
+
break;
|
|
70
|
+
case "preserve":
|
|
71
|
+
// No-op: keep existing cached result
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function applyScalarWrite(workbook, op) {
|
|
76
|
+
const ws = workbook.getWorksheet(op.sheetName);
|
|
77
|
+
if (!ws) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const cell = ws.findCell(op.row, op.col);
|
|
81
|
+
if (!cell) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
cell.result = snapshotValueToResult(op.value);
|
|
85
|
+
}
|
|
86
|
+
function applyCSEWrite(workbook, op) {
|
|
87
|
+
const ws = workbook.getWorksheet(op.sheetName);
|
|
88
|
+
if (!ws) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const numRows = op.bottom - op.top + 1;
|
|
92
|
+
const numCols = op.right - op.left + 1;
|
|
93
|
+
for (let r = 0; r < numRows; r++) {
|
|
94
|
+
for (let c = 0; c < numCols; c++) {
|
|
95
|
+
const targetRow = op.top + r;
|
|
96
|
+
const targetCol = op.left + c;
|
|
97
|
+
// Use `findCell` (non-creating) rather than `getCell`. Only cells
|
|
98
|
+
// that are already CSE array slaves — i.e., existing formula cells
|
|
99
|
+
// sharing the master's array `ref` — receive results. Calling
|
|
100
|
+
// `getCell` would lazily materialise every blank position in the
|
|
101
|
+
// target range, which for a 1000×1000 CSE region would bloat the
|
|
102
|
+
// workbook with a million empty cells (and force every subsequent
|
|
103
|
+
// row iterator to walk them). The type check on the next line
|
|
104
|
+
// already implied this intent; we now match it with a matching
|
|
105
|
+
// lookup that has no side effects.
|
|
106
|
+
const targetCell = ws.findCell(targetRow, targetCol);
|
|
107
|
+
if (targetCell && targetCell.type === CellValueTypeLike.Formula) {
|
|
108
|
+
if (op.scalarFill !== undefined) {
|
|
109
|
+
targetCell.result = snapshotValueToResult(op.scalarFill);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const val = op.results[r]?.[c] ?? null;
|
|
113
|
+
targetCell.result = snapshotValueToResult(val);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function applySpillWrite(workbook, op) {
|
|
120
|
+
const ws = workbook.getWorksheet(op.sheetName);
|
|
121
|
+
if (!ws) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const numRows = op.results.length;
|
|
125
|
+
const numCols = op.results[0]?.length ?? 0;
|
|
126
|
+
for (let r = 0; r < numRows; r++) {
|
|
127
|
+
for (let c = 0; c < numCols; c++) {
|
|
128
|
+
const targetRow = op.row + r;
|
|
129
|
+
const targetCol = op.col + c;
|
|
130
|
+
const val = op.results[r]?.[c] ?? null;
|
|
131
|
+
if (r === 0 && c === 0) {
|
|
132
|
+
// Source cell: set result
|
|
133
|
+
const sourceCell = ws.findCell(targetRow, targetCol);
|
|
134
|
+
if (sourceCell) {
|
|
135
|
+
sourceCell.result = snapshotValueToResult(val);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Ghost cell: set value (not result)
|
|
140
|
+
const targetCell = ws.getCell(targetRow, targetCol);
|
|
141
|
+
targetCell.value = snapshotValueToRaw(val);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function applySpillErrorWrite(workbook, op) {
|
|
147
|
+
const ws = workbook.getWorksheet(op.sheetName);
|
|
148
|
+
if (!ws) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const cell = ws.findCell(op.row, op.col);
|
|
152
|
+
if (cell) {
|
|
153
|
+
cell.result = { error: "#SPILL!" };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
function applyCleanupWrite(workbook, op) {
|
|
157
|
+
const ws = workbook.getWorksheet(op.sheetName);
|
|
158
|
+
if (!ws) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
for (const { row, col } of op.cells) {
|
|
162
|
+
const cell = ws.findCell(row, col);
|
|
163
|
+
if (cell) {
|
|
164
|
+
cell.value = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// ============================================================================
|
|
169
|
+
// Value Conversion (Snapshot → Live)
|
|
170
|
+
// ============================================================================
|
|
171
|
+
/**
|
|
172
|
+
* Convert a snapshot cell value to a `FormulaResult` suitable for `cell.result`.
|
|
173
|
+
*
|
|
174
|
+
* `null` represents a BLANK — the formula produced no value (e.g.
|
|
175
|
+
* `=IF(FALSE, 1, )` or an empty reference). Returning literal `0` for
|
|
176
|
+
* that case conflates "formula returned 0" with "formula returned
|
|
177
|
+
* nothing", which breaks downstream consumers that distinguish the two
|
|
178
|
+
* (for instance, `ISBLANK(A1)` on a cell that holds `=B1` where B1 is
|
|
179
|
+
* empty should stay TRUE, not flip to FALSE because we injected 0).
|
|
180
|
+
*/
|
|
181
|
+
function snapshotValueToResult(val) {
|
|
182
|
+
if (val === null) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
if (typeof val === "number" || typeof val === "string" || typeof val === "boolean") {
|
|
186
|
+
return val;
|
|
187
|
+
}
|
|
188
|
+
if (isSnapshotError(val)) {
|
|
189
|
+
return val;
|
|
190
|
+
}
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Convert a snapshot cell value to a raw value suitable for `cell.value`.
|
|
195
|
+
*/
|
|
196
|
+
function snapshotValueToRaw(val) {
|
|
197
|
+
if (val === null) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
if (typeof val === "number" || typeof val === "string" || typeof val === "boolean") {
|
|
201
|
+
return val;
|
|
202
|
+
}
|
|
203
|
+
if (isSnapshotError(val)) {
|
|
204
|
+
return val;
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
function isSnapshotError(val) {
|
|
209
|
+
return val !== null && typeof val === "object" && "error" in val;
|
|
210
|
+
}
|