ooxml-core 1.19.2 → 1.21.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 +47 -1
- package/dist/{PptxHandler-6TNIQ7S5.cjs → PptxHandler-DNSXWTQV.cjs} +3 -3
- package/dist/{PptxHandler-2V4PQL6O.mjs → PptxHandler-FSKKPZZC.mjs} +3 -3
- package/dist/PptxHandler-H7MEWJJJ.mjs +4 -0
- package/dist/{PresentationBuilder-G7MPEGXJ.mjs → PresentationBuilder-7TSENZTX.mjs} +2 -2
- package/dist/{PresentationBuilder-RM52LCVN.cjs → PresentationBuilder-A5NI35VN.cjs} +5 -5
- package/dist/{PresentationBuilder-HQ6C7L4V.mjs → PresentationBuilder-RIJWQSEU.mjs} +3 -3
- package/dist/automation/docx-forms.d.ts +26 -0
- package/dist/automation/docx-forms.d.ts.map +1 -0
- package/dist/automation/index.cjs +6280 -2506
- package/dist/automation/index.d.ts +1 -0
- package/dist/automation/index.d.ts.map +1 -1
- package/dist/automation/index.mjs +6277 -2507
- package/dist/automation/xlsx-read.d.ts +56 -0
- package/dist/automation/xlsx-read.d.ts.map +1 -0
- package/dist/automation/xlsx.d.ts +105 -4
- package/dist/automation/xlsx.d.ts.map +1 -1
- package/dist/chart/axis-range.d.ts.map +1 -1
- package/dist/chart/bubble-radius.d.ts +0 -5
- package/dist/chart/bubble-radius.d.ts.map +1 -1
- package/dist/chart/extent.d.ts +9 -0
- package/dist/chart/extent.d.ts.map +1 -0
- package/dist/chart/histogram-binning.d.ts.map +1 -1
- package/dist/chart/index.cjs +56 -18
- package/dist/chart/index.mjs +56 -18
- package/dist/chart/render/chart-svg-cartesian.d.ts.map +1 -1
- package/dist/chart/render/chart-svg-legend.d.ts.map +1 -1
- package/dist/chart/render/chart-view-ex.d.ts.map +1 -1
- package/dist/chart/render/chart-view.d.ts.map +1 -1
- package/dist/chart/trendline-fit.d.ts.map +1 -1
- package/dist/{chunk-NYTR4UZ5.cjs → chunk-4LZIUJI3.cjs} +52 -12
- package/dist/{chunk-SLNQNVQM.mjs → chunk-4QPOJCJG.mjs} +45 -8
- package/dist/{chunk-XTSHZGSM.mjs → chunk-6IIMI5RS.mjs} +52 -12
- package/dist/{chunk-TJPUAUWL.mjs → chunk-BA7Z6ATM.mjs} +9 -195
- package/dist/{chunk-JUABSM7C.mjs → chunk-DLFMCZZT.mjs} +1 -1
- package/dist/{chunk-M4XLF4R7.mjs → chunk-GBKBR4CX.mjs} +20 -8
- package/dist/{chunk-R5FIHHGB.cjs → chunk-HL3FBJ6X.cjs} +1648 -1205
- package/dist/{chunk-ZJ2OKIJN.mjs → chunk-LF5E5ZOH.mjs} +642 -199
- package/dist/{chunk-4FTUAD2B.mjs → chunk-Q5PKBQXH.mjs} +766 -202
- package/dist/{chunk-M6GDBVQ7.mjs → chunk-VQF6HQEE.mjs} +1 -1
- package/dist/collab/embedding.d.ts +103 -0
- package/dist/collab/embedding.d.ts.map +1 -0
- package/dist/collab/index.cjs +450 -342
- package/dist/collab/index.d.ts +1 -0
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.mjs +443 -343
- package/dist/color/theme-palette.d.ts +5 -1
- package/dist/color/theme-palette.d.ts.map +1 -1
- package/dist/crypto/index.cjs +27 -2
- package/dist/crypto/index.mjs +27 -2
- package/dist/diagram/index.cjs +31 -3
- package/dist/diagram/index.mjs +31 -3
- package/dist/docx/block-parser.d.ts.map +1 -1
- package/dist/docx/cell-blocks.d.ts +7 -1
- package/dist/docx/cell-blocks.d.ts.map +1 -1
- package/dist/docx/content-control-edit.d.ts +14 -0
- package/dist/docx/content-control-edit.d.ts.map +1 -1
- package/dist/docx/content-control-model.d.ts +8 -0
- package/dist/docx/content-control-model.d.ts.map +1 -1
- package/dist/docx/content-control-values.d.ts +20 -0
- package/dist/docx/content-control-values.d.ts.map +1 -0
- package/dist/docx/content-control.d.ts +7 -1
- package/dist/docx/content-control.d.ts.map +1 -1
- package/dist/docx/element-order.d.ts +10 -5
- package/dist/docx/element-order.d.ts.map +1 -1
- package/dist/docx/embedded.cjs +3861 -1379
- package/dist/docx/embedded.mjs +3861 -1379
- package/dist/docx/field-instruction.d.ts +22 -0
- package/dist/docx/field-instruction.d.ts.map +1 -0
- package/dist/docx/form-field-model.d.ts +48 -0
- package/dist/docx/form-field-model.d.ts.map +1 -0
- package/dist/docx/form-fields.d.ts +31 -0
- package/dist/docx/form-fields.d.ts.map +1 -0
- package/dist/docx/form-fill-fields.d.ts +61 -0
- package/dist/docx/form-fill-fields.d.ts.map +1 -0
- package/dist/docx/form-fill-labels.d.ts +8 -0
- package/dist/docx/form-fill-labels.d.ts.map +1 -0
- package/dist/docx/form-fill-sites.d.ts +59 -0
- package/dist/docx/form-fill-sites.d.ts.map +1 -0
- package/dist/docx/form-fill-values.d.ts +28 -0
- package/dist/docx/form-fill-values.d.ts.map +1 -0
- package/dist/docx/form-fill-write.d.ts +26 -0
- package/dist/docx/form-fill-write.d.ts.map +1 -0
- package/dist/docx/glossary.d.ts +15 -0
- package/dist/docx/glossary.d.ts.map +1 -0
- package/dist/docx/index.cjs +5929 -3153
- package/dist/docx/index.d.ts +7 -0
- package/dist/docx/index.d.ts.map +1 -1
- package/dist/docx/index.mjs +5913 -3154
- package/dist/docx/inline-annotations.d.ts +21 -0
- package/dist/docx/inline-annotations.d.ts.map +1 -0
- package/dist/docx/inline-container-markers.d.ts +14 -0
- package/dist/docx/inline-container-markers.d.ts.map +1 -0
- package/dist/docx/inline-containers.d.ts +54 -0
- package/dist/docx/inline-containers.d.ts.map +1 -0
- package/dist/docx/inline-form-field-bookmarks.d.ts +15 -0
- package/dist/docx/inline-form-field-bookmarks.d.ts.map +1 -0
- package/dist/docx/inline-marker-positions.d.ts +15 -0
- package/dist/docx/inline-marker-positions.d.ts.map +1 -0
- package/dist/docx/inline-markers.d.ts +63 -0
- package/dist/docx/inline-markers.d.ts.map +1 -0
- package/dist/docx/inline-slots.d.ts +24 -0
- package/dist/docx/inline-slots.d.ts.map +1 -0
- package/dist/docx/layout/adapter.d.ts.map +1 -1
- package/dist/docx/layout/index.cjs +1176 -563
- package/dist/docx/layout/index.d.ts +2 -1
- package/dist/docx/layout/index.d.ts.map +1 -1
- package/dist/docx/layout/index.mjs +1175 -564
- package/dist/docx/layout/input.d.ts +5 -1
- package/dist/docx/layout/input.d.ts.map +1 -1
- package/dist/docx/layout/page-style-refs.d.ts +21 -0
- package/dist/docx/layout/page-style-refs.d.ts.map +1 -0
- package/dist/docx/layout/paragraph-fragments.d.ts.map +1 -1
- package/dist/docx/layout/result.d.ts +1 -0
- package/dist/docx/layout/result.d.ts.map +1 -1
- package/dist/docx/layout/tab-stops.d.ts +8 -1
- package/dist/docx/layout/tab-stops.d.ts.map +1 -1
- package/dist/docx/load/index.cjs +3969 -1487
- package/dist/docx/load/index.mjs +3969 -1487
- package/dist/docx/model-run.d.ts +24 -2
- package/dist/docx/model-run.d.ts.map +1 -1
- package/dist/docx/model.d.ts +5 -0
- package/dist/docx/model.d.ts.map +1 -1
- package/dist/docx/numbering-format.d.ts.map +1 -1
- package/dist/docx/parse-warnings.d.ts.map +1 -1
- package/dist/docx/parse.d.ts.map +1 -1
- package/dist/docx/run-segmentation.d.ts +11 -0
- package/dist/docx/run-segmentation.d.ts.map +1 -0
- package/dist/docx/save.d.ts.map +1 -1
- package/dist/docx/section-model.d.ts +5 -0
- package/dist/docx/section-model.d.ts.map +1 -1
- package/dist/docx/sections.d.ts +4 -2
- package/dist/docx/sections.d.ts.map +1 -1
- package/dist/docx/settings.d.ts +9 -0
- package/dist/docx/settings.d.ts.map +1 -1
- package/dist/docx/special-characters.d.ts +34 -0
- package/dist/docx/special-characters.d.ts.map +1 -0
- package/dist/docx/style-ref-fields.d.ts +40 -0
- package/dist/docx/style-ref-fields.d.ts.map +1 -0
- package/dist/docx/style-ref.d.ts +85 -0
- package/dist/docx/style-ref.d.ts.map +1 -0
- package/dist/docx/table-model.d.ts +2 -2
- package/dist/docx/table-model.d.ts.map +1 -1
- package/dist/docx/ui/break-note-schema.d.ts.map +1 -1
- package/dist/docx/ui/content-control-commands.d.ts +20 -8
- package/dist/docx/ui/content-control-commands.d.ts.map +1 -1
- package/dist/docx/ui/content-control-guard.d.ts +4 -1
- package/dist/docx/ui/content-control-guard.d.ts.map +1 -1
- package/dist/docx/ui/content-control-paste.d.ts +23 -0
- package/dist/docx/ui/content-control-paste.d.ts.map +1 -0
- package/dist/docx/ui/content-control-rows.d.ts +15 -0
- package/dist/docx/ui/content-control-rows.d.ts.map +1 -0
- package/dist/docx/ui/content-control-sources.d.ts +12 -0
- package/dist/docx/ui/content-control-sources.d.ts.map +1 -0
- package/dist/docx/ui/content-control-spans.d.ts +29 -6
- package/dist/docx/ui/content-control-spans.d.ts.map +1 -1
- package/dist/docx/ui/content-control-temporary.d.ts +10 -0
- package/dist/docx/ui/content-control-temporary.d.ts.map +1 -0
- package/dist/docx/ui/form-field-commands.d.ts +41 -0
- package/dist/docx/ui/form-field-commands.d.ts.map +1 -0
- package/dist/docx/ui/form-field-guard.d.ts +24 -0
- package/dist/docx/ui/form-field-guard.d.ts.map +1 -0
- package/dist/docx/ui/form-text-blank.d.ts +18 -0
- package/dist/docx/ui/form-text-blank.d.ts.map +1 -0
- package/dist/docx/ui/index.cjs +9276 -7132
- package/dist/docx/ui/index.d.ts +5 -0
- package/dist/docx/ui/index.d.ts.map +1 -1
- package/dist/docx/ui/index.mjs +9259 -7137
- package/dist/docx/ui/positional-tab-input.d.ts +7 -0
- package/dist/docx/ui/positional-tab-input.d.ts.map +1 -0
- package/dist/docx/ui/run-compare.d.ts.map +1 -1
- package/dist/docx/ui/run-extra-mark.d.ts +1 -1
- package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
- package/dist/docx/ui/schema-marks.d.ts +1 -1
- package/dist/docx/ui/schema-marks.d.ts.map +1 -1
- package/dist/docx/ui/symbol-font.d.ts +4 -0
- package/dist/docx/ui/symbol-font.d.ts.map +1 -0
- package/dist/docx/ui/yjs-collaboration.d.ts +12 -1
- package/dist/docx/ui/yjs-collaboration.d.ts.map +1 -1
- package/dist/docx/write-block-placement.d.ts +7 -0
- package/dist/docx/write-block-placement.d.ts.map +1 -1
- package/dist/docx/write-content-control.d.ts +6 -0
- package/dist/docx/write-content-control.d.ts.map +1 -1
- package/dist/docx/write-header-footer.d.ts +6 -2
- package/dist/docx/write-header-footer.d.ts.map +1 -1
- package/dist/docx/write-inline.d.ts +12 -16
- package/dist/docx/write-inline.d.ts.map +1 -1
- package/dist/docx/write-paragraph.d.ts.map +1 -1
- package/dist/docx/write-revisions.d.ts.map +1 -1
- package/dist/docx/write-run.d.ts.map +1 -1
- package/dist/docx/write-section-properties.d.ts +5 -0
- package/dist/docx/write-section-properties.d.ts.map +1 -0
- package/dist/docx/write-sections.d.ts.map +1 -1
- package/dist/docx/write-table-controls.d.ts +15 -0
- package/dist/docx/write-table-controls.d.ts.map +1 -0
- package/dist/docx/write-table-properties.d.ts.map +1 -1
- package/dist/docx/write-table.d.ts.map +1 -1
- package/dist/docx/write.d.ts.map +1 -1
- package/dist/docx/xml.d.ts +6 -0
- package/dist/docx/xml.d.ts.map +1 -1
- package/dist/drawingml/index.cjs +31 -3
- package/dist/drawingml/index.mjs +31 -3
- package/dist/index.cjs +102 -26
- package/dist/index.mjs +102 -26
- package/dist/math/index.cjs +27 -2
- package/dist/math/index.mjs +27 -2
- package/dist/opc/index.cjs +51 -11
- package/dist/opc/index.mjs +51 -11
- package/dist/opc/zip-folders.d.ts +11 -0
- package/dist/opc/zip-folders.d.ts.map +1 -0
- package/dist/opc/zip-limits.d.ts +9 -0
- package/dist/opc/zip-limits.d.ts.map +1 -1
- package/dist/pptx/automation/index.cjs +995 -462
- package/dist/pptx/automation/index.d.ts +2 -2
- package/dist/pptx/automation/index.mjs +6 -6
- package/dist/pptx/chunks/{index-Bqm-jFG-.d.ts → index-CPhsd7Df.d.ts} +7580 -7507
- package/dist/pptx/chunks/index-CPhsd7Df.d.ts.map +1 -0
- package/dist/pptx/chunks/{index-B9x557hr.d.ts → index-Q5mM8kIR.d.ts} +2 -2
- package/dist/pptx/chunks/{index-B9x557hr.d.ts.map → index-Q5mM8kIR.d.ts.map} +1 -1
- package/dist/pptx/cli/index.cjs +770 -238
- package/dist/pptx/cli/index.mjs +5 -5
- package/dist/pptx/converter/index.cjs +12 -3
- package/dist/pptx/converter/index.d.ts +1 -1
- package/dist/pptx/converter/index.mjs +3 -3
- package/dist/pptx/editor/render/find-replace.cjs +14 -14
- package/dist/pptx/editor/render/find-replace.d.ts +1 -1
- package/dist/pptx/editor/render/find-replace.mjs +1 -1
- package/dist/pptx/editor/render/slide-operations.cjs +8 -8
- package/dist/pptx/editor/render/slide-operations.mjs +2 -2
- package/dist/pptx/index.cjs +1099 -628
- package/dist/pptx/index.d.ts +3 -3
- package/dist/pptx/index.mjs +6 -6
- package/dist/pptx/signature-node/index.cjs +20 -8
- package/dist/pptx/signature-node/index.mjs +2 -2
- package/dist/teams/index.cjs +105 -70
- package/dist/teams/index.mjs +105 -70
- package/dist/text/text-diff.d.ts +15 -0
- package/dist/text/text-diff.d.ts.map +1 -0
- package/dist/visio/index.cjs +220 -46
- package/dist/visio/index.mjs +220 -46
- package/dist/visio/ui/contract.d.ts +8 -2
- package/dist/visio/ui/contract.d.ts.map +1 -1
- package/dist/visio/ui/index.cjs +227 -50
- package/dist/visio/ui/index.mjs +227 -50
- package/dist/xlsx/collab/index.cjs +8 -3
- package/dist/xlsx/collab/index.mjs +8 -3
- package/dist/xlsx/compare/cells.d.ts +22 -0
- package/dist/xlsx/compare/cells.d.ts.map +1 -0
- package/dist/xlsx/compare/compare.d.ts +12 -0
- package/dist/xlsx/compare/compare.d.ts.map +1 -0
- package/dist/xlsx/compare/conditional.d.ts +7 -0
- package/dist/xlsx/compare/conditional.d.ts.map +1 -0
- package/dist/xlsx/compare/format-key.d.ts +34 -0
- package/dist/xlsx/compare/format-key.d.ts.map +1 -0
- package/dist/xlsx/compare/group.d.ts +8 -0
- package/dist/xlsx/compare/group.d.ts.map +1 -0
- package/dist/xlsx/compare/index.d.ts +5 -0
- package/dist/xlsx/compare/index.d.ts.map +1 -0
- package/dist/xlsx/compare/rich-text.d.ts +7 -0
- package/dist/xlsx/compare/rich-text.d.ts.map +1 -0
- package/dist/xlsx/compare/sheets.d.ts +22 -0
- package/dist/xlsx/compare/sheets.d.ts.map +1 -0
- package/dist/xlsx/compare/structure.d.ts +11 -0
- package/dist/xlsx/compare/structure.d.ts.map +1 -0
- package/dist/xlsx/compare/text.d.ts +8 -0
- package/dist/xlsx/compare/text.d.ts.map +1 -0
- package/dist/xlsx/compare/types.d.ts +173 -0
- package/dist/xlsx/compare/types.d.ts.map +1 -0
- package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
- package/dist/xlsx/edit/clipboard-html.d.ts.map +1 -1
- package/dist/xlsx/edit/clipboard-text.d.ts.map +1 -1
- package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
- package/dist/xlsx/edit/clone-cell.d.ts +9 -0
- package/dist/xlsx/edit/clone-cell.d.ts.map +1 -0
- package/dist/xlsx/edit/dimensions.d.ts.map +1 -1
- package/dist/xlsx/edit/history-rows.d.ts +7 -0
- package/dist/xlsx/edit/history-rows.d.ts.map +1 -0
- package/dist/xlsx/edit/history.d.ts +19 -4
- package/dist/xlsx/edit/history.d.ts.map +1 -1
- package/dist/xlsx/edit/outline.d.ts.map +1 -1
- package/dist/xlsx/edit/row-autofit.d.ts.map +1 -1
- package/dist/xlsx/edit/timelines.d.ts.map +1 -1
- package/dist/xlsx/formula/change-areas.d.ts +9 -0
- package/dist/xlsx/formula/change-areas.d.ts.map +1 -0
- package/dist/xlsx/formula/engine-prepare.d.ts +8 -0
- package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -1
- package/dist/xlsx/formula/engine.d.ts.map +1 -1
- package/dist/xlsx/formula/spill.d.ts +5 -1
- package/dist/xlsx/formula/spill.d.ts.map +1 -1
- package/dist/xlsx/index.cjs +2551 -1208
- package/dist/xlsx/index.d.ts +1 -0
- package/dist/xlsx/index.d.ts.map +1 -1
- package/dist/xlsx/index.mjs +2544 -1209
- package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
- package/dist/xlsx/layout/navigate.d.ts.map +1 -1
- package/dist/xlsx/layout/style-view.d.ts +5 -0
- package/dist/xlsx/layout/style-view.d.ts.map +1 -1
- package/dist/xlsx/load/csv-dates.d.ts +22 -0
- package/dist/xlsx/load/csv-dates.d.ts.map +1 -0
- package/dist/xlsx/load/csv-import.d.ts +64 -0
- package/dist/xlsx/load/csv-import.d.ts.map +1 -0
- package/dist/xlsx/load/csv-separators.d.ts +13 -0
- package/dist/xlsx/load/csv-separators.d.ts.map +1 -0
- package/dist/xlsx/load/csv-traits.d.ts +20 -0
- package/dist/xlsx/load/csv-traits.d.ts.map +1 -0
- package/dist/xlsx/load/csv.d.ts +8 -4
- package/dist/xlsx/load/csv.d.ts.map +1 -1
- package/dist/xlsx/load/detect.d.ts +13 -0
- package/dist/xlsx/load/detect.d.ts.map +1 -1
- package/dist/xlsx/load/errors.d.ts +1 -0
- package/dist/xlsx/load/errors.d.ts.map +1 -1
- package/dist/xlsx/load/index.cjs +598 -98
- package/dist/xlsx/load/index.d.ts +3 -1
- package/dist/xlsx/load/index.d.ts.map +1 -1
- package/dist/xlsx/load/index.mjs +597 -99
- package/dist/xlsx/numfmt/format.d.ts +8 -0
- package/dist/xlsx/numfmt/format.d.ts.map +1 -1
- package/dist/xlsx/numfmt/input-date.d.ts +2 -0
- package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
- package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -1
- package/dist/xlsx/pivot/groups.d.ts.map +1 -1
- package/dist/xlsx/read/index.d.ts +2 -1
- package/dist/xlsx/read/index.d.ts.map +1 -1
- package/dist/xlsx/read/limits.d.ts +50 -0
- package/dist/xlsx/read/limits.d.ts.map +1 -0
- package/dist/xlsx/read/load.d.ts +11 -1
- package/dist/xlsx/read/load.d.ts.map +1 -1
- package/dist/xlsx/read/package.d.ts +5 -23
- package/dist/xlsx/read/package.d.ts.map +1 -1
- package/dist/xlsx/read/shared-strings.d.ts +2 -2
- package/dist/xlsx/read/shared-strings.d.ts.map +1 -1
- package/dist/xlsx/read/sheet-data-source.d.ts.map +1 -1
- package/dist/xlsx/read/worksheet.d.ts +2 -0
- package/dist/xlsx/read/worksheet.d.ts.map +1 -1
- package/dist/xlsx/stable-key.d.ts +3 -0
- package/dist/xlsx/stable-key.d.ts.map +1 -0
- package/dist/xlsx/styles.d.ts.map +1 -1
- package/dist/xlsx/ui/index.cjs +795 -388
- package/dist/xlsx/ui/index.d.ts +1 -0
- package/dist/xlsx/ui/index.d.ts.map +1 -1
- package/dist/xlsx/ui/index.mjs +795 -389
- package/dist/xlsx/ui/selection-format.d.ts +13 -0
- package/dist/xlsx/ui/selection-format.d.ts.map +1 -0
- package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
- package/dist/xml/index.cjs +57 -3
- package/dist/xml/index.mjs +57 -4
- package/dist/xml/lite.d.ts.map +1 -1
- package/dist/xml/xml.d.ts +11 -1
- package/dist/xml/xml.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/PptxHandler-HSPKEP5E.mjs +0 -4
- package/dist/pptx/chunks/index-Bqm-jFG-.d.ts.map +0 -1
package/dist/xlsx/ui/index.cjs
CHANGED
|
@@ -321,9 +321,9 @@ function nextSheetName(workbook, base = "Sheet") {
|
|
|
321
321
|
}
|
|
322
322
|
var nextSheetId = (workbook) => workbook.sheets.reduce((max, sheet) => Math.max(max, sheet.sheetId), 0) + 1;
|
|
323
323
|
|
|
324
|
-
// xlsx/
|
|
325
|
-
function
|
|
326
|
-
return JSON.stringify(sortKeys(
|
|
324
|
+
// xlsx/stable-key.ts
|
|
325
|
+
function stableKey(value3) {
|
|
326
|
+
return JSON.stringify(sortKeys(value3));
|
|
327
327
|
}
|
|
328
328
|
function sortKeys(value3) {
|
|
329
329
|
if (Array.isArray(value3)) return value3.map(sortKeys);
|
|
@@ -337,6 +337,11 @@ function sortKeys(value3) {
|
|
|
337
337
|
}
|
|
338
338
|
return value3;
|
|
339
339
|
}
|
|
340
|
+
|
|
341
|
+
// xlsx/styles.ts
|
|
342
|
+
function styleKey(style3) {
|
|
343
|
+
return stableKey(style3);
|
|
344
|
+
}
|
|
340
345
|
function styleAt(workbook, styleId) {
|
|
341
346
|
const style3 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
|
|
342
347
|
if (!style3) throw new Error("Workbook has no default cell style");
|
|
@@ -2709,6 +2714,37 @@ function parseArray(c2) {
|
|
|
2709
2714
|
return { type: "array", rows: rows2 };
|
|
2710
2715
|
}
|
|
2711
2716
|
|
|
2717
|
+
// xlsx/formula/change-areas.ts
|
|
2718
|
+
function changeAreas(changes) {
|
|
2719
|
+
const out = [];
|
|
2720
|
+
const open = /* @__PURE__ */ new Map();
|
|
2721
|
+
let run2;
|
|
2722
|
+
const close2 = (area) => {
|
|
2723
|
+
const { start, end } = area.range;
|
|
2724
|
+
const key = `${area.sheet}:${start.col}:${end.col}`;
|
|
2725
|
+
const above = open.get(key);
|
|
2726
|
+
if (above && above.range.end.row === start.row - 1) {
|
|
2727
|
+
above.range.end.row = end.row;
|
|
2728
|
+
return;
|
|
2729
|
+
}
|
|
2730
|
+
out.push(area);
|
|
2731
|
+
open.set(key, area);
|
|
2732
|
+
};
|
|
2733
|
+
for (const { sheet, row: row2, col } of changes) {
|
|
2734
|
+
if (run2 && run2.sheet === sheet && run2.range.start.row === row2) {
|
|
2735
|
+
if (col === run2.range.end.col + 1) {
|
|
2736
|
+
run2.range.end.col = col;
|
|
2737
|
+
continue;
|
|
2738
|
+
}
|
|
2739
|
+
if (col >= run2.range.start.col && col <= run2.range.end.col) continue;
|
|
2740
|
+
}
|
|
2741
|
+
if (run2) close2(run2);
|
|
2742
|
+
run2 = { sheet, range: { start: { row: row2, col }, end: { row: row2, col } } };
|
|
2743
|
+
}
|
|
2744
|
+
if (run2) close2(run2);
|
|
2745
|
+
return out;
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2712
2748
|
// xlsx/formula/date-serial.ts
|
|
2713
2749
|
var DAY_MS = 864e5;
|
|
2714
2750
|
var EPOCH_19002 = Date.UTC(1899, 11, 30);
|
|
@@ -2935,68 +2971,6 @@ var ReverseIndex = class extends AreaIndex {
|
|
|
2935
2971
|
}
|
|
2936
2972
|
};
|
|
2937
2973
|
|
|
2938
|
-
// xlsx/formula/engine-prepare.ts
|
|
2939
|
-
var CHECK_EVERY = 32;
|
|
2940
|
-
var GraphPreparation = class {
|
|
2941
|
-
constructor(workbook, create) {
|
|
2942
|
-
this.workbook = workbook;
|
|
2943
|
-
this.create = create;
|
|
2944
|
-
}
|
|
2945
|
-
workbook;
|
|
2946
|
-
create;
|
|
2947
|
-
reverse = new ReverseIndex();
|
|
2948
|
-
formulas = { dynamic: [], unvalued: [] };
|
|
2949
|
-
sheet = 0;
|
|
2950
|
-
rows;
|
|
2951
|
-
row = 0;
|
|
2952
|
-
cells;
|
|
2953
|
-
finished = false;
|
|
2954
|
-
/**
|
|
2955
|
-
* Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
|
|
2956
|
-
* them) reaches zero, or until every formula is in. Returns true when the graph is complete.
|
|
2957
|
-
*/
|
|
2958
|
-
run(timeRemaining) {
|
|
2959
|
-
let visited = 0;
|
|
2960
|
-
while (!this.finished) {
|
|
2961
|
-
const cells = this.cells ?? this.nextRow();
|
|
2962
|
-
if (!cells) continue;
|
|
2963
|
-
const next = cells.next();
|
|
2964
|
-
if (next.done) {
|
|
2965
|
-
this.cells = void 0;
|
|
2966
|
-
continue;
|
|
2967
|
-
}
|
|
2968
|
-
const [col, cell] = next.value;
|
|
2969
|
-
if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
|
|
2970
|
-
if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
|
|
2971
|
-
}
|
|
2972
|
-
return this.finished;
|
|
2973
|
-
}
|
|
2974
|
-
add(node2, cell) {
|
|
2975
|
-
this.reverse.addNode(node2);
|
|
2976
|
-
if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
|
|
2977
|
-
if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
|
|
2978
|
-
}
|
|
2979
|
-
/** Moves to the next stored row (and sheet), or marks the walk finished. */
|
|
2980
|
-
nextRow() {
|
|
2981
|
-
for (; ; ) {
|
|
2982
|
-
const sheet = this.workbook.sheets[this.sheet];
|
|
2983
|
-
if (!sheet) {
|
|
2984
|
-
this.finished = true;
|
|
2985
|
-
return void 0;
|
|
2986
|
-
}
|
|
2987
|
-
this.rows ??= sheet.rows.entries();
|
|
2988
|
-
const next = this.rows.next();
|
|
2989
|
-
if (!next.done) {
|
|
2990
|
-
this.row = next.value[0];
|
|
2991
|
-
this.cells = next.value[1].entries();
|
|
2992
|
-
return this.cells;
|
|
2993
|
-
}
|
|
2994
|
-
this.rows = void 0;
|
|
2995
|
-
this.sheet++;
|
|
2996
|
-
}
|
|
2997
|
-
}
|
|
2998
|
-
};
|
|
2999
|
-
|
|
3000
2974
|
// xlsx/formula/text-number.ts
|
|
3001
2975
|
var MONTHS2 = [
|
|
3002
2976
|
"jan",
|
|
@@ -3399,6 +3373,311 @@ function finite(value3) {
|
|
|
3399
3373
|
return value3;
|
|
3400
3374
|
}
|
|
3401
3375
|
|
|
3376
|
+
// xlsx/formula/operators.ts
|
|
3377
|
+
var signal = (fn) => {
|
|
3378
|
+
try {
|
|
3379
|
+
return fn();
|
|
3380
|
+
} catch (e) {
|
|
3381
|
+
if (e instanceof ErrorSignal) return e.value;
|
|
3382
|
+
throw e;
|
|
3383
|
+
}
|
|
3384
|
+
};
|
|
3385
|
+
function power(base, exponent) {
|
|
3386
|
+
if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
|
|
3387
|
+
if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
|
|
3388
|
+
if (base < 0 && !Number.isInteger(exponent)) {
|
|
3389
|
+
const inverse = 1 / exponent;
|
|
3390
|
+
const odd = Math.round(inverse);
|
|
3391
|
+
if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
|
|
3392
|
+
return -Math.pow(-base, exponent);
|
|
3393
|
+
}
|
|
3394
|
+
throw new ErrorSignal(ERR.NUM);
|
|
3395
|
+
}
|
|
3396
|
+
return Math.pow(base, exponent);
|
|
3397
|
+
}
|
|
3398
|
+
function snapToZero(result2, a2, b) {
|
|
3399
|
+
if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
|
|
3400
|
+
return result2;
|
|
3401
|
+
}
|
|
3402
|
+
function arithmetic(op2, x, y, snap) {
|
|
3403
|
+
if (isError(x)) return x;
|
|
3404
|
+
if (isError(y)) return y;
|
|
3405
|
+
return signal(() => {
|
|
3406
|
+
const a2 = toNumber(x);
|
|
3407
|
+
const b = toNumber(y);
|
|
3408
|
+
let r;
|
|
3409
|
+
switch (op2) {
|
|
3410
|
+
case "+":
|
|
3411
|
+
r = a2 + b;
|
|
3412
|
+
if (snap) r = snapToZero(r, a2, b);
|
|
3413
|
+
break;
|
|
3414
|
+
case "-":
|
|
3415
|
+
r = a2 - b;
|
|
3416
|
+
if (snap) r = snapToZero(r, a2, b);
|
|
3417
|
+
break;
|
|
3418
|
+
case "*":
|
|
3419
|
+
r = a2 * b;
|
|
3420
|
+
break;
|
|
3421
|
+
case "/":
|
|
3422
|
+
if (b === 0) return ERR.DIV0;
|
|
3423
|
+
r = a2 / b;
|
|
3424
|
+
break;
|
|
3425
|
+
default:
|
|
3426
|
+
r = power(a2, b);
|
|
3427
|
+
}
|
|
3428
|
+
return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
|
|
3429
|
+
});
|
|
3430
|
+
}
|
|
3431
|
+
function comparison(op2, x, y) {
|
|
3432
|
+
if (isError(x)) return x;
|
|
3433
|
+
if (isError(y)) return y;
|
|
3434
|
+
const c2 = compareScalars(x, y);
|
|
3435
|
+
switch (op2) {
|
|
3436
|
+
case "=":
|
|
3437
|
+
return c2 === 0;
|
|
3438
|
+
case "<>":
|
|
3439
|
+
return c2 !== 0;
|
|
3440
|
+
case "<":
|
|
3441
|
+
return c2 < 0;
|
|
3442
|
+
case ">":
|
|
3443
|
+
return c2 > 0;
|
|
3444
|
+
case "<=":
|
|
3445
|
+
return c2 <= 0;
|
|
3446
|
+
default:
|
|
3447
|
+
return c2 >= 0;
|
|
3448
|
+
}
|
|
3449
|
+
}
|
|
3450
|
+
function concat(x, y) {
|
|
3451
|
+
if (isError(x)) return x;
|
|
3452
|
+
if (isError(y)) return y;
|
|
3453
|
+
return toText(x) + toText(y);
|
|
3454
|
+
}
|
|
3455
|
+
function scalarBinary(op2, x, y, snap = false) {
|
|
3456
|
+
if (op2 === "&") return concat(x, y);
|
|
3457
|
+
if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
|
|
3458
|
+
return arithmetic(op2, x, y, snap);
|
|
3459
|
+
}
|
|
3460
|
+
return comparison(op2, x, y);
|
|
3461
|
+
}
|
|
3462
|
+
function scalarUnary(op2, x) {
|
|
3463
|
+
if (isError(x)) return x;
|
|
3464
|
+
return signal(() => {
|
|
3465
|
+
const n2 = toNumber(x);
|
|
3466
|
+
const r = op2 === "-" ? -n2 : n2 / 100;
|
|
3467
|
+
return r === 0 ? 0 : r;
|
|
3468
|
+
});
|
|
3469
|
+
}
|
|
3470
|
+
function pick(m, row2, col) {
|
|
3471
|
+
const r = m.rows === 1 ? 0 : row2;
|
|
3472
|
+
const c2 = m.cols === 1 ? 0 : col;
|
|
3473
|
+
if (r >= m.rows || c2 >= m.cols) return ERR.NA;
|
|
3474
|
+
return m.get(r, c2);
|
|
3475
|
+
}
|
|
3476
|
+
function broadcastShape(operands, at) {
|
|
3477
|
+
let rows2 = 1;
|
|
3478
|
+
let cols = 1;
|
|
3479
|
+
for (const m of operands) {
|
|
3480
|
+
rows2 = Math.max(rows2, m.rows);
|
|
3481
|
+
cols = Math.max(cols, m.cols);
|
|
3482
|
+
}
|
|
3483
|
+
if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
|
|
3484
|
+
let blockRows = 1;
|
|
3485
|
+
let blockCols = 1;
|
|
3486
|
+
for (const m of operands) {
|
|
3487
|
+
blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
|
|
3488
|
+
blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
|
|
3489
|
+
}
|
|
3490
|
+
blockRows = Math.min(blockRows, rows2);
|
|
3491
|
+
blockCols = Math.min(blockCols, cols);
|
|
3492
|
+
const varies = operands.some(
|
|
3493
|
+
(m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
|
|
3494
|
+
);
|
|
3495
|
+
if (varies) return Matrix.build(rows2, cols, at);
|
|
3496
|
+
return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
|
|
3497
|
+
}
|
|
3498
|
+
function broadcast2(a2, b, fn) {
|
|
3499
|
+
if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
|
|
3500
|
+
const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
|
|
3501
|
+
const mb = b instanceof Matrix ? b : new Matrix([[b]]);
|
|
3502
|
+
return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
|
|
3503
|
+
}
|
|
3504
|
+
function broadcast1(a2, fn) {
|
|
3505
|
+
return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
|
|
3506
|
+
}
|
|
3507
|
+
|
|
3508
|
+
// xlsx/formula/spill.ts
|
|
3509
|
+
var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
|
|
3510
|
+
function releaseSpilledCell(sheet, row2, col) {
|
|
3511
|
+
const cell = getCell(sheet, row2, col);
|
|
3512
|
+
if (!isSpilledCell(cell)) return;
|
|
3513
|
+
delete cell.spillAnchor;
|
|
3514
|
+
cell.value = null;
|
|
3515
|
+
if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
|
|
3516
|
+
deleteCell(sheet, row2, col);
|
|
3517
|
+
}
|
|
3518
|
+
function clearFootprint(sheet, footprint, row2, col) {
|
|
3519
|
+
const { start, end } = footprint;
|
|
3520
|
+
const owned = [];
|
|
3521
|
+
const visit2 = (r, c2, cell) => {
|
|
3522
|
+
if (c2 < start.col || c2 > end.col || r === row2 && c2 === col) return;
|
|
3523
|
+
if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col)
|
|
3524
|
+
owned.push([r, c2]);
|
|
3525
|
+
};
|
|
3526
|
+
const visitRow = (r, cells) => {
|
|
3527
|
+
if (end.col - start.col + 1 <= cells.size)
|
|
3528
|
+
for (let c2 = start.col; c2 <= end.col; c2++) visit2(r, c2, cells.get(c2));
|
|
3529
|
+
else for (const [c2, cell] of cells) visit2(r, c2, cell);
|
|
3530
|
+
};
|
|
3531
|
+
if (end.row - start.row + 1 <= sheet.rows.size) {
|
|
3532
|
+
for (let r = start.row; r <= end.row; r++) {
|
|
3533
|
+
const cells = sheet.rows.get(r);
|
|
3534
|
+
if (cells) visitRow(r, cells);
|
|
3535
|
+
}
|
|
3536
|
+
} else
|
|
3537
|
+
for (const [r, cells] of sheet.rows) if (r >= start.row && r <= end.row) visitRow(r, cells);
|
|
3538
|
+
for (const [r, c2] of owned) releaseSpilledCell(sheet, r, c2);
|
|
3539
|
+
}
|
|
3540
|
+
function footprintFor(row2, col, m) {
|
|
3541
|
+
const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
|
|
3542
|
+
if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
|
|
3543
|
+
return { start: { row: row2, col }, end };
|
|
3544
|
+
}
|
|
3545
|
+
function footprintFree(sheet, footprint, row2, col, claims) {
|
|
3546
|
+
if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
|
|
3547
|
+
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
3548
|
+
const cells = sheet.rows.get(r);
|
|
3549
|
+
if (!cells) continue;
|
|
3550
|
+
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
3551
|
+
if (r === row2 && c2 === col) continue;
|
|
3552
|
+
const cell = cells.get(c2);
|
|
3553
|
+
if (!cell) continue;
|
|
3554
|
+
if (cell.formula) return false;
|
|
3555
|
+
if (isSpilledCell(cell)) {
|
|
3556
|
+
const a2 = cell.spillAnchor;
|
|
3557
|
+
if (a2.row === row2 && a2.col === col) continue;
|
|
3558
|
+
if (claims(a2, r, c2)) return false;
|
|
3559
|
+
continue;
|
|
3560
|
+
}
|
|
3561
|
+
if (cell.value !== null) return false;
|
|
3562
|
+
}
|
|
3563
|
+
}
|
|
3564
|
+
return true;
|
|
3565
|
+
}
|
|
3566
|
+
function writeFootprint(sheet, footprint, m) {
|
|
3567
|
+
const { row: row2, col } = footprint.start;
|
|
3568
|
+
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
3569
|
+
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
3570
|
+
const value3 = cellValueOf(m.get(r - row2, c2 - col));
|
|
3571
|
+
const cell = getCell(sheet, r, c2);
|
|
3572
|
+
if (r === row2 && c2 === col) {
|
|
3573
|
+
if (cell) cell.value = value3;
|
|
3574
|
+
continue;
|
|
3575
|
+
}
|
|
3576
|
+
if (cell) {
|
|
3577
|
+
cell.value = value3;
|
|
3578
|
+
if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
|
|
3579
|
+
cell.spillAnchor = { row: row2, col };
|
|
3580
|
+
} else {
|
|
3581
|
+
const spilled = { value: value3, spillAnchor: { row: row2, col } };
|
|
3582
|
+
putCell(sheet, r, c2, spilled);
|
|
3583
|
+
}
|
|
3584
|
+
}
|
|
3585
|
+
}
|
|
3586
|
+
}
|
|
3587
|
+
function fillArrayRange(sheet, range2, m) {
|
|
3588
|
+
const { row: row2, col } = range2.start;
|
|
3589
|
+
for (let r = range2.start.row; r <= range2.end.row; r++) {
|
|
3590
|
+
for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
|
|
3591
|
+
const value3 = cellValueOf(pick(m, r - row2, c2 - col));
|
|
3592
|
+
const cell = getCell(sheet, r, c2);
|
|
3593
|
+
if (cell) cell.value = value3;
|
|
3594
|
+
else putCell(sheet, r, c2, { value: value3 });
|
|
3595
|
+
}
|
|
3596
|
+
}
|
|
3597
|
+
}
|
|
3598
|
+
var cellValueOf = (value3) => value3 === null ? 0 : value3;
|
|
3599
|
+
|
|
3600
|
+
// xlsx/formula/engine-prepare.ts
|
|
3601
|
+
var CHECK_EVERY = 32;
|
|
3602
|
+
var GraphPreparation = class {
|
|
3603
|
+
constructor(workbook, create) {
|
|
3604
|
+
this.workbook = workbook;
|
|
3605
|
+
this.create = create;
|
|
3606
|
+
}
|
|
3607
|
+
workbook;
|
|
3608
|
+
create;
|
|
3609
|
+
reverse = new ReverseIndex();
|
|
3610
|
+
formulas = { dynamic: [], unvalued: [] };
|
|
3611
|
+
/**
|
|
3612
|
+
* The spills stored in the file, by sheet and anchor (`cellKey`): from the anchor to the last
|
|
3613
|
+
* row and column of the cells marked as its results. Until the anchor is evaluated they are
|
|
3614
|
+
* the only record of the cells it covers.
|
|
3615
|
+
*/
|
|
3616
|
+
spills = /* @__PURE__ */ new Map();
|
|
3617
|
+
sheet = 0;
|
|
3618
|
+
rows;
|
|
3619
|
+
row = 0;
|
|
3620
|
+
cells;
|
|
3621
|
+
finished = false;
|
|
3622
|
+
/**
|
|
3623
|
+
* Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
|
|
3624
|
+
* them) reaches zero, or until every formula is in. Returns true when the graph is complete.
|
|
3625
|
+
*/
|
|
3626
|
+
run(timeRemaining) {
|
|
3627
|
+
let visited = 0;
|
|
3628
|
+
while (!this.finished) {
|
|
3629
|
+
const cells = this.cells ?? this.nextRow();
|
|
3630
|
+
if (!cells) continue;
|
|
3631
|
+
const next = cells.next();
|
|
3632
|
+
if (next.done) {
|
|
3633
|
+
this.cells = void 0;
|
|
3634
|
+
continue;
|
|
3635
|
+
}
|
|
3636
|
+
const [col, cell] = next.value;
|
|
3637
|
+
if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
|
|
3638
|
+
else if (isSpilledCell(cell)) this.addSpilled(this.row, col, cell.spillAnchor);
|
|
3639
|
+
if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
|
|
3640
|
+
}
|
|
3641
|
+
return this.finished;
|
|
3642
|
+
}
|
|
3643
|
+
add(node2, cell) {
|
|
3644
|
+
this.reverse.addNode(node2);
|
|
3645
|
+
if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
|
|
3646
|
+
if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
|
|
3647
|
+
}
|
|
3648
|
+
addSpilled(row2, col, anchor) {
|
|
3649
|
+
if (row2 < anchor.row || col < anchor.col) return;
|
|
3650
|
+
let spills = this.spills.get(this.sheet);
|
|
3651
|
+
if (!spills) this.spills.set(this.sheet, spills = /* @__PURE__ */ new Map());
|
|
3652
|
+
const key = cellKey(anchor.row, anchor.col);
|
|
3653
|
+
const range2 = spills.get(key);
|
|
3654
|
+
if (!range2) spills.set(key, { start: { ...anchor }, end: { row: row2, col } });
|
|
3655
|
+
else {
|
|
3656
|
+
range2.end.row = Math.max(range2.end.row, row2);
|
|
3657
|
+
range2.end.col = Math.max(range2.end.col, col);
|
|
3658
|
+
}
|
|
3659
|
+
}
|
|
3660
|
+
/** Moves to the next stored row (and sheet), or marks the walk finished. */
|
|
3661
|
+
nextRow() {
|
|
3662
|
+
for (; ; ) {
|
|
3663
|
+
const sheet = this.workbook.sheets[this.sheet];
|
|
3664
|
+
if (!sheet) {
|
|
3665
|
+
this.finished = true;
|
|
3666
|
+
return void 0;
|
|
3667
|
+
}
|
|
3668
|
+
this.rows ??= sheet.rows.entries();
|
|
3669
|
+
const next = this.rows.next();
|
|
3670
|
+
if (!next.done) {
|
|
3671
|
+
this.row = next.value[0];
|
|
3672
|
+
this.cells = next.value[1].entries();
|
|
3673
|
+
return this.cells;
|
|
3674
|
+
}
|
|
3675
|
+
this.rows = void 0;
|
|
3676
|
+
this.sheet++;
|
|
3677
|
+
}
|
|
3678
|
+
}
|
|
3679
|
+
};
|
|
3680
|
+
|
|
3402
3681
|
// xlsx/formula/functions/wildcard.ts
|
|
3403
3682
|
var lower = (ch) => (ch ?? "").toLowerCase();
|
|
3404
3683
|
var fold = (text4) => Array.from({ length: text4.length }, (_, i2) => lower(text4[i2]));
|
|
@@ -6872,138 +7151,6 @@ var INFO_FUNCTIONS = [
|
|
|
6872
7151
|
)
|
|
6873
7152
|
];
|
|
6874
7153
|
|
|
6875
|
-
// xlsx/formula/operators.ts
|
|
6876
|
-
var signal = (fn) => {
|
|
6877
|
-
try {
|
|
6878
|
-
return fn();
|
|
6879
|
-
} catch (e) {
|
|
6880
|
-
if (e instanceof ErrorSignal) return e.value;
|
|
6881
|
-
throw e;
|
|
6882
|
-
}
|
|
6883
|
-
};
|
|
6884
|
-
function power(base, exponent) {
|
|
6885
|
-
if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
|
|
6886
|
-
if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
|
|
6887
|
-
if (base < 0 && !Number.isInteger(exponent)) {
|
|
6888
|
-
const inverse = 1 / exponent;
|
|
6889
|
-
const odd = Math.round(inverse);
|
|
6890
|
-
if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
|
|
6891
|
-
return -Math.pow(-base, exponent);
|
|
6892
|
-
}
|
|
6893
|
-
throw new ErrorSignal(ERR.NUM);
|
|
6894
|
-
}
|
|
6895
|
-
return Math.pow(base, exponent);
|
|
6896
|
-
}
|
|
6897
|
-
function snapToZero(result2, a2, b) {
|
|
6898
|
-
if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
|
|
6899
|
-
return result2;
|
|
6900
|
-
}
|
|
6901
|
-
function arithmetic(op2, x, y, snap) {
|
|
6902
|
-
if (isError(x)) return x;
|
|
6903
|
-
if (isError(y)) return y;
|
|
6904
|
-
return signal(() => {
|
|
6905
|
-
const a2 = toNumber(x);
|
|
6906
|
-
const b = toNumber(y);
|
|
6907
|
-
let r;
|
|
6908
|
-
switch (op2) {
|
|
6909
|
-
case "+":
|
|
6910
|
-
r = a2 + b;
|
|
6911
|
-
if (snap) r = snapToZero(r, a2, b);
|
|
6912
|
-
break;
|
|
6913
|
-
case "-":
|
|
6914
|
-
r = a2 - b;
|
|
6915
|
-
if (snap) r = snapToZero(r, a2, b);
|
|
6916
|
-
break;
|
|
6917
|
-
case "*":
|
|
6918
|
-
r = a2 * b;
|
|
6919
|
-
break;
|
|
6920
|
-
case "/":
|
|
6921
|
-
if (b === 0) return ERR.DIV0;
|
|
6922
|
-
r = a2 / b;
|
|
6923
|
-
break;
|
|
6924
|
-
default:
|
|
6925
|
-
r = power(a2, b);
|
|
6926
|
-
}
|
|
6927
|
-
return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
|
|
6928
|
-
});
|
|
6929
|
-
}
|
|
6930
|
-
function comparison(op2, x, y) {
|
|
6931
|
-
if (isError(x)) return x;
|
|
6932
|
-
if (isError(y)) return y;
|
|
6933
|
-
const c2 = compareScalars(x, y);
|
|
6934
|
-
switch (op2) {
|
|
6935
|
-
case "=":
|
|
6936
|
-
return c2 === 0;
|
|
6937
|
-
case "<>":
|
|
6938
|
-
return c2 !== 0;
|
|
6939
|
-
case "<":
|
|
6940
|
-
return c2 < 0;
|
|
6941
|
-
case ">":
|
|
6942
|
-
return c2 > 0;
|
|
6943
|
-
case "<=":
|
|
6944
|
-
return c2 <= 0;
|
|
6945
|
-
default:
|
|
6946
|
-
return c2 >= 0;
|
|
6947
|
-
}
|
|
6948
|
-
}
|
|
6949
|
-
function concat(x, y) {
|
|
6950
|
-
if (isError(x)) return x;
|
|
6951
|
-
if (isError(y)) return y;
|
|
6952
|
-
return toText(x) + toText(y);
|
|
6953
|
-
}
|
|
6954
|
-
function scalarBinary(op2, x, y, snap = false) {
|
|
6955
|
-
if (op2 === "&") return concat(x, y);
|
|
6956
|
-
if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
|
|
6957
|
-
return arithmetic(op2, x, y, snap);
|
|
6958
|
-
}
|
|
6959
|
-
return comparison(op2, x, y);
|
|
6960
|
-
}
|
|
6961
|
-
function scalarUnary(op2, x) {
|
|
6962
|
-
if (isError(x)) return x;
|
|
6963
|
-
return signal(() => {
|
|
6964
|
-
const n2 = toNumber(x);
|
|
6965
|
-
const r = op2 === "-" ? -n2 : n2 / 100;
|
|
6966
|
-
return r === 0 ? 0 : r;
|
|
6967
|
-
});
|
|
6968
|
-
}
|
|
6969
|
-
function pick(m, row2, col) {
|
|
6970
|
-
const r = m.rows === 1 ? 0 : row2;
|
|
6971
|
-
const c2 = m.cols === 1 ? 0 : col;
|
|
6972
|
-
if (r >= m.rows || c2 >= m.cols) return ERR.NA;
|
|
6973
|
-
return m.get(r, c2);
|
|
6974
|
-
}
|
|
6975
|
-
function broadcastShape(operands, at) {
|
|
6976
|
-
let rows2 = 1;
|
|
6977
|
-
let cols = 1;
|
|
6978
|
-
for (const m of operands) {
|
|
6979
|
-
rows2 = Math.max(rows2, m.rows);
|
|
6980
|
-
cols = Math.max(cols, m.cols);
|
|
6981
|
-
}
|
|
6982
|
-
if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
|
|
6983
|
-
let blockRows = 1;
|
|
6984
|
-
let blockCols = 1;
|
|
6985
|
-
for (const m of operands) {
|
|
6986
|
-
blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
|
|
6987
|
-
blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
|
|
6988
|
-
}
|
|
6989
|
-
blockRows = Math.min(blockRows, rows2);
|
|
6990
|
-
blockCols = Math.min(blockCols, cols);
|
|
6991
|
-
const varies = operands.some(
|
|
6992
|
-
(m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
|
|
6993
|
-
);
|
|
6994
|
-
if (varies) return Matrix.build(rows2, cols, at);
|
|
6995
|
-
return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
|
|
6996
|
-
}
|
|
6997
|
-
function broadcast2(a2, b, fn) {
|
|
6998
|
-
if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
|
|
6999
|
-
const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
|
|
7000
|
-
const mb = b instanceof Matrix ? b : new Matrix([[b]]);
|
|
7001
|
-
return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
|
|
7002
|
-
}
|
|
7003
|
-
function broadcast1(a2, fn) {
|
|
7004
|
-
return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
|
|
7005
|
-
}
|
|
7006
|
-
|
|
7007
7154
|
// xlsx/formula/functions/lambda.ts
|
|
7008
7155
|
var C16 = "Logical";
|
|
7009
7156
|
function lambdaArg(value3) {
|
|
@@ -11741,6 +11888,19 @@ var DEFAULT_XML_LIMITS = {
|
|
|
11741
11888
|
maxDepth: 512,
|
|
11742
11889
|
maxNodes: 5e6
|
|
11743
11890
|
};
|
|
11891
|
+
var XmlLimitError = class extends Error {
|
|
11892
|
+
code = "xml-limit";
|
|
11893
|
+
/** The limit that was exceeded. */
|
|
11894
|
+
limit;
|
|
11895
|
+
/** Its value: the largest depth or element count allowed. */
|
|
11896
|
+
maximum;
|
|
11897
|
+
constructor(message, limit2, maximum) {
|
|
11898
|
+
super(message);
|
|
11899
|
+
this.name = "XmlLimitError";
|
|
11900
|
+
this.limit = limit2;
|
|
11901
|
+
this.maximum = maximum;
|
|
11902
|
+
}
|
|
11903
|
+
};
|
|
11744
11904
|
var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
|
|
11745
11905
|
var MARKUP_SKIPS = [
|
|
11746
11906
|
["<!--", "-->"],
|
|
@@ -11774,11 +11934,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
|
|
|
11774
11934
|
continue;
|
|
11775
11935
|
}
|
|
11776
11936
|
nodes++;
|
|
11777
|
-
if (nodes > maxNodes)
|
|
11937
|
+
if (nodes > maxNodes)
|
|
11938
|
+
throw new XmlLimitError(
|
|
11939
|
+
`${label2} XML exceeds the limit of ${maxNodes} elements`,
|
|
11940
|
+
"maxNodes",
|
|
11941
|
+
maxNodes
|
|
11942
|
+
);
|
|
11778
11943
|
if (!selfClosing && ++depth > maxDepth)
|
|
11779
|
-
throw new
|
|
11944
|
+
throw new XmlLimitError(
|
|
11945
|
+
`${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
|
|
11946
|
+
"maxDepth",
|
|
11947
|
+
maxDepth
|
|
11948
|
+
);
|
|
11780
11949
|
}
|
|
11781
11950
|
}
|
|
11951
|
+
var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
|
|
11952
|
+
var crlfDeclarations = /* @__PURE__ */ new WeakSet();
|
|
11782
11953
|
function parseXml(xml, options7 = {}) {
|
|
11783
11954
|
const label2 = options7.label ?? "OOXML";
|
|
11784
11955
|
if (/<!DOCTYPE|<!ENTITY/i.test(xml))
|
|
@@ -11800,9 +11971,13 @@ function parseXml(xml, options7 = {}) {
|
|
|
11800
11971
|
}
|
|
11801
11972
|
if (parseError || !parsed.documentElement)
|
|
11802
11973
|
throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
|
|
11974
|
+
if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
|
|
11803
11975
|
return parsed;
|
|
11804
11976
|
}
|
|
11805
|
-
var buildXml = (node2) =>
|
|
11977
|
+
var buildXml = (node2) => {
|
|
11978
|
+
const xml = new xmldom.XMLSerializer().serializeToString(node2);
|
|
11979
|
+
return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
|
|
11980
|
+
};
|
|
11806
11981
|
var isElement = (node2) => node2.nodeType === 1;
|
|
11807
11982
|
var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
|
|
11808
11983
|
function named(element2, local, ns, lenient = true) {
|
|
@@ -11901,6 +12076,12 @@ function parseLiteFragment(xml, container, namespaces) {
|
|
|
11901
12076
|
}
|
|
11902
12077
|
if (lt < 0) break;
|
|
11903
12078
|
const next = source2.charCodeAt(lt + 1);
|
|
12079
|
+
if (next === 33) {
|
|
12080
|
+
const after = skipCommentOrCdata(source2, lt, top);
|
|
12081
|
+
if (after < 0) return void 0;
|
|
12082
|
+
pos = after;
|
|
12083
|
+
continue;
|
|
12084
|
+
}
|
|
11904
12085
|
if (next === 47) {
|
|
11905
12086
|
const gt = source2.indexOf(">", lt);
|
|
11906
12087
|
if (gt < 0 || stack2.length < 2 || source2.slice(lt + 2, gt).trimEnd() !== top.tagName)
|
|
@@ -11921,6 +12102,25 @@ function parseLiteFragment(xml, container, namespaces) {
|
|
|
11921
12102
|
}
|
|
11922
12103
|
return stack2.length === 1 ? root : void 0;
|
|
11923
12104
|
}
|
|
12105
|
+
var DECLARATIONS = /<!DOCTYPE|<!ENTITY/i;
|
|
12106
|
+
function skipCommentOrCdata(source2, lt, parent) {
|
|
12107
|
+
if (source2.startsWith("<!--", lt)) {
|
|
12108
|
+
const end = source2.indexOf("-->", lt + 4);
|
|
12109
|
+
if (end < 0) return -1;
|
|
12110
|
+
const body2 = source2.slice(lt + 4, end);
|
|
12111
|
+
if (body2.includes("--") || body2.endsWith("-") || DECLARATIONS.test(body2)) return -1;
|
|
12112
|
+
return end + 3;
|
|
12113
|
+
}
|
|
12114
|
+
if (source2.startsWith("<![CDATA[", lt)) {
|
|
12115
|
+
const end = source2.indexOf("]]>", lt + 9);
|
|
12116
|
+
if (end < 0) return -1;
|
|
12117
|
+
const text4 = source2.slice(lt + 9, end);
|
|
12118
|
+
if (DECLARATIONS.test(text4)) return -1;
|
|
12119
|
+
parent.childNodes.push(text4);
|
|
12120
|
+
return end + 3;
|
|
12121
|
+
}
|
|
12122
|
+
return -1;
|
|
12123
|
+
}
|
|
11924
12124
|
function startTag(source2, from, namespaces) {
|
|
11925
12125
|
const n2 = source2.length;
|
|
11926
12126
|
let i2 = from;
|
|
@@ -14894,89 +15094,6 @@ function sheetBounds(sheet) {
|
|
|
14894
15094
|
return { rows: rows2, cols };
|
|
14895
15095
|
}
|
|
14896
15096
|
|
|
14897
|
-
// xlsx/formula/spill.ts
|
|
14898
|
-
var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
|
|
14899
|
-
function releaseSpilledCell(sheet, row2, col) {
|
|
14900
|
-
const cell = getCell(sheet, row2, col);
|
|
14901
|
-
if (!isSpilledCell(cell)) return;
|
|
14902
|
-
delete cell.spillAnchor;
|
|
14903
|
-
cell.value = null;
|
|
14904
|
-
if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
|
|
14905
|
-
deleteCell(sheet, row2, col);
|
|
14906
|
-
}
|
|
14907
|
-
function clearFootprint(sheet, footprint, row2, col) {
|
|
14908
|
-
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
14909
|
-
const cells = sheet.rows.get(r);
|
|
14910
|
-
if (!cells) continue;
|
|
14911
|
-
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
14912
|
-
if (r === row2 && c2 === col) continue;
|
|
14913
|
-
const cell = cells.get(c2);
|
|
14914
|
-
if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col) {
|
|
14915
|
-
releaseSpilledCell(sheet, r, c2);
|
|
14916
|
-
}
|
|
14917
|
-
}
|
|
14918
|
-
}
|
|
14919
|
-
}
|
|
14920
|
-
function footprintFor(row2, col, m) {
|
|
14921
|
-
const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
|
|
14922
|
-
if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
|
|
14923
|
-
return { start: { row: row2, col }, end };
|
|
14924
|
-
}
|
|
14925
|
-
function footprintFree(sheet, footprint, row2, col, claims) {
|
|
14926
|
-
if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
|
|
14927
|
-
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
14928
|
-
const cells = sheet.rows.get(r);
|
|
14929
|
-
if (!cells) continue;
|
|
14930
|
-
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
14931
|
-
if (r === row2 && c2 === col) continue;
|
|
14932
|
-
const cell = cells.get(c2);
|
|
14933
|
-
if (!cell) continue;
|
|
14934
|
-
if (cell.formula) return false;
|
|
14935
|
-
if (isSpilledCell(cell)) {
|
|
14936
|
-
const a2 = cell.spillAnchor;
|
|
14937
|
-
if (a2.row === row2 && a2.col === col) continue;
|
|
14938
|
-
if (claims(a2, r, c2)) return false;
|
|
14939
|
-
continue;
|
|
14940
|
-
}
|
|
14941
|
-
if (cell.value !== null) return false;
|
|
14942
|
-
}
|
|
14943
|
-
}
|
|
14944
|
-
return true;
|
|
14945
|
-
}
|
|
14946
|
-
function writeFootprint(sheet, footprint, m) {
|
|
14947
|
-
const { row: row2, col } = footprint.start;
|
|
14948
|
-
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
14949
|
-
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
14950
|
-
const value3 = cellValueOf(m.get(r - row2, c2 - col));
|
|
14951
|
-
const cell = getCell(sheet, r, c2);
|
|
14952
|
-
if (r === row2 && c2 === col) {
|
|
14953
|
-
if (cell) cell.value = value3;
|
|
14954
|
-
continue;
|
|
14955
|
-
}
|
|
14956
|
-
if (cell) {
|
|
14957
|
-
cell.value = value3;
|
|
14958
|
-
if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
|
|
14959
|
-
cell.spillAnchor = { row: row2, col };
|
|
14960
|
-
} else {
|
|
14961
|
-
const spilled = { value: value3, spillAnchor: { row: row2, col } };
|
|
14962
|
-
putCell(sheet, r, c2, spilled);
|
|
14963
|
-
}
|
|
14964
|
-
}
|
|
14965
|
-
}
|
|
14966
|
-
}
|
|
14967
|
-
function fillArrayRange(sheet, range2, m) {
|
|
14968
|
-
const { row: row2, col } = range2.start;
|
|
14969
|
-
for (let r = range2.start.row; r <= range2.end.row; r++) {
|
|
14970
|
-
for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
|
|
14971
|
-
const value3 = cellValueOf(pick(m, r - row2, c2 - col));
|
|
14972
|
-
const cell = getCell(sheet, r, c2);
|
|
14973
|
-
if (cell) cell.value = value3;
|
|
14974
|
-
else putCell(sheet, r, c2, { value: value3 });
|
|
14975
|
-
}
|
|
14976
|
-
}
|
|
14977
|
-
}
|
|
14978
|
-
var cellValueOf = (value3) => value3 === null ? 0 : value3;
|
|
14979
|
-
|
|
14980
15097
|
// xlsx/formula/engine-host.ts
|
|
14981
15098
|
var Deferred = class {
|
|
14982
15099
|
constructor(node2) {
|
|
@@ -15901,6 +16018,8 @@ var Engine = class extends EngineStructure {
|
|
|
15901
16018
|
preparation;
|
|
15902
16019
|
/** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
|
|
15903
16020
|
prepared;
|
|
16021
|
+
/** Stored spills released when the graph was built: their readers must recalculate. */
|
|
16022
|
+
released = [];
|
|
15904
16023
|
// ---- the graph ----
|
|
15905
16024
|
prepare(timeRemaining) {
|
|
15906
16025
|
if (this.built || this.needsFull) return true;
|
|
@@ -15938,10 +16057,33 @@ var Engine = class extends EngineStructure {
|
|
|
15938
16057
|
finishPreparation(preparation) {
|
|
15939
16058
|
this.preparation = void 0;
|
|
15940
16059
|
this.built = true;
|
|
16060
|
+
this.adoptStoredSpills(preparation.spills);
|
|
15941
16061
|
this.graphChanged();
|
|
15942
16062
|
this.reverseIndex = preparation.reverse;
|
|
15943
16063
|
this.prepared = preparation.formulas;
|
|
15944
16064
|
}
|
|
16065
|
+
/**
|
|
16066
|
+
* Takes the spills a file stored as their anchors' last footprints, so that overwriting an
|
|
16067
|
+
* anchor or shrinking its result clears the cells it covered before it was ever evaluated here.
|
|
16068
|
+
* Cells marked for an anchor that holds no formula able to spill are released.
|
|
16069
|
+
*/
|
|
16070
|
+
adoptStoredSpills(spills) {
|
|
16071
|
+
for (const [s, anchors] of spills)
|
|
16072
|
+
for (const [key, range2] of anchors) {
|
|
16073
|
+
const node2 = this.nodes.get(s)?.get(key);
|
|
16074
|
+
if (node2 && !node2.legacy && !node2.arrayRange) {
|
|
16075
|
+
if (!node2.spill && !node2.blockedSpill) {
|
|
16076
|
+
node2.spill = range2;
|
|
16077
|
+
this.footprints.add(node2);
|
|
16078
|
+
}
|
|
16079
|
+
continue;
|
|
16080
|
+
}
|
|
16081
|
+
const sheet = this.workbook.sheets[s];
|
|
16082
|
+
if (!sheet) continue;
|
|
16083
|
+
clearFootprint(sheet, range2, range2.start.row, range2.start.col);
|
|
16084
|
+
this.released.push({ sheet: s, range: range2 });
|
|
16085
|
+
}
|
|
16086
|
+
}
|
|
15945
16087
|
// ---- recalculation ----
|
|
15946
16088
|
recalculateAll() {
|
|
15947
16089
|
resetArrayBudget();
|
|
@@ -15950,6 +16092,7 @@ var Engine = class extends EngineStructure {
|
|
|
15950
16092
|
if (this.needsFull) this.releaseAllSpills();
|
|
15951
16093
|
if (!this.built || this.needsFull) this.build();
|
|
15952
16094
|
this.needsFull = false;
|
|
16095
|
+
this.released = [];
|
|
15953
16096
|
this.structuralSeeds.clear();
|
|
15954
16097
|
this.cycles = /* @__PURE__ */ new Set();
|
|
15955
16098
|
this.run(new Set(this.allNodes()), true);
|
|
@@ -15968,7 +16111,9 @@ var Engine = class extends EngineStructure {
|
|
|
15968
16111
|
this.recalculateAll();
|
|
15969
16112
|
return;
|
|
15970
16113
|
}
|
|
15971
|
-
const changed =
|
|
16114
|
+
const changed = this.released;
|
|
16115
|
+
this.released = [];
|
|
16116
|
+
const written = [];
|
|
15972
16117
|
let structural = false;
|
|
15973
16118
|
for (const change of changes) {
|
|
15974
16119
|
const sheet = this.workbook.sheets[change.sheet];
|
|
@@ -15988,7 +16133,8 @@ var Engine = class extends EngineStructure {
|
|
|
15988
16133
|
seeds.add(this.createNode(change.sheet, row2, col, cell, false));
|
|
15989
16134
|
structural = true;
|
|
15990
16135
|
} else if (existing && formula) seeds.add(existing);
|
|
15991
|
-
|
|
16136
|
+
written.push(change);
|
|
16137
|
+
if (!this.footprints.size) continue;
|
|
15992
16138
|
const anchors = [];
|
|
15993
16139
|
this.footprintsBy().dependents(
|
|
15994
16140
|
change.sheet,
|
|
@@ -16005,7 +16151,8 @@ var Engine = class extends EngineStructure {
|
|
|
16005
16151
|
if (structural) this.graphChanged();
|
|
16006
16152
|
this.takeStructuralSeeds(seeds);
|
|
16007
16153
|
const reverse2 = this.reverse();
|
|
16008
|
-
for (const area of changed
|
|
16154
|
+
for (const area of [...changed, ...changeAreas(written)])
|
|
16155
|
+
reverse2.dependents(area.sheet, area.range, seeds);
|
|
16009
16156
|
for (const node2 of this.allNodes()) if (node2.volatile) seeds.add(node2);
|
|
16010
16157
|
this.run(seeds, false);
|
|
16011
16158
|
}
|
|
@@ -16018,11 +16165,17 @@ var Engine = class extends EngineStructure {
|
|
|
16018
16165
|
const prepared = this.prepared;
|
|
16019
16166
|
this.prepared = void 0;
|
|
16020
16167
|
if (!prepared) return false;
|
|
16021
|
-
const changed = new Set(changes.map((c2) => `${c2.sheet}:${cellKey(c2.row, c2.col)}`));
|
|
16022
16168
|
const current = (node2) => this.nodes.get(node2.sheet)?.get(cellKey(node2.row, node2.col)) === node2;
|
|
16023
|
-
|
|
16024
|
-
|
|
16025
|
-
|
|
16169
|
+
const dynamic = prepared.dynamic.filter(current);
|
|
16170
|
+
if (dynamic.length) {
|
|
16171
|
+
const changed = /* @__PURE__ */ new Map();
|
|
16172
|
+
for (const c2 of changes) {
|
|
16173
|
+
let keys = changed.get(c2.sheet);
|
|
16174
|
+
if (!keys) changed.set(c2.sheet, keys = /* @__PURE__ */ new Set());
|
|
16175
|
+
keys.add(cellKey(c2.row, c2.col));
|
|
16176
|
+
}
|
|
16177
|
+
for (const node2 of dynamic)
|
|
16178
|
+
if (!changed.get(node2.sheet)?.has(cellKey(node2.row, node2.col))) return false;
|
|
16026
16179
|
}
|
|
16027
16180
|
for (const node2 of prepared.unvalued) {
|
|
16028
16181
|
const cell = this.workbook.sheets[node2.sheet]?.rows.get(node2.row)?.get(node2.col);
|
|
@@ -16750,10 +16903,13 @@ var DEFAULT_ZIP_LIMITS = {
|
|
|
16750
16903
|
var ZipLimitError = class extends Error {
|
|
16751
16904
|
code = "ZIP_BOMB";
|
|
16752
16905
|
limit;
|
|
16906
|
+
/** The check that failed (absent when the error was built without one). */
|
|
16907
|
+
kind;
|
|
16753
16908
|
constructor(message, details) {
|
|
16754
16909
|
super(message);
|
|
16755
16910
|
this.name = "ZipLimitError";
|
|
16756
16911
|
this.limit = details.limit;
|
|
16912
|
+
this.kind = details.kind;
|
|
16757
16913
|
}
|
|
16758
16914
|
};
|
|
16759
16915
|
var mib = (bytes) => Math.round(bytes / 1048576);
|
|
@@ -16776,7 +16932,7 @@ function resolveLimits(limits) {
|
|
|
16776
16932
|
maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
|
|
16777
16933
|
maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
|
|
16778
16934
|
label: limits.label ?? "ZIP",
|
|
16779
|
-
fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
|
|
16935
|
+
fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
|
|
16780
16936
|
};
|
|
16781
16937
|
}
|
|
16782
16938
|
function inflateEntryGuarded(entry3, alreadyRead, limits) {
|
|
@@ -16799,13 +16955,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
|
|
|
16799
16955
|
size += chunk.byteLength;
|
|
16800
16956
|
if (size > declared || size > r.maxEntryBytes)
|
|
16801
16957
|
return abort(
|
|
16802
|
-
r.fail(
|
|
16958
|
+
r.fail(
|
|
16959
|
+
`${r.label} part ${entry3.name} inflates past its declared size`,
|
|
16960
|
+
r.maxEntryBytes,
|
|
16961
|
+
size > declared ? "declaredSize" : "maxEntryBytes"
|
|
16962
|
+
)
|
|
16803
16963
|
);
|
|
16804
16964
|
if (alreadyRead + size > r.maxTotalBytes)
|
|
16805
16965
|
return abort(
|
|
16806
16966
|
r.fail(
|
|
16807
16967
|
`${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
|
|
16808
|
-
r.maxTotalBytes
|
|
16968
|
+
r.maxTotalBytes,
|
|
16969
|
+
"maxTotalBytes"
|
|
16809
16970
|
)
|
|
16810
16971
|
);
|
|
16811
16972
|
chunks.push(chunk);
|
|
@@ -16838,26 +16999,29 @@ function guardZip(zip, limits = {}) {
|
|
|
16838
16999
|
if (entries.length > r.maxEntries)
|
|
16839
17000
|
throw r.fail(
|
|
16840
17001
|
`${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
|
|
16841
|
-
r.maxEntries
|
|
17002
|
+
r.maxEntries,
|
|
17003
|
+
"maxEntries"
|
|
16842
17004
|
);
|
|
16843
17005
|
let declared = 0;
|
|
16844
17006
|
for (const entry3 of entries) {
|
|
16845
17007
|
const original = entry3.unsafeOriginalName;
|
|
16846
17008
|
if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
|
|
16847
|
-
throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
|
|
17009
|
+
throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
|
|
16848
17010
|
if (entry3.dir) continue;
|
|
16849
17011
|
const size = declaredEntrySize(entry3);
|
|
16850
17012
|
if (size > r.maxEntryBytes)
|
|
16851
17013
|
throw r.fail(
|
|
16852
17014
|
`${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
|
|
16853
|
-
r.maxEntryBytes
|
|
17015
|
+
r.maxEntryBytes,
|
|
17016
|
+
"maxEntryBytes"
|
|
16854
17017
|
);
|
|
16855
17018
|
declared += size;
|
|
16856
17019
|
}
|
|
16857
17020
|
if (declared > r.maxTotalBytes)
|
|
16858
17021
|
throw r.fail(
|
|
16859
17022
|
`${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
|
|
16860
|
-
r.maxTotalBytes
|
|
17023
|
+
r.maxTotalBytes,
|
|
17024
|
+
"maxTotalBytes"
|
|
16861
17025
|
);
|
|
16862
17026
|
const produced = /* @__PURE__ */ new Map();
|
|
16863
17027
|
let total2 = 0;
|
|
@@ -18900,10 +19064,69 @@ function mergeComments(legacy, threaded) {
|
|
|
18900
19064
|
(a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
|
|
18901
19065
|
);
|
|
18902
19066
|
}
|
|
18903
|
-
|
|
18904
|
-
|
|
18905
|
-
var
|
|
18906
|
-
|
|
19067
|
+
|
|
19068
|
+
// xlsx/read/limits.ts
|
|
19069
|
+
var DEFAULT_XLSX_LOAD_LIMITS = {
|
|
19070
|
+
maxInputBytes: 50 * 1024 * 1024,
|
|
19071
|
+
maxParts: 1e4,
|
|
19072
|
+
maxPartBytes: 200 * 1024 * 1024,
|
|
19073
|
+
maxTotalBytes: 300 * 1024 * 1024,
|
|
19074
|
+
maxXmlElements: 5e6
|
|
19075
|
+
};
|
|
19076
|
+
var WorkbookTooLargeError = class extends Error {
|
|
19077
|
+
code = "workbook-too-large";
|
|
19078
|
+
/** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
|
|
19079
|
+
limit;
|
|
19080
|
+
/** The value of that limit when the load failed. */
|
|
19081
|
+
maximum;
|
|
19082
|
+
constructor(message, limit2, maximum, options7) {
|
|
19083
|
+
super(message, options7);
|
|
19084
|
+
this.name = "WorkbookTooLargeError";
|
|
19085
|
+
this.limit = limit2;
|
|
19086
|
+
this.maximum = maximum;
|
|
19087
|
+
}
|
|
19088
|
+
};
|
|
19089
|
+
function resolveLoadLimits(limits = {}) {
|
|
19090
|
+
const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
|
|
19091
|
+
for (const name of Object.keys(resolved)) {
|
|
19092
|
+
const value3 = limits[name];
|
|
19093
|
+
if (value3 === void 0) continue;
|
|
19094
|
+
if (!Number.isFinite(value3) || value3 <= 0)
|
|
19095
|
+
throw new RangeError(`limits.${name} must be a positive finite number`);
|
|
19096
|
+
resolved[name] = value3;
|
|
19097
|
+
}
|
|
19098
|
+
return resolved;
|
|
19099
|
+
}
|
|
19100
|
+
var ZIP_LIMIT_NAMES = {
|
|
19101
|
+
maxInputBytes: "maxInputBytes",
|
|
19102
|
+
maxEntries: "maxParts",
|
|
19103
|
+
maxEntryBytes: "maxPartBytes",
|
|
19104
|
+
maxTotalBytes: "maxTotalBytes"
|
|
19105
|
+
};
|
|
19106
|
+
function zipLimitsFor(limits) {
|
|
19107
|
+
return {
|
|
19108
|
+
maxInputBytes: limits.maxInputBytes,
|
|
19109
|
+
maxEntries: limits.maxParts,
|
|
19110
|
+
maxEntryBytes: limits.maxPartBytes,
|
|
19111
|
+
maxTotalBytes: limits.maxTotalBytes,
|
|
19112
|
+
label: "XLSX",
|
|
19113
|
+
createError: (message, { limit: limit2, kind }) => {
|
|
19114
|
+
const name = ZIP_LIMIT_NAMES[kind];
|
|
19115
|
+
return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
|
|
19116
|
+
}
|
|
19117
|
+
};
|
|
19118
|
+
}
|
|
19119
|
+
function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
|
|
19120
|
+
try {
|
|
19121
|
+
return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
|
|
19122
|
+
} catch (error) {
|
|
19123
|
+
if (error instanceof XmlLimitError && error.limit === "maxNodes")
|
|
19124
|
+
throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
|
|
19125
|
+
cause: error
|
|
19126
|
+
});
|
|
19127
|
+
throw error;
|
|
19128
|
+
}
|
|
19129
|
+
}
|
|
18907
19130
|
var CONTENT_TYPES = {
|
|
18908
19131
|
workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
|
|
18909
19132
|
workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
|
|
@@ -18993,16 +19216,15 @@ var SourceIndex = class {
|
|
|
18993
19216
|
};
|
|
18994
19217
|
var mib2 = (bytes) => Math.round(bytes / 1048576);
|
|
18995
19218
|
async function readZipParts(input, limits = {}) {
|
|
18996
|
-
const
|
|
18997
|
-
const
|
|
18998
|
-
maxEntries: limits.maxParts ?? MAX_PARTS,
|
|
18999
|
-
maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
|
|
19000
|
-
maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
|
|
19001
|
-
label: "XLSX"
|
|
19002
|
-
};
|
|
19219
|
+
const resolved = resolveLoadLimits(limits);
|
|
19220
|
+
const maxInput = resolved.maxInputBytes;
|
|
19003
19221
|
const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
|
|
19004
19222
|
if (bytes.byteLength > maxInput)
|
|
19005
|
-
throw new
|
|
19223
|
+
throw new WorkbookTooLargeError(
|
|
19224
|
+
`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
|
|
19225
|
+
"maxInputBytes",
|
|
19226
|
+
maxInput
|
|
19227
|
+
);
|
|
19006
19228
|
let loaded;
|
|
19007
19229
|
try {
|
|
19008
19230
|
loaded = await JSZip2__default.default.loadAsync(bytes);
|
|
@@ -19012,7 +19234,7 @@ async function readZipParts(input, limits = {}) {
|
|
|
19012
19234
|
{ cause: error }
|
|
19013
19235
|
);
|
|
19014
19236
|
}
|
|
19015
|
-
const zip = guardZip(loaded,
|
|
19237
|
+
const zip = guardZip(loaded, zipLimitsFor(resolved));
|
|
19016
19238
|
const parts = /* @__PURE__ */ new Map();
|
|
19017
19239
|
for (const entry3 of Object.values(zip.files)) {
|
|
19018
19240
|
if (entry3.dir) continue;
|
|
@@ -19219,9 +19441,9 @@ function parseRichString(element2, palette) {
|
|
|
19219
19441
|
const text4 = parsed.map((run2) => run2.text).join("");
|
|
19220
19442
|
return { text: text4, runs: parsed };
|
|
19221
19443
|
}
|
|
19222
|
-
function parseSharedStrings(xml, palette) {
|
|
19444
|
+
function parseSharedStrings(xml, palette, maxXmlElements) {
|
|
19223
19445
|
if (!xml) return [];
|
|
19224
|
-
const root =
|
|
19446
|
+
const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
|
|
19225
19447
|
return xChildren(root, "si").map((si) => parseRichString(si, palette));
|
|
19226
19448
|
}
|
|
19227
19449
|
|
|
@@ -24594,21 +24816,50 @@ function rootNamespaces(xml) {
|
|
|
24594
24816
|
for (const match2 of (root[2] ?? "").matchAll(DECLARATION2)) out[match2[1] ?? ""] = match2[3] ?? "";
|
|
24595
24817
|
return out;
|
|
24596
24818
|
}
|
|
24819
|
+
var SPECIAL = /<[!?]/g;
|
|
24820
|
+
var SECTIONS = [
|
|
24821
|
+
["<!--", "-->"],
|
|
24822
|
+
["<![CDATA[", "]]>"],
|
|
24823
|
+
["<?", "?>"]
|
|
24824
|
+
];
|
|
24825
|
+
function blankComments(xml) {
|
|
24826
|
+
if (!xml.includes("<!--") && !xml.includes("<![CDATA[")) return xml;
|
|
24827
|
+
const pieces = [];
|
|
24828
|
+
let copied = 0;
|
|
24829
|
+
SPECIAL.lastIndex = 0;
|
|
24830
|
+
for (let match2 = SPECIAL.exec(xml); match2; match2 = SPECIAL.exec(xml)) {
|
|
24831
|
+
const at = match2.index;
|
|
24832
|
+
const section = SECTIONS.find(([open2]) => xml.startsWith(open2, at));
|
|
24833
|
+
if (!section) return void 0;
|
|
24834
|
+
const [open, close2] = section;
|
|
24835
|
+
const end = xml.indexOf(close2, at + open.length);
|
|
24836
|
+
if (end < 0) return void 0;
|
|
24837
|
+
const after = end + close2.length;
|
|
24838
|
+
if (open !== "<?") {
|
|
24839
|
+
pieces.push(xml.slice(copied, at), " ".repeat(after - at));
|
|
24840
|
+
copied = after;
|
|
24841
|
+
}
|
|
24842
|
+
SPECIAL.lastIndex = after;
|
|
24843
|
+
}
|
|
24844
|
+
pieces.push(xml.slice(copied));
|
|
24845
|
+
return pieces.join("");
|
|
24846
|
+
}
|
|
24597
24847
|
function splitSheetData(xml) {
|
|
24598
|
-
|
|
24599
|
-
|
|
24600
|
-
const
|
|
24848
|
+
const plain3 = blankComments(xml);
|
|
24849
|
+
if (plain3 === void 0) return void 0;
|
|
24850
|
+
const namespaces = rootNamespaces(plain3);
|
|
24851
|
+
const open = OPEN.exec(plain3);
|
|
24601
24852
|
if (!namespaces || !open) return void 0;
|
|
24602
24853
|
const prefix = (open[1] ?? "").slice(0, -1);
|
|
24603
24854
|
const ns = namespaces[prefix];
|
|
24604
24855
|
if (prefix && ns === void 0) return void 0;
|
|
24605
24856
|
const tagName = `${open[1] ?? ""}sheetData`;
|
|
24606
|
-
const openEnd =
|
|
24857
|
+
const openEnd = plain3.indexOf(">", open.index);
|
|
24607
24858
|
if (openEnd < 0) return void 0;
|
|
24608
|
-
const attributes =
|
|
24859
|
+
const attributes = plain3.slice(open.index + tagName.length + 1, openEnd);
|
|
24609
24860
|
if (attributes.trimEnd().endsWith("/") || attributes.includes("xmlns")) return void 0;
|
|
24610
|
-
const close2 =
|
|
24611
|
-
if (close2 < 0 || OPEN.test(
|
|
24861
|
+
const close2 = plain3.indexOf(`</${tagName}`, openEnd);
|
|
24862
|
+
if (close2 < 0 || OPEN.test(plain3.slice(openEnd))) return void 0;
|
|
24612
24863
|
const container = new LiteElement(tagName, "sheetData", ns || null);
|
|
24613
24864
|
const data = parseLiteFragment(xml.slice(openEnd + 1, close2), container, namespaces);
|
|
24614
24865
|
if (!data) return void 0;
|
|
@@ -24813,7 +25064,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
|
|
|
24813
25064
|
return sheet;
|
|
24814
25065
|
}
|
|
24815
25066
|
const split = splitSheetData(xml);
|
|
24816
|
-
const root =
|
|
25067
|
+
const root = parseDataXml(
|
|
25068
|
+
split?.xml ?? xml,
|
|
25069
|
+
"XLSX worksheet",
|
|
25070
|
+
ctx.maxXmlElements
|
|
25071
|
+
).documentElement;
|
|
24817
25072
|
const byName = /* @__PURE__ */ new Map();
|
|
24818
25073
|
const cfBlocks = [];
|
|
24819
25074
|
for (const node2 of elements(root)) {
|
|
@@ -24887,8 +25142,9 @@ function liftPrintAreas(workbook) {
|
|
|
24887
25142
|
return false;
|
|
24888
25143
|
});
|
|
24889
25144
|
}
|
|
24890
|
-
async function loadXlsx(input) {
|
|
24891
|
-
const
|
|
25145
|
+
async function loadXlsx(input, options7 = {}) {
|
|
25146
|
+
const limits = resolveLoadLimits(options7.limits);
|
|
25147
|
+
const parts = await readZipParts(input, limits);
|
|
24892
25148
|
const source2 = new SourceIndex(parts);
|
|
24893
25149
|
const workbookPart = source2.workbookPart();
|
|
24894
25150
|
if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
|
|
@@ -24909,7 +25165,8 @@ async function loadXlsx(input) {
|
|
|
24909
25165
|
source: source2,
|
|
24910
25166
|
sharedStrings: parseSharedStrings(
|
|
24911
25167
|
stringsPart ? source2.text(stringsPart) : void 0,
|
|
24912
|
-
styles.palette
|
|
25168
|
+
styles.palette,
|
|
25169
|
+
limits.maxXmlElements
|
|
24913
25170
|
),
|
|
24914
25171
|
xfMap: styles.xfMap,
|
|
24915
25172
|
date1904: book.date1904,
|
|
@@ -24917,7 +25174,8 @@ async function loadXlsx(input) {
|
|
|
24917
25174
|
dxfs: styles.dxfs,
|
|
24918
25175
|
persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
|
|
24919
25176
|
dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
|
|
24920
|
-
warn
|
|
25177
|
+
warn,
|
|
25178
|
+
maxXmlElements: limits.maxXmlElements
|
|
24921
25179
|
};
|
|
24922
25180
|
const rels = source2.rels(workbookPart);
|
|
24923
25181
|
const sheets = book.sheets.map((entry3) => {
|
|
@@ -29229,10 +29487,8 @@ function sheetFormatXml(sheet) {
|
|
|
29229
29487
|
const current = { defaultRowHeight: sheet.defaultRowHeight };
|
|
29230
29488
|
if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
|
|
29231
29489
|
if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
|
|
29232
|
-
|
|
29233
|
-
|
|
29234
|
-
...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
|
|
29235
|
-
);
|
|
29490
|
+
let rowLevel = 0;
|
|
29491
|
+
for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
|
|
29236
29492
|
const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
|
|
29237
29493
|
if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
|
|
29238
29494
|
return snapshotXml(sheet, "sheetFormatPr") ?? "";
|
|
@@ -29534,11 +29790,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
|
|
|
29534
29790
|
const items = data.items[index3];
|
|
29535
29791
|
if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
|
|
29536
29792
|
const serials = items;
|
|
29537
|
-
const
|
|
29538
|
-
const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
|
|
29793
|
+
const range2 = dateGroupRange({}, serials);
|
|
29539
29794
|
const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
|
|
29540
29795
|
const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
|
|
29541
|
-
return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(
|
|
29796
|
+
return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(range2.start), maxDate: iso(range2.end), count: serials.length })}>${serials.map((serial) => `<d v="${iso(serial)}"/>`).join("")}</sharedItems>${link}</cacheField>`;
|
|
29542
29797
|
}
|
|
29543
29798
|
const types = new Set(
|
|
29544
29799
|
items.map((value3) => value3 === null || value3 === "" ? "blank" : typeof value3)
|
|
@@ -30953,7 +31208,8 @@ function setCellValue(ctx, s, row2, col, value3) {
|
|
|
30953
31208
|
}
|
|
30954
31209
|
function setRangeValues(ctx, s, at, values2) {
|
|
30955
31210
|
const sheet = sheetAt(ctx.workbook, s);
|
|
30956
|
-
|
|
31211
|
+
let width = 0;
|
|
31212
|
+
for (const row2 of values2) width = Math.max(width, row2.length);
|
|
30957
31213
|
if (!values2.length || !width) return;
|
|
30958
31214
|
const range2 = cellRange(at.row, at.col, at.row + values2.length - 1, at.col + width - 1);
|
|
30959
31215
|
ctx.run(
|
|
@@ -32277,23 +32533,33 @@ function toHtml(cells, theme2) {
|
|
|
32277
32533
|
for (let c2 = m.start.col; c2 <= m.end.col; c2++)
|
|
32278
32534
|
if (r !== m.start.row || c2 !== m.start.col) covered.add(`${r},${c2}`);
|
|
32279
32535
|
}
|
|
32536
|
+
const styleAttrs = /* @__PURE__ */ new Map();
|
|
32537
|
+
const styleAttr2 = (style3) => {
|
|
32538
|
+
let attr2 = styleAttrs.get(style3);
|
|
32539
|
+
if (attr2 === void 0) {
|
|
32540
|
+
const css = cssFor(style3, theme2);
|
|
32541
|
+
styleAttrs.set(style3, attr2 = css ? `style="${escapeHtml(css)}"` : "");
|
|
32542
|
+
}
|
|
32543
|
+
return attr2;
|
|
32544
|
+
};
|
|
32280
32545
|
const rows2 = [];
|
|
32281
32546
|
for (let r = 0; r < cells.rows; r++) {
|
|
32282
32547
|
const tds = [];
|
|
32283
32548
|
for (let c2 = 0; c2 < cells.cols; c2++) {
|
|
32284
|
-
|
|
32549
|
+
const key = covered.size || spans3.size || links.size ? `${r},${c2}` : "";
|
|
32550
|
+
if (covered.has(key)) continue;
|
|
32285
32551
|
const cell = cells.data[r]?.[c2] ?? null;
|
|
32286
32552
|
const attrs2 = [];
|
|
32287
|
-
const span4 = spans3.get(
|
|
32553
|
+
const span4 = spans3.get(key);
|
|
32288
32554
|
if (span4 && span4.end.row > span4.start.row)
|
|
32289
32555
|
attrs2.push(`rowspan="${span4.end.row - span4.start.row + 1}"`);
|
|
32290
32556
|
if (span4 && span4.end.col > span4.start.col)
|
|
32291
32557
|
attrs2.push(`colspan="${span4.end.col - span4.start.col + 1}"`);
|
|
32292
32558
|
if (cell && typeof cell.value === "number") attrs2.push(`x:num="${cell.value}"`);
|
|
32293
|
-
const css =
|
|
32294
|
-
if (css) attrs2.push(
|
|
32559
|
+
const css = styleAttr2(cell?.style);
|
|
32560
|
+
if (css) attrs2.push(css);
|
|
32295
32561
|
let text4 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
|
|
32296
|
-
const link = links.get(
|
|
32562
|
+
const link = links.get(key);
|
|
32297
32563
|
const href = htmlHref(link);
|
|
32298
32564
|
if (href)
|
|
32299
32565
|
text4 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text4}</a>`;
|
|
@@ -32601,7 +32867,8 @@ function parseTsv(text4) {
|
|
|
32601
32867
|
}
|
|
32602
32868
|
row2.push(field);
|
|
32603
32869
|
rows2.push(row2);
|
|
32604
|
-
|
|
32870
|
+
let width = 0;
|
|
32871
|
+
for (const r of rows2) width = Math.max(width, r.length);
|
|
32605
32872
|
for (const r of rows2) while (r.length < width) r.push("");
|
|
32606
32873
|
return rows2;
|
|
32607
32874
|
}
|
|
@@ -32856,10 +33123,16 @@ function copyRange(workbook, s, range2) {
|
|
|
32856
33123
|
{ length: rows2 },
|
|
32857
33124
|
() => Array.from({ length: cols }, () => null)
|
|
32858
33125
|
);
|
|
33126
|
+
const styles = /* @__PURE__ */ new Map();
|
|
33127
|
+
const styleCopy = (id) => {
|
|
33128
|
+
let style3 = styles.get(id ?? 0);
|
|
33129
|
+
if (!style3) styles.set(id ?? 0, style3 = structuredClone(styleAt(workbook, id)));
|
|
33130
|
+
return style3;
|
|
33131
|
+
};
|
|
32859
33132
|
forEachCellInRange(sheet, clipped, (cell, row2, col) => {
|
|
32860
33133
|
const clip = {
|
|
32861
33134
|
value: cell.value,
|
|
32862
|
-
style:
|
|
33135
|
+
style: styleCopy(cell.styleId),
|
|
32863
33136
|
text: displayText(workbook, cell)
|
|
32864
33137
|
};
|
|
32865
33138
|
if (cell.formula !== void 0) clip.formula = cell.formula;
|
|
@@ -33137,7 +33410,7 @@ function setColumnWidth(ctx, s, cols, width, measure3) {
|
|
|
33137
33410
|
ctx.run(
|
|
33138
33411
|
"Column width",
|
|
33139
33412
|
"view",
|
|
33140
|
-
[{ kind: "
|
|
33413
|
+
[{ kind: "parts", sheet: s, parts: ["columns"] }],
|
|
33141
33414
|
() => editColumns(sheet, cols, (info) => {
|
|
33142
33415
|
const next = widths.get(info.min);
|
|
33143
33416
|
if (next === void 0) {
|
|
@@ -33172,7 +33445,7 @@ function setRowHeight(ctx, s, rows2, height) {
|
|
|
33172
33445
|
ctx.run(
|
|
33173
33446
|
"Row height",
|
|
33174
33447
|
"view",
|
|
33175
|
-
[{ kind: "
|
|
33448
|
+
[{ kind: "rowInfo", sheet: s, rows: rows2 }],
|
|
33176
33449
|
() => {
|
|
33177
33450
|
for (const row2 of rows2) {
|
|
33178
33451
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
@@ -33202,7 +33475,9 @@ function setHidden(ctx, s, axis, indices, hidden) {
|
|
|
33202
33475
|
ctx.run(
|
|
33203
33476
|
`${hidden ? "Hide" : "Unhide"} ${noun}`,
|
|
33204
33477
|
"view",
|
|
33205
|
-
[
|
|
33478
|
+
[
|
|
33479
|
+
axis === "col" ? { kind: "parts", sheet: s, parts: ["columns"] } : { kind: "rowInfo", sheet: s, rows: indices }
|
|
33480
|
+
],
|
|
33206
33481
|
() => {
|
|
33207
33482
|
if (axis === "col") {
|
|
33208
33483
|
editColumns(sheet, indices, (info) => {
|
|
@@ -33796,6 +34071,30 @@ function shiftEdgeCells(sheet, spec2, phase) {
|
|
|
33796
34071
|
return out;
|
|
33797
34072
|
}
|
|
33798
34073
|
|
|
34074
|
+
// xlsx/edit/clone-cell.ts
|
|
34075
|
+
function cloneCell(cell) {
|
|
34076
|
+
const copy2 = { ...cell };
|
|
34077
|
+
const fields = copy2;
|
|
34078
|
+
for (const key of Object.keys(fields)) {
|
|
34079
|
+
const value3 = fields[key];
|
|
34080
|
+
if (typeof value3 === "object" && value3 !== null) fields[key] = structuredClone(value3);
|
|
34081
|
+
}
|
|
34082
|
+
return copy2;
|
|
34083
|
+
}
|
|
34084
|
+
|
|
34085
|
+
// xlsx/edit/history-rows.ts
|
|
34086
|
+
function captureRowInfo(sheet, rows2) {
|
|
34087
|
+
return [...new Set(rows2)].map((row2) => {
|
|
34088
|
+
const info = sheet.rowInfo.get(row2);
|
|
34089
|
+
return [row2, info && structuredClone(info)];
|
|
34090
|
+
});
|
|
34091
|
+
}
|
|
34092
|
+
function restoreRowInfo(sheet, entries) {
|
|
34093
|
+
for (const [row2, info] of entries)
|
|
34094
|
+
if (info) sheet.rowInfo.set(row2, structuredClone(info));
|
|
34095
|
+
else sheet.rowInfo.delete(row2);
|
|
34096
|
+
}
|
|
34097
|
+
|
|
33799
34098
|
// xlsx/edit/history.ts
|
|
33800
34099
|
var SETTING_KEYS = [
|
|
33801
34100
|
"structureLocked",
|
|
@@ -33823,12 +34122,14 @@ function restoreSettings(workbook, settings) {
|
|
|
33823
34122
|
var PROBE_LIMIT = 4096;
|
|
33824
34123
|
function captureCells(sheet, ranges) {
|
|
33825
34124
|
const cells = [];
|
|
33826
|
-
const seen = /* @__PURE__ */ new Set();
|
|
34125
|
+
const seen = ranges.length > 1 ? /* @__PURE__ */ new Set() : void 0;
|
|
33827
34126
|
const take2 = (cell, row2, col) => {
|
|
33828
|
-
|
|
33829
|
-
|
|
33830
|
-
|
|
33831
|
-
|
|
34127
|
+
if (seen) {
|
|
34128
|
+
const key = cellKey(row2, col);
|
|
34129
|
+
if (seen.has(key)) return;
|
|
34130
|
+
seen.add(key);
|
|
34131
|
+
}
|
|
34132
|
+
cells.push([row2, col, cloneCell(cell)]);
|
|
33832
34133
|
};
|
|
33833
34134
|
for (const raw2 of ranges) {
|
|
33834
34135
|
const range2 = normalizeRange(raw2);
|
|
@@ -33880,6 +34181,8 @@ function captureScope(workbook, scope, before) {
|
|
|
33880
34181
|
if (!sheet) throw new RangeError(`No sheet at index ${scope.sheet}`);
|
|
33881
34182
|
if (scope.kind === "sheet")
|
|
33882
34183
|
return { kind: "sheet", sheet: scope.sheet, data: structuredClone(sheet) };
|
|
34184
|
+
if (scope.kind === "rowInfo")
|
|
34185
|
+
return { kind: "rowInfo", sheet: scope.sheet, rows: captureRowInfo(sheet, scope.rows) };
|
|
33883
34186
|
if (scope.kind === "parts") {
|
|
33884
34187
|
const data = {};
|
|
33885
34188
|
for (const part of scope.parts) if (sheet[part] !== void 0) data[part] = sheet[part];
|
|
@@ -33903,7 +34206,7 @@ function restoreShift(workbook, snapshot) {
|
|
|
33903
34206
|
if (!sheet) return;
|
|
33904
34207
|
const shift2 = snapshot.phase === "before" ? { ...spec2.shift, count: -spec2.shift.count } : spec2.shift;
|
|
33905
34208
|
moveCellsRaw(sheet, shift2, spec2.band);
|
|
33906
|
-
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col,
|
|
34209
|
+
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
|
|
33907
34210
|
restoreRefs(workbook, snapshot.data);
|
|
33908
34211
|
workbook.activeSheet = snapshot.activeSheet;
|
|
33909
34212
|
}
|
|
@@ -33931,6 +34234,7 @@ function restoreSnapshot(workbook, snapshot) {
|
|
|
33931
34234
|
}
|
|
33932
34235
|
const sheet = workbook.sheets[snapshot.sheet];
|
|
33933
34236
|
if (!sheet) return;
|
|
34237
|
+
if (snapshot.kind === "rowInfo") return restoreRowInfo(sheet, snapshot.rows);
|
|
33934
34238
|
if (snapshot.kind === "parts") {
|
|
33935
34239
|
const target2 = sheet;
|
|
33936
34240
|
const data = structuredClone(snapshot.data);
|
|
@@ -33951,18 +34255,51 @@ function restoreSnapshot(workbook, snapshot) {
|
|
|
33951
34255
|
forEachCellInRange(sheet, range2, (_cell, row2, col) => doomed.push([row2, col]));
|
|
33952
34256
|
for (const [row2, col] of doomed) deleteCell(sheet, row2, col);
|
|
33953
34257
|
}
|
|
33954
|
-
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col,
|
|
34258
|
+
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
|
|
34259
|
+
}
|
|
34260
|
+
function rowMajor(cells) {
|
|
34261
|
+
for (let i2 = 1; i2 < cells.length; i2++) {
|
|
34262
|
+
const [row0, col0] = cells[i2 - 1];
|
|
34263
|
+
const [row1, col1] = cells[i2];
|
|
34264
|
+
if (row1 < row0 || row1 === row0 && col1 <= col0) return false;
|
|
34265
|
+
}
|
|
34266
|
+
return true;
|
|
33955
34267
|
}
|
|
33956
34268
|
function touchedCells(step) {
|
|
33957
34269
|
const out = [];
|
|
33958
|
-
const
|
|
34270
|
+
const lists = step.entries.flatMap((entry3) => [entry3.before, entry3.after]).filter((snapshot) => snapshot.kind === "cells" && snapshot.cells.length > 0);
|
|
34271
|
+
const [first2, second, ...rest] = lists;
|
|
34272
|
+
if (first2 && !rest.length && (!second || second.sheet === first2.sheet)) {
|
|
34273
|
+
const sheet = first2.sheet;
|
|
34274
|
+
for (const [row2, col] of first2.cells) out.push({ sheet, row: row2, col });
|
|
34275
|
+
if (!second) return out;
|
|
34276
|
+
if (rowMajor(first2.cells) && rowMajor(second.cells)) {
|
|
34277
|
+
let i2 = 0;
|
|
34278
|
+
for (const [row2, col] of second.cells) {
|
|
34279
|
+
const key = cellKey(row2, col);
|
|
34280
|
+
while (i2 < first2.cells.length) {
|
|
34281
|
+
const [r, c2] = first2.cells[i2];
|
|
34282
|
+
if (cellKey(r, c2) >= key) break;
|
|
34283
|
+
i2++;
|
|
34284
|
+
}
|
|
34285
|
+
const at = first2.cells[i2];
|
|
34286
|
+
if (at && cellKey(at[0], at[1]) === key) continue;
|
|
34287
|
+
out.push({ sheet, row: row2, col });
|
|
34288
|
+
}
|
|
34289
|
+
return out;
|
|
34290
|
+
}
|
|
34291
|
+
out.length = 0;
|
|
34292
|
+
}
|
|
34293
|
+
const seen = /* @__PURE__ */ new Map();
|
|
33959
34294
|
for (const entry3 of step.entries)
|
|
33960
34295
|
for (const snapshot of [entry3.before, entry3.after]) {
|
|
33961
34296
|
if (snapshot.kind !== "cells") continue;
|
|
34297
|
+
let keys = seen.get(snapshot.sheet);
|
|
34298
|
+
if (!keys) seen.set(snapshot.sheet, keys = /* @__PURE__ */ new Set());
|
|
33962
34299
|
for (const [row2, col] of snapshot.cells) {
|
|
33963
|
-
const key =
|
|
33964
|
-
if (
|
|
33965
|
-
|
|
34300
|
+
const key = cellKey(row2, col);
|
|
34301
|
+
if (keys.has(key)) continue;
|
|
34302
|
+
keys.add(key);
|
|
33966
34303
|
out.push({ sheet: snapshot.sheet, row: row2, col });
|
|
33967
34304
|
}
|
|
33968
34305
|
}
|
|
@@ -34059,7 +34396,7 @@ var SessionCalculator = class {
|
|
|
34059
34396
|
}
|
|
34060
34397
|
this.calc.discardPreparation();
|
|
34061
34398
|
if (structural) this.staleGraph = true;
|
|
34062
|
-
else this.dirty.push(
|
|
34399
|
+
else for (const cell of touchedCells(step)) this.dirty.push(cell);
|
|
34063
34400
|
return;
|
|
34064
34401
|
}
|
|
34065
34402
|
if (hint && !this.staleGraph) {
|
|
@@ -34078,7 +34415,7 @@ var SessionCalculator = class {
|
|
|
34078
34415
|
this.calc.discardPreparation();
|
|
34079
34416
|
if (!this.enabled) return;
|
|
34080
34417
|
if (structural) this.staleGraph = true;
|
|
34081
|
-
else this.dirty.push(
|
|
34418
|
+
else for (const cell of cells) this.dirty.push(cell);
|
|
34082
34419
|
return;
|
|
34083
34420
|
}
|
|
34084
34421
|
this.recalc(structural, () => cells);
|
|
@@ -35140,8 +35477,16 @@ function insertTimeline(ctx, s, ref) {
|
|
|
35140
35477
|
const pivot = sheet.pivotTables?.find((entry3) => entry3.name === ref.pivot);
|
|
35141
35478
|
if (!pivot || !pivot.dateFields?.includes(ref.field))
|
|
35142
35479
|
throw new Error("Choose a PivotTable with a date field.");
|
|
35143
|
-
const
|
|
35144
|
-
|
|
35480
|
+
const column2 = pivot.fields.indexOf(ref.field);
|
|
35481
|
+
let earliest = Infinity;
|
|
35482
|
+
let latest = -Infinity;
|
|
35483
|
+
for (const record of pivot.records) {
|
|
35484
|
+
const value3 = record[column2];
|
|
35485
|
+
if (typeof value3 !== "number") continue;
|
|
35486
|
+
earliest = Math.min(earliest, value3);
|
|
35487
|
+
latest = Math.max(latest, value3);
|
|
35488
|
+
}
|
|
35489
|
+
if (earliest > latest) throw new Error("Choose a PivotTable with a date field.");
|
|
35145
35490
|
const taken = /* @__PURE__ */ new Set([
|
|
35146
35491
|
...(workbook.slicers?.slicers ?? []).map((entry3) => entry3.name.toLowerCase()),
|
|
35147
35492
|
...(workbook.slicers?.timelines ?? []).map((entry3) => entry3.name.toLowerCase()),
|
|
@@ -35159,8 +35504,8 @@ function insertTimeline(ctx, s, ref) {
|
|
|
35159
35504
|
"_"
|
|
35160
35505
|
);
|
|
35161
35506
|
const bounds = boundsOfSerialRange(
|
|
35162
|
-
serialToIso(
|
|
35163
|
-
serialToIso(
|
|
35507
|
+
serialToIso(earliest, workbook.date1904),
|
|
35508
|
+
serialToIso(latest, workbook.date1904)
|
|
35164
35509
|
);
|
|
35165
35510
|
const metrics = createGridMetrics(sheet, { zoom: 100 });
|
|
35166
35511
|
let right2 = 0;
|
|
@@ -36323,12 +36668,13 @@ function span2(from, to) {
|
|
|
36323
36668
|
}
|
|
36324
36669
|
function outlineRows(ctx, s, from, to, delta) {
|
|
36325
36670
|
const sheet = sheetAt(ctx.workbook, s);
|
|
36671
|
+
const rows2 = span2(from, to);
|
|
36326
36672
|
ctx.run(
|
|
36327
36673
|
delta > 0 ? "Group rows" : "Ungroup rows",
|
|
36328
36674
|
"structure",
|
|
36329
|
-
[{ kind: "
|
|
36675
|
+
[{ kind: "rowInfo", sheet: s, rows: rows2 }],
|
|
36330
36676
|
() => {
|
|
36331
|
-
for (const row2 of
|
|
36677
|
+
for (const row2 of rows2) {
|
|
36332
36678
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
36333
36679
|
const level2 = nextLevel(info.outlineLevel, delta);
|
|
36334
36680
|
if (level2) info.outlineLevel = level2;
|
|
@@ -36348,7 +36694,7 @@ function outlineColumns(ctx, s, from, to, delta) {
|
|
|
36348
36694
|
ctx.run(
|
|
36349
36695
|
delta > 0 ? "Group columns" : "Ungroup columns",
|
|
36350
36696
|
"structure",
|
|
36351
|
-
[{ kind: "
|
|
36697
|
+
[{ kind: "parts", sheet: s, parts: ["columns"] }],
|
|
36352
36698
|
() => editColumns(sheet, span2(from, to), (info) => {
|
|
36353
36699
|
const level2 = nextLevel(info.outlineLevel, delta);
|
|
36354
36700
|
if (level2) info.outlineLevel = level2;
|
|
@@ -36371,7 +36717,7 @@ function setDefaultColumnWidth(ctx, s, width) {
|
|
|
36371
36717
|
ctx.run(
|
|
36372
36718
|
"Standard width",
|
|
36373
36719
|
"format",
|
|
36374
|
-
[{ kind: "
|
|
36720
|
+
[{ kind: "parts", sheet: s, parts: ["defaultColWidth"] }],
|
|
36375
36721
|
() => {
|
|
36376
36722
|
if (width === void 0) Reflect.deleteProperty(sheet, "defaultColWidth");
|
|
36377
36723
|
else sheet.defaultColWidth = width;
|
|
@@ -38573,6 +38919,15 @@ function mergeFont(base, font) {
|
|
|
38573
38919
|
if (value3 !== void 0) out[key] = value3;
|
|
38574
38920
|
return out;
|
|
38575
38921
|
}
|
|
38922
|
+
function cellFont(font, defaultFont) {
|
|
38923
|
+
const out = { ...font };
|
|
38924
|
+
if (!out.name && !out.scheme) {
|
|
38925
|
+
if (defaultFont.name) out.name = defaultFont.name;
|
|
38926
|
+
if (defaultFont.scheme) out.scheme = defaultFont.scheme;
|
|
38927
|
+
}
|
|
38928
|
+
if (!out.size && defaultFont.size) out.size = defaultFont.size;
|
|
38929
|
+
return out;
|
|
38930
|
+
}
|
|
38576
38931
|
function fontView(font, theme2) {
|
|
38577
38932
|
const family = font.scheme === "major" ? theme2.majorFont || font.name || "Calibri Light" : font.scheme === "minor" ? theme2.minorFont || font.name || "Calibri" : font.name || theme2.minorFont || "Calibri";
|
|
38578
38933
|
const view = {
|
|
@@ -38697,14 +39052,7 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options7 = {}) {
|
|
|
38697
39052
|
const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
|
|
38698
39053
|
const conditional = cf?.at(row2, col);
|
|
38699
39054
|
const dxf = conditional?.style;
|
|
38700
|
-
const
|
|
38701
|
-
const base = { ...style3.font };
|
|
38702
|
-
if (!base.name && !base.scheme) {
|
|
38703
|
-
if (defaultFont.name) base.name = defaultFont.name;
|
|
38704
|
-
if (defaultFont.scheme) base.scheme = defaultFont.scheme;
|
|
38705
|
-
}
|
|
38706
|
-
if (!base.size && defaultFont.size) base.size = defaultFont.size;
|
|
38707
|
-
const font = mergeFont(base, dxf?.font);
|
|
39055
|
+
const font = mergeFont(cellFont(style3.font, workbook.styles[0]?.font ?? {}), dxf?.font);
|
|
38708
39056
|
const formulaText = sheet.view.showFormulas && cell?.formula !== void 0 ? `=${cell.formula}` : void 0;
|
|
38709
39057
|
const shown = formulaText !== void 0 ? { text: formulaText } : displayText2(value3, style3, dxf?.numFmt ?? style3.numFmt, workbook, sheet);
|
|
38710
39058
|
const fontViewResolved = fontView(font, workbook.theme);
|
|
@@ -38955,10 +39303,11 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
|
|
|
38955
39303
|
updates.push([row2, next]);
|
|
38956
39304
|
}
|
|
38957
39305
|
if (!updates.length) return [];
|
|
39306
|
+
const changed = updates.map(([row2]) => row2);
|
|
38958
39307
|
ctx.run(
|
|
38959
39308
|
"Row height",
|
|
38960
39309
|
"view",
|
|
38961
|
-
[{ kind: "
|
|
39310
|
+
[{ kind: "rowInfo", sheet: s, rows: changed }],
|
|
38962
39311
|
() => {
|
|
38963
39312
|
for (const [row2, height] of updates) {
|
|
38964
39313
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
@@ -38970,7 +39319,7 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
|
|
|
38970
39319
|
},
|
|
38971
39320
|
{ sheet: s, structural: true }
|
|
38972
39321
|
);
|
|
38973
|
-
return
|
|
39322
|
+
return changed;
|
|
38974
39323
|
}
|
|
38975
39324
|
var MAX_REFIT_ROWS = 1e4;
|
|
38976
39325
|
function rowsToRefit(sheet, ranges) {
|
|
@@ -40300,14 +40649,24 @@ function formatAxisValue(value3, percent = false) {
|
|
|
40300
40649
|
return `${v < 0 ? "-" : ""}${grouped}${frac ? `.${frac}` : ""}`;
|
|
40301
40650
|
}
|
|
40302
40651
|
|
|
40652
|
+
// chart/extent.ts
|
|
40653
|
+
function extentOf(values2) {
|
|
40654
|
+
let min = Infinity;
|
|
40655
|
+
let max = -Infinity;
|
|
40656
|
+
for (const value3 of values2) {
|
|
40657
|
+
min = Math.min(min, value3);
|
|
40658
|
+
max = Math.max(max, value3);
|
|
40659
|
+
}
|
|
40660
|
+
return { min, max };
|
|
40661
|
+
}
|
|
40662
|
+
|
|
40303
40663
|
// chart/axis-range.ts
|
|
40304
40664
|
function computeLogValueRange(series, logBase) {
|
|
40305
40665
|
const allValues = series.flatMap((item) => item.values).filter((value3) => value3 !== null && Number.isFinite(value3) && value3 > 0);
|
|
40306
40666
|
if (allValues.length === 0) {
|
|
40307
40667
|
return { min: 1, max: logBase, span: 1, logScale: true, logBase };
|
|
40308
40668
|
}
|
|
40309
|
-
const dataMin =
|
|
40310
|
-
const dataMax = Math.max(...allValues);
|
|
40669
|
+
const { min: dataMin, max: dataMax } = extentOf(allValues);
|
|
40311
40670
|
const logMin = Math.floor(Math.log(dataMin) / Math.log(logBase));
|
|
40312
40671
|
const logMax = Math.ceil(Math.log(dataMax) / Math.log(logBase));
|
|
40313
40672
|
const min = logBase ** logMin;
|
|
@@ -41334,8 +41693,7 @@ function computeHistogramBins(values2, options7, format = String) {
|
|
|
41334
41693
|
});
|
|
41335
41694
|
}
|
|
41336
41695
|
if (regular.length > 0) {
|
|
41337
|
-
const min =
|
|
41338
|
-
const max = Math.max(...regular.map((item) => item.value));
|
|
41696
|
+
const { min, max } = extentOf(regular.map((item) => item.value));
|
|
41339
41697
|
const requestedSize = options7.binSize && options7.binSize > 0 ? options7.binSize : void 0;
|
|
41340
41698
|
const requestedCount = options7.binCount && options7.binCount > 0 ? options7.binCount : void 0;
|
|
41341
41699
|
const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
|
|
@@ -41463,8 +41821,9 @@ function waterfallView(chart, model, ctx) {
|
|
|
41463
41821
|
colors: { increase: role(0), decrease: role(1), total: role(2) }
|
|
41464
41822
|
};
|
|
41465
41823
|
const ends = steps.flatMap((step) => [step.startValue, step.endValue]);
|
|
41824
|
+
const range2 = extentOf(ends);
|
|
41466
41825
|
model.valueAxis = {
|
|
41467
|
-
...ends.length ? niceScale(
|
|
41826
|
+
...ends.length ? niceScale(range2.min, range2.max) : niceScale(0, 1),
|
|
41468
41827
|
percent: false
|
|
41469
41828
|
};
|
|
41470
41829
|
const labels = model.categories;
|
|
@@ -41580,7 +41939,8 @@ function chartSummaryView(chart, theme2, options7 = {}) {
|
|
|
41580
41939
|
s.xValues = s.values.map((_, k) => numeric2 ? toNumber2(cats[k] ?? null) : k + 1);
|
|
41581
41940
|
});
|
|
41582
41941
|
const xs = series.flatMap((s) => s.xValues ?? []).filter((x) => x !== null);
|
|
41583
|
-
|
|
41942
|
+
const range2 = extentOf(xs);
|
|
41943
|
+
model.xAxis = xs.length ? niceScale(range2.min, range2.max) : niceScale(0, 1);
|
|
41584
41944
|
}
|
|
41585
41945
|
if (type === "stock") model.stock = stockView(chart.stock, ctx);
|
|
41586
41946
|
if (type === "bubble") bubbleView(chart, model, ctx.evaluateRef);
|
|
@@ -41857,8 +42217,9 @@ function fitChartTrendline(options7, xVals, yVals) {
|
|
|
41857
42217
|
}
|
|
41858
42218
|
const model = fitModel(options7, xVals, yVals);
|
|
41859
42219
|
if (!model) return noFit();
|
|
41860
|
-
const
|
|
41861
|
-
const
|
|
42220
|
+
const xRange = extentOf(xVals);
|
|
42221
|
+
const startX = xRange.min - (options7.backward ?? 0);
|
|
42222
|
+
const endX = xRange.max + (options7.forward ?? 0);
|
|
41862
42223
|
const steps = Math.max(Math.ceil((endX - startX) * 4), 20);
|
|
41863
42224
|
const points = [];
|
|
41864
42225
|
for (let step = 0; step <= steps; step++) {
|
|
@@ -42427,7 +42788,7 @@ function cartesianAxes(model, area, out) {
|
|
|
42427
42788
|
const cats = Math.max(1, model.categories.length);
|
|
42428
42789
|
const catW = Math.min(
|
|
42429
42790
|
area.w * 0.3,
|
|
42430
|
-
Math.max(
|
|
42791
|
+
Math.max(extentOf(model.categories.map((c2) => textWidth(c2, categorySize))).max, 8) + 6
|
|
42431
42792
|
);
|
|
42432
42793
|
const second = horizontal2 ? void 0 : model.secondaryAxis;
|
|
42433
42794
|
const secondLabels = second?.ticks.map((t) => axisTickText(t, model.axes?.secondary, second.percent)) ?? [];
|
|
@@ -42616,7 +42977,7 @@ function computeBubbleRadius(sizeVal, maxBubble, medianRadius, options7) {
|
|
|
42616
42977
|
return medianRadius * scale2 * 0.5 + ratio * medianRadius * scale2 * 1.5;
|
|
42617
42978
|
}
|
|
42618
42979
|
function maxBubbleSize(sizes) {
|
|
42619
|
-
return
|
|
42980
|
+
return Math.max(1, extentOf(sizes.map(Math.abs)).max);
|
|
42620
42981
|
}
|
|
42621
42982
|
function medianBubbleRadius(plotWidth, plotHeight) {
|
|
42622
42983
|
return Math.min(plotWidth, plotHeight) * 0.04;
|
|
@@ -43229,13 +43590,11 @@ function chartLegendSvg(model, area, frame, options7) {
|
|
|
43229
43590
|
chartAreaRect(model, "legend", { x: manual.x, y: manual.y, w: manual.width, h: manual.height })
|
|
43230
43591
|
];
|
|
43231
43592
|
const baselineOffset = font ? (font.ascent - font.descent) / 2 : size * 0.35;
|
|
43593
|
+
const widest = extentOf(widths).max;
|
|
43232
43594
|
entries.forEach((entry3, i2) => {
|
|
43233
43595
|
const available = horizontal2 ? chartTextWidth(entry3.label, attrs2, options7) : Math.max(0, rowWidth - size / 2 - keySize - keyGap);
|
|
43234
43596
|
const label2 = fitChartText(entry3.label, available, attrs2, options7);
|
|
43235
|
-
const contentWidth = Math.min(
|
|
43236
|
-
horizontal2 ? widths[i2] ?? 0 : Math.max(...widths),
|
|
43237
|
-
rowWidth - size / 2
|
|
43238
|
-
);
|
|
43597
|
+
const contentWidth = Math.min(horizontal2 ? widths[i2] ?? 0 : widest, rowWidth - size / 2);
|
|
43239
43598
|
const x = horizontal2 ? horizontalX : manual.x + Math.max(size / 4, (rowWidth - contentWidth) / 2);
|
|
43240
43599
|
const centerY = manual.y + (horizontal2 ? 0 : i2 * rowHeight) + rowHeight / 2;
|
|
43241
43600
|
markup.push(rect(x, centerY - keySize / 2, keySize, keySize, entry3.color));
|
|
@@ -43307,7 +43666,7 @@ function automaticLegend(model, area, out, options7, bounds) {
|
|
|
43307
43666
|
}
|
|
43308
43667
|
const width = Math.min(
|
|
43309
43668
|
area.w * 0.35,
|
|
43310
|
-
|
|
43669
|
+
extentOf(entries.map((e) => chartTextWidth(e.label, attrs2, options7))).max + 22
|
|
43311
43670
|
);
|
|
43312
43671
|
const height = entries.length * rowH;
|
|
43313
43672
|
const x = pos === "l" ? area.x + 4 : area.x + area.w - width;
|
|
@@ -55333,6 +55692,53 @@ function applyThemeColors(host, previous, colors) {
|
|
|
55333
55692
|
return Object.keys(vars);
|
|
55334
55693
|
}
|
|
55335
55694
|
|
|
55695
|
+
// xlsx/ui/selection-format.ts
|
|
55696
|
+
function selectionFormatting(workbook, sheetIndex2, ranges) {
|
|
55697
|
+
const values2 = {
|
|
55698
|
+
bold: /* @__PURE__ */ new Set(),
|
|
55699
|
+
italic: /* @__PURE__ */ new Set(),
|
|
55700
|
+
underline: /* @__PURE__ */ new Set(),
|
|
55701
|
+
fontFamily: /* @__PURE__ */ new Set(),
|
|
55702
|
+
fontSize: /* @__PURE__ */ new Set(),
|
|
55703
|
+
alignment: /* @__PURE__ */ new Set(),
|
|
55704
|
+
numberFormat: /* @__PURE__ */ new Set()
|
|
55705
|
+
};
|
|
55706
|
+
const sheet = workbook?.sheets[sheetIndex2];
|
|
55707
|
+
let remaining = 4096;
|
|
55708
|
+
let complete = true;
|
|
55709
|
+
if (workbook && sheet)
|
|
55710
|
+
outer: for (const raw2 of ranges) {
|
|
55711
|
+
const range2 = normalizeRange(raw2);
|
|
55712
|
+
for (let row2 = range2.start.row; row2 <= range2.end.row; row2++) {
|
|
55713
|
+
for (let col = range2.start.col; col <= range2.end.col; col++) {
|
|
55714
|
+
if (--remaining < 0) {
|
|
55715
|
+
complete = false;
|
|
55716
|
+
break outer;
|
|
55717
|
+
}
|
|
55718
|
+
const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
|
|
55719
|
+
values2.bold.add(Boolean(style3.font.bold));
|
|
55720
|
+
values2.italic.add(Boolean(style3.font.italic));
|
|
55721
|
+
values2.underline.add(Boolean(style3.font.underline));
|
|
55722
|
+
values2.fontFamily.add(style3.font.name ?? "Aptos");
|
|
55723
|
+
values2.fontSize.add(style3.font.size ?? 11);
|
|
55724
|
+
values2.alignment.add(style3.alignment?.horizontal ?? "general");
|
|
55725
|
+
values2.numberFormat.add(style3.numFmt ?? "General");
|
|
55726
|
+
}
|
|
55727
|
+
}
|
|
55728
|
+
}
|
|
55729
|
+
const single = (set) => complete && set.size === 1 ? [...set][0] : null;
|
|
55730
|
+
return {
|
|
55731
|
+
bold: single(values2.bold),
|
|
55732
|
+
italic: single(values2.italic),
|
|
55733
|
+
underline: single(values2.underline),
|
|
55734
|
+
fontFamily: single(values2.fontFamily),
|
|
55735
|
+
fontSize: single(values2.fontSize),
|
|
55736
|
+
alignment: single(values2.alignment),
|
|
55737
|
+
numberFormat: single(values2.numberFormat),
|
|
55738
|
+
formattingComplete: complete
|
|
55739
|
+
};
|
|
55740
|
+
}
|
|
55741
|
+
|
|
55336
55742
|
exports.ACCOUNTING_FORMATS = ACCOUNTING_FORMATS;
|
|
55337
55743
|
exports.ALL_RANGE = ALL_RANGE;
|
|
55338
55744
|
exports.AUTOSUM_FUNCTIONS = AUTOSUM_FUNCTIONS;
|
|
@@ -55514,6 +55920,7 @@ exports.selectCell = selectCell;
|
|
|
55514
55920
|
exports.selectSpecial = selectSpecial;
|
|
55515
55921
|
exports.selectTab = selectTab;
|
|
55516
55922
|
exports.selectionCellCount = selectionCellCount;
|
|
55923
|
+
exports.selectionFormatting = selectionFormatting;
|
|
55517
55924
|
exports.selectionRef = selectionRef;
|
|
55518
55925
|
exports.setTabHidden = setTabHidden;
|
|
55519
55926
|
exports.sheetBaseName = sheetBaseName;
|