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.mjs
CHANGED
|
@@ -315,9 +315,9 @@ function nextSheetName(workbook, base = "Sheet") {
|
|
|
315
315
|
}
|
|
316
316
|
var nextSheetId = (workbook) => workbook.sheets.reduce((max, sheet) => Math.max(max, sheet.sheetId), 0) + 1;
|
|
317
317
|
|
|
318
|
-
// xlsx/
|
|
319
|
-
function
|
|
320
|
-
return JSON.stringify(sortKeys(
|
|
318
|
+
// xlsx/stable-key.ts
|
|
319
|
+
function stableKey(value3) {
|
|
320
|
+
return JSON.stringify(sortKeys(value3));
|
|
321
321
|
}
|
|
322
322
|
function sortKeys(value3) {
|
|
323
323
|
if (Array.isArray(value3)) return value3.map(sortKeys);
|
|
@@ -331,6 +331,11 @@ function sortKeys(value3) {
|
|
|
331
331
|
}
|
|
332
332
|
return value3;
|
|
333
333
|
}
|
|
334
|
+
|
|
335
|
+
// xlsx/styles.ts
|
|
336
|
+
function styleKey(style3) {
|
|
337
|
+
return stableKey(style3);
|
|
338
|
+
}
|
|
334
339
|
function styleAt(workbook, styleId) {
|
|
335
340
|
const style3 = workbook.styles[styleId ?? 0] ?? workbook.styles[0];
|
|
336
341
|
if (!style3) throw new Error("Workbook has no default cell style");
|
|
@@ -2703,6 +2708,37 @@ function parseArray(c2) {
|
|
|
2703
2708
|
return { type: "array", rows: rows2 };
|
|
2704
2709
|
}
|
|
2705
2710
|
|
|
2711
|
+
// xlsx/formula/change-areas.ts
|
|
2712
|
+
function changeAreas(changes) {
|
|
2713
|
+
const out = [];
|
|
2714
|
+
const open = /* @__PURE__ */ new Map();
|
|
2715
|
+
let run2;
|
|
2716
|
+
const close2 = (area) => {
|
|
2717
|
+
const { start, end } = area.range;
|
|
2718
|
+
const key = `${area.sheet}:${start.col}:${end.col}`;
|
|
2719
|
+
const above = open.get(key);
|
|
2720
|
+
if (above && above.range.end.row === start.row - 1) {
|
|
2721
|
+
above.range.end.row = end.row;
|
|
2722
|
+
return;
|
|
2723
|
+
}
|
|
2724
|
+
out.push(area);
|
|
2725
|
+
open.set(key, area);
|
|
2726
|
+
};
|
|
2727
|
+
for (const { sheet, row: row2, col } of changes) {
|
|
2728
|
+
if (run2 && run2.sheet === sheet && run2.range.start.row === row2) {
|
|
2729
|
+
if (col === run2.range.end.col + 1) {
|
|
2730
|
+
run2.range.end.col = col;
|
|
2731
|
+
continue;
|
|
2732
|
+
}
|
|
2733
|
+
if (col >= run2.range.start.col && col <= run2.range.end.col) continue;
|
|
2734
|
+
}
|
|
2735
|
+
if (run2) close2(run2);
|
|
2736
|
+
run2 = { sheet, range: { start: { row: row2, col }, end: { row: row2, col } } };
|
|
2737
|
+
}
|
|
2738
|
+
if (run2) close2(run2);
|
|
2739
|
+
return out;
|
|
2740
|
+
}
|
|
2741
|
+
|
|
2706
2742
|
// xlsx/formula/date-serial.ts
|
|
2707
2743
|
var DAY_MS = 864e5;
|
|
2708
2744
|
var EPOCH_19002 = Date.UTC(1899, 11, 30);
|
|
@@ -2929,68 +2965,6 @@ var ReverseIndex = class extends AreaIndex {
|
|
|
2929
2965
|
}
|
|
2930
2966
|
};
|
|
2931
2967
|
|
|
2932
|
-
// xlsx/formula/engine-prepare.ts
|
|
2933
|
-
var CHECK_EVERY = 32;
|
|
2934
|
-
var GraphPreparation = class {
|
|
2935
|
-
constructor(workbook, create) {
|
|
2936
|
-
this.workbook = workbook;
|
|
2937
|
-
this.create = create;
|
|
2938
|
-
}
|
|
2939
|
-
workbook;
|
|
2940
|
-
create;
|
|
2941
|
-
reverse = new ReverseIndex();
|
|
2942
|
-
formulas = { dynamic: [], unvalued: [] };
|
|
2943
|
-
sheet = 0;
|
|
2944
|
-
rows;
|
|
2945
|
-
row = 0;
|
|
2946
|
-
cells;
|
|
2947
|
-
finished = false;
|
|
2948
|
-
/**
|
|
2949
|
-
* Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
|
|
2950
|
-
* them) reaches zero, or until every formula is in. Returns true when the graph is complete.
|
|
2951
|
-
*/
|
|
2952
|
-
run(timeRemaining) {
|
|
2953
|
-
let visited = 0;
|
|
2954
|
-
while (!this.finished) {
|
|
2955
|
-
const cells = this.cells ?? this.nextRow();
|
|
2956
|
-
if (!cells) continue;
|
|
2957
|
-
const next = cells.next();
|
|
2958
|
-
if (next.done) {
|
|
2959
|
-
this.cells = void 0;
|
|
2960
|
-
continue;
|
|
2961
|
-
}
|
|
2962
|
-
const [col, cell] = next.value;
|
|
2963
|
-
if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
|
|
2964
|
-
if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
|
|
2965
|
-
}
|
|
2966
|
-
return this.finished;
|
|
2967
|
-
}
|
|
2968
|
-
add(node2, cell) {
|
|
2969
|
-
this.reverse.addNode(node2);
|
|
2970
|
-
if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
|
|
2971
|
-
if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
|
|
2972
|
-
}
|
|
2973
|
-
/** Moves to the next stored row (and sheet), or marks the walk finished. */
|
|
2974
|
-
nextRow() {
|
|
2975
|
-
for (; ; ) {
|
|
2976
|
-
const sheet = this.workbook.sheets[this.sheet];
|
|
2977
|
-
if (!sheet) {
|
|
2978
|
-
this.finished = true;
|
|
2979
|
-
return void 0;
|
|
2980
|
-
}
|
|
2981
|
-
this.rows ??= sheet.rows.entries();
|
|
2982
|
-
const next = this.rows.next();
|
|
2983
|
-
if (!next.done) {
|
|
2984
|
-
this.row = next.value[0];
|
|
2985
|
-
this.cells = next.value[1].entries();
|
|
2986
|
-
return this.cells;
|
|
2987
|
-
}
|
|
2988
|
-
this.rows = void 0;
|
|
2989
|
-
this.sheet++;
|
|
2990
|
-
}
|
|
2991
|
-
}
|
|
2992
|
-
};
|
|
2993
|
-
|
|
2994
2968
|
// xlsx/formula/text-number.ts
|
|
2995
2969
|
var MONTHS2 = [
|
|
2996
2970
|
"jan",
|
|
@@ -3393,6 +3367,311 @@ function finite(value3) {
|
|
|
3393
3367
|
return value3;
|
|
3394
3368
|
}
|
|
3395
3369
|
|
|
3370
|
+
// xlsx/formula/operators.ts
|
|
3371
|
+
var signal = (fn) => {
|
|
3372
|
+
try {
|
|
3373
|
+
return fn();
|
|
3374
|
+
} catch (e) {
|
|
3375
|
+
if (e instanceof ErrorSignal) return e.value;
|
|
3376
|
+
throw e;
|
|
3377
|
+
}
|
|
3378
|
+
};
|
|
3379
|
+
function power(base, exponent) {
|
|
3380
|
+
if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
|
|
3381
|
+
if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
|
|
3382
|
+
if (base < 0 && !Number.isInteger(exponent)) {
|
|
3383
|
+
const inverse = 1 / exponent;
|
|
3384
|
+
const odd = Math.round(inverse);
|
|
3385
|
+
if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
|
|
3386
|
+
return -Math.pow(-base, exponent);
|
|
3387
|
+
}
|
|
3388
|
+
throw new ErrorSignal(ERR.NUM);
|
|
3389
|
+
}
|
|
3390
|
+
return Math.pow(base, exponent);
|
|
3391
|
+
}
|
|
3392
|
+
function snapToZero(result2, a2, b) {
|
|
3393
|
+
if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
|
|
3394
|
+
return result2;
|
|
3395
|
+
}
|
|
3396
|
+
function arithmetic(op2, x, y, snap) {
|
|
3397
|
+
if (isError(x)) return x;
|
|
3398
|
+
if (isError(y)) return y;
|
|
3399
|
+
return signal(() => {
|
|
3400
|
+
const a2 = toNumber(x);
|
|
3401
|
+
const b = toNumber(y);
|
|
3402
|
+
let r;
|
|
3403
|
+
switch (op2) {
|
|
3404
|
+
case "+":
|
|
3405
|
+
r = a2 + b;
|
|
3406
|
+
if (snap) r = snapToZero(r, a2, b);
|
|
3407
|
+
break;
|
|
3408
|
+
case "-":
|
|
3409
|
+
r = a2 - b;
|
|
3410
|
+
if (snap) r = snapToZero(r, a2, b);
|
|
3411
|
+
break;
|
|
3412
|
+
case "*":
|
|
3413
|
+
r = a2 * b;
|
|
3414
|
+
break;
|
|
3415
|
+
case "/":
|
|
3416
|
+
if (b === 0) return ERR.DIV0;
|
|
3417
|
+
r = a2 / b;
|
|
3418
|
+
break;
|
|
3419
|
+
default:
|
|
3420
|
+
r = power(a2, b);
|
|
3421
|
+
}
|
|
3422
|
+
return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
|
|
3423
|
+
});
|
|
3424
|
+
}
|
|
3425
|
+
function comparison(op2, x, y) {
|
|
3426
|
+
if (isError(x)) return x;
|
|
3427
|
+
if (isError(y)) return y;
|
|
3428
|
+
const c2 = compareScalars(x, y);
|
|
3429
|
+
switch (op2) {
|
|
3430
|
+
case "=":
|
|
3431
|
+
return c2 === 0;
|
|
3432
|
+
case "<>":
|
|
3433
|
+
return c2 !== 0;
|
|
3434
|
+
case "<":
|
|
3435
|
+
return c2 < 0;
|
|
3436
|
+
case ">":
|
|
3437
|
+
return c2 > 0;
|
|
3438
|
+
case "<=":
|
|
3439
|
+
return c2 <= 0;
|
|
3440
|
+
default:
|
|
3441
|
+
return c2 >= 0;
|
|
3442
|
+
}
|
|
3443
|
+
}
|
|
3444
|
+
function concat(x, y) {
|
|
3445
|
+
if (isError(x)) return x;
|
|
3446
|
+
if (isError(y)) return y;
|
|
3447
|
+
return toText(x) + toText(y);
|
|
3448
|
+
}
|
|
3449
|
+
function scalarBinary(op2, x, y, snap = false) {
|
|
3450
|
+
if (op2 === "&") return concat(x, y);
|
|
3451
|
+
if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
|
|
3452
|
+
return arithmetic(op2, x, y, snap);
|
|
3453
|
+
}
|
|
3454
|
+
return comparison(op2, x, y);
|
|
3455
|
+
}
|
|
3456
|
+
function scalarUnary(op2, x) {
|
|
3457
|
+
if (isError(x)) return x;
|
|
3458
|
+
return signal(() => {
|
|
3459
|
+
const n2 = toNumber(x);
|
|
3460
|
+
const r = op2 === "-" ? -n2 : n2 / 100;
|
|
3461
|
+
return r === 0 ? 0 : r;
|
|
3462
|
+
});
|
|
3463
|
+
}
|
|
3464
|
+
function pick(m, row2, col) {
|
|
3465
|
+
const r = m.rows === 1 ? 0 : row2;
|
|
3466
|
+
const c2 = m.cols === 1 ? 0 : col;
|
|
3467
|
+
if (r >= m.rows || c2 >= m.cols) return ERR.NA;
|
|
3468
|
+
return m.get(r, c2);
|
|
3469
|
+
}
|
|
3470
|
+
function broadcastShape(operands, at) {
|
|
3471
|
+
let rows2 = 1;
|
|
3472
|
+
let cols = 1;
|
|
3473
|
+
for (const m of operands) {
|
|
3474
|
+
rows2 = Math.max(rows2, m.rows);
|
|
3475
|
+
cols = Math.max(cols, m.cols);
|
|
3476
|
+
}
|
|
3477
|
+
if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
|
|
3478
|
+
let blockRows = 1;
|
|
3479
|
+
let blockCols = 1;
|
|
3480
|
+
for (const m of operands) {
|
|
3481
|
+
blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
|
|
3482
|
+
blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
|
|
3483
|
+
}
|
|
3484
|
+
blockRows = Math.min(blockRows, rows2);
|
|
3485
|
+
blockCols = Math.min(blockCols, cols);
|
|
3486
|
+
const varies = operands.some(
|
|
3487
|
+
(m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
|
|
3488
|
+
);
|
|
3489
|
+
if (varies) return Matrix.build(rows2, cols, at);
|
|
3490
|
+
return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
|
|
3491
|
+
}
|
|
3492
|
+
function broadcast2(a2, b, fn) {
|
|
3493
|
+
if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
|
|
3494
|
+
const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
|
|
3495
|
+
const mb = b instanceof Matrix ? b : new Matrix([[b]]);
|
|
3496
|
+
return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
|
|
3497
|
+
}
|
|
3498
|
+
function broadcast1(a2, fn) {
|
|
3499
|
+
return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
|
|
3500
|
+
}
|
|
3501
|
+
|
|
3502
|
+
// xlsx/formula/spill.ts
|
|
3503
|
+
var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
|
|
3504
|
+
function releaseSpilledCell(sheet, row2, col) {
|
|
3505
|
+
const cell = getCell(sheet, row2, col);
|
|
3506
|
+
if (!isSpilledCell(cell)) return;
|
|
3507
|
+
delete cell.spillAnchor;
|
|
3508
|
+
cell.value = null;
|
|
3509
|
+
if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
|
|
3510
|
+
deleteCell(sheet, row2, col);
|
|
3511
|
+
}
|
|
3512
|
+
function clearFootprint(sheet, footprint, row2, col) {
|
|
3513
|
+
const { start, end } = footprint;
|
|
3514
|
+
const owned = [];
|
|
3515
|
+
const visit2 = (r, c2, cell) => {
|
|
3516
|
+
if (c2 < start.col || c2 > end.col || r === row2 && c2 === col) return;
|
|
3517
|
+
if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col)
|
|
3518
|
+
owned.push([r, c2]);
|
|
3519
|
+
};
|
|
3520
|
+
const visitRow = (r, cells) => {
|
|
3521
|
+
if (end.col - start.col + 1 <= cells.size)
|
|
3522
|
+
for (let c2 = start.col; c2 <= end.col; c2++) visit2(r, c2, cells.get(c2));
|
|
3523
|
+
else for (const [c2, cell] of cells) visit2(r, c2, cell);
|
|
3524
|
+
};
|
|
3525
|
+
if (end.row - start.row + 1 <= sheet.rows.size) {
|
|
3526
|
+
for (let r = start.row; r <= end.row; r++) {
|
|
3527
|
+
const cells = sheet.rows.get(r);
|
|
3528
|
+
if (cells) visitRow(r, cells);
|
|
3529
|
+
}
|
|
3530
|
+
} else
|
|
3531
|
+
for (const [r, cells] of sheet.rows) if (r >= start.row && r <= end.row) visitRow(r, cells);
|
|
3532
|
+
for (const [r, c2] of owned) releaseSpilledCell(sheet, r, c2);
|
|
3533
|
+
}
|
|
3534
|
+
function footprintFor(row2, col, m) {
|
|
3535
|
+
const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
|
|
3536
|
+
if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
|
|
3537
|
+
return { start: { row: row2, col }, end };
|
|
3538
|
+
}
|
|
3539
|
+
function footprintFree(sheet, footprint, row2, col, claims) {
|
|
3540
|
+
if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
|
|
3541
|
+
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
3542
|
+
const cells = sheet.rows.get(r);
|
|
3543
|
+
if (!cells) continue;
|
|
3544
|
+
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
3545
|
+
if (r === row2 && c2 === col) continue;
|
|
3546
|
+
const cell = cells.get(c2);
|
|
3547
|
+
if (!cell) continue;
|
|
3548
|
+
if (cell.formula) return false;
|
|
3549
|
+
if (isSpilledCell(cell)) {
|
|
3550
|
+
const a2 = cell.spillAnchor;
|
|
3551
|
+
if (a2.row === row2 && a2.col === col) continue;
|
|
3552
|
+
if (claims(a2, r, c2)) return false;
|
|
3553
|
+
continue;
|
|
3554
|
+
}
|
|
3555
|
+
if (cell.value !== null) return false;
|
|
3556
|
+
}
|
|
3557
|
+
}
|
|
3558
|
+
return true;
|
|
3559
|
+
}
|
|
3560
|
+
function writeFootprint(sheet, footprint, m) {
|
|
3561
|
+
const { row: row2, col } = footprint.start;
|
|
3562
|
+
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
3563
|
+
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
3564
|
+
const value3 = cellValueOf(m.get(r - row2, c2 - col));
|
|
3565
|
+
const cell = getCell(sheet, r, c2);
|
|
3566
|
+
if (r === row2 && c2 === col) {
|
|
3567
|
+
if (cell) cell.value = value3;
|
|
3568
|
+
continue;
|
|
3569
|
+
}
|
|
3570
|
+
if (cell) {
|
|
3571
|
+
cell.value = value3;
|
|
3572
|
+
if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
|
|
3573
|
+
cell.spillAnchor = { row: row2, col };
|
|
3574
|
+
} else {
|
|
3575
|
+
const spilled = { value: value3, spillAnchor: { row: row2, col } };
|
|
3576
|
+
putCell(sheet, r, c2, spilled);
|
|
3577
|
+
}
|
|
3578
|
+
}
|
|
3579
|
+
}
|
|
3580
|
+
}
|
|
3581
|
+
function fillArrayRange(sheet, range2, m) {
|
|
3582
|
+
const { row: row2, col } = range2.start;
|
|
3583
|
+
for (let r = range2.start.row; r <= range2.end.row; r++) {
|
|
3584
|
+
for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
|
|
3585
|
+
const value3 = cellValueOf(pick(m, r - row2, c2 - col));
|
|
3586
|
+
const cell = getCell(sheet, r, c2);
|
|
3587
|
+
if (cell) cell.value = value3;
|
|
3588
|
+
else putCell(sheet, r, c2, { value: value3 });
|
|
3589
|
+
}
|
|
3590
|
+
}
|
|
3591
|
+
}
|
|
3592
|
+
var cellValueOf = (value3) => value3 === null ? 0 : value3;
|
|
3593
|
+
|
|
3594
|
+
// xlsx/formula/engine-prepare.ts
|
|
3595
|
+
var CHECK_EVERY = 32;
|
|
3596
|
+
var GraphPreparation = class {
|
|
3597
|
+
constructor(workbook, create) {
|
|
3598
|
+
this.workbook = workbook;
|
|
3599
|
+
this.create = create;
|
|
3600
|
+
}
|
|
3601
|
+
workbook;
|
|
3602
|
+
create;
|
|
3603
|
+
reverse = new ReverseIndex();
|
|
3604
|
+
formulas = { dynamic: [], unvalued: [] };
|
|
3605
|
+
/**
|
|
3606
|
+
* The spills stored in the file, by sheet and anchor (`cellKey`): from the anchor to the last
|
|
3607
|
+
* row and column of the cells marked as its results. Until the anchor is evaluated they are
|
|
3608
|
+
* the only record of the cells it covers.
|
|
3609
|
+
*/
|
|
3610
|
+
spills = /* @__PURE__ */ new Map();
|
|
3611
|
+
sheet = 0;
|
|
3612
|
+
rows;
|
|
3613
|
+
row = 0;
|
|
3614
|
+
cells;
|
|
3615
|
+
finished = false;
|
|
3616
|
+
/**
|
|
3617
|
+
* Adds formulas to the graph until `timeRemaining` (milliseconds, as an idle deadline reports
|
|
3618
|
+
* them) reaches zero, or until every formula is in. Returns true when the graph is complete.
|
|
3619
|
+
*/
|
|
3620
|
+
run(timeRemaining) {
|
|
3621
|
+
let visited = 0;
|
|
3622
|
+
while (!this.finished) {
|
|
3623
|
+
const cells = this.cells ?? this.nextRow();
|
|
3624
|
+
if (!cells) continue;
|
|
3625
|
+
const next = cells.next();
|
|
3626
|
+
if (next.done) {
|
|
3627
|
+
this.cells = void 0;
|
|
3628
|
+
continue;
|
|
3629
|
+
}
|
|
3630
|
+
const [col, cell] = next.value;
|
|
3631
|
+
if (cell.formula) this.add(this.create(this.sheet, this.row, col, cell), cell);
|
|
3632
|
+
else if (isSpilledCell(cell)) this.addSpilled(this.row, col, cell.spillAnchor);
|
|
3633
|
+
if (timeRemaining && ++visited % CHECK_EVERY === 0 && timeRemaining() <= 0) break;
|
|
3634
|
+
}
|
|
3635
|
+
return this.finished;
|
|
3636
|
+
}
|
|
3637
|
+
add(node2, cell) {
|
|
3638
|
+
this.reverse.addNode(node2);
|
|
3639
|
+
if (!node2.legacy && !node2.arrayRange) this.formulas.dynamic.push(node2);
|
|
3640
|
+
if (cell.value === null && !node2.keepCached) this.formulas.unvalued.push(node2);
|
|
3641
|
+
}
|
|
3642
|
+
addSpilled(row2, col, anchor) {
|
|
3643
|
+
if (row2 < anchor.row || col < anchor.col) return;
|
|
3644
|
+
let spills = this.spills.get(this.sheet);
|
|
3645
|
+
if (!spills) this.spills.set(this.sheet, spills = /* @__PURE__ */ new Map());
|
|
3646
|
+
const key = cellKey(anchor.row, anchor.col);
|
|
3647
|
+
const range2 = spills.get(key);
|
|
3648
|
+
if (!range2) spills.set(key, { start: { ...anchor }, end: { row: row2, col } });
|
|
3649
|
+
else {
|
|
3650
|
+
range2.end.row = Math.max(range2.end.row, row2);
|
|
3651
|
+
range2.end.col = Math.max(range2.end.col, col);
|
|
3652
|
+
}
|
|
3653
|
+
}
|
|
3654
|
+
/** Moves to the next stored row (and sheet), or marks the walk finished. */
|
|
3655
|
+
nextRow() {
|
|
3656
|
+
for (; ; ) {
|
|
3657
|
+
const sheet = this.workbook.sheets[this.sheet];
|
|
3658
|
+
if (!sheet) {
|
|
3659
|
+
this.finished = true;
|
|
3660
|
+
return void 0;
|
|
3661
|
+
}
|
|
3662
|
+
this.rows ??= sheet.rows.entries();
|
|
3663
|
+
const next = this.rows.next();
|
|
3664
|
+
if (!next.done) {
|
|
3665
|
+
this.row = next.value[0];
|
|
3666
|
+
this.cells = next.value[1].entries();
|
|
3667
|
+
return this.cells;
|
|
3668
|
+
}
|
|
3669
|
+
this.rows = void 0;
|
|
3670
|
+
this.sheet++;
|
|
3671
|
+
}
|
|
3672
|
+
}
|
|
3673
|
+
};
|
|
3674
|
+
|
|
3396
3675
|
// xlsx/formula/functions/wildcard.ts
|
|
3397
3676
|
var lower = (ch) => (ch ?? "").toLowerCase();
|
|
3398
3677
|
var fold = (text4) => Array.from({ length: text4.length }, (_, i2) => lower(text4[i2]));
|
|
@@ -6866,138 +7145,6 @@ var INFO_FUNCTIONS = [
|
|
|
6866
7145
|
)
|
|
6867
7146
|
];
|
|
6868
7147
|
|
|
6869
|
-
// xlsx/formula/operators.ts
|
|
6870
|
-
var signal = (fn) => {
|
|
6871
|
-
try {
|
|
6872
|
-
return fn();
|
|
6873
|
-
} catch (e) {
|
|
6874
|
-
if (e instanceof ErrorSignal) return e.value;
|
|
6875
|
-
throw e;
|
|
6876
|
-
}
|
|
6877
|
-
};
|
|
6878
|
-
function power(base, exponent) {
|
|
6879
|
-
if (base === 0 && exponent === 0) throw new ErrorSignal(ERR.NUM);
|
|
6880
|
-
if (base === 0 && exponent < 0) throw new ErrorSignal(ERR.DIV0);
|
|
6881
|
-
if (base < 0 && !Number.isInteger(exponent)) {
|
|
6882
|
-
const inverse = 1 / exponent;
|
|
6883
|
-
const odd = Math.round(inverse);
|
|
6884
|
-
if (Math.abs(inverse - odd) < 1e-10 && Math.abs(odd) % 2 === 1) {
|
|
6885
|
-
return -Math.pow(-base, exponent);
|
|
6886
|
-
}
|
|
6887
|
-
throw new ErrorSignal(ERR.NUM);
|
|
6888
|
-
}
|
|
6889
|
-
return Math.pow(base, exponent);
|
|
6890
|
-
}
|
|
6891
|
-
function snapToZero(result2, a2, b) {
|
|
6892
|
-
if (result2 !== 0 && Math.abs(result2) <= Math.max(Math.abs(a2), Math.abs(b)) * 1e-15) return 0;
|
|
6893
|
-
return result2;
|
|
6894
|
-
}
|
|
6895
|
-
function arithmetic(op2, x, y, snap) {
|
|
6896
|
-
if (isError(x)) return x;
|
|
6897
|
-
if (isError(y)) return y;
|
|
6898
|
-
return signal(() => {
|
|
6899
|
-
const a2 = toNumber(x);
|
|
6900
|
-
const b = toNumber(y);
|
|
6901
|
-
let r;
|
|
6902
|
-
switch (op2) {
|
|
6903
|
-
case "+":
|
|
6904
|
-
r = a2 + b;
|
|
6905
|
-
if (snap) r = snapToZero(r, a2, b);
|
|
6906
|
-
break;
|
|
6907
|
-
case "-":
|
|
6908
|
-
r = a2 - b;
|
|
6909
|
-
if (snap) r = snapToZero(r, a2, b);
|
|
6910
|
-
break;
|
|
6911
|
-
case "*":
|
|
6912
|
-
r = a2 * b;
|
|
6913
|
-
break;
|
|
6914
|
-
case "/":
|
|
6915
|
-
if (b === 0) return ERR.DIV0;
|
|
6916
|
-
r = a2 / b;
|
|
6917
|
-
break;
|
|
6918
|
-
default:
|
|
6919
|
-
r = power(a2, b);
|
|
6920
|
-
}
|
|
6921
|
-
return Number.isFinite(r) ? r === 0 ? 0 : r : ERR.NUM;
|
|
6922
|
-
});
|
|
6923
|
-
}
|
|
6924
|
-
function comparison(op2, x, y) {
|
|
6925
|
-
if (isError(x)) return x;
|
|
6926
|
-
if (isError(y)) return y;
|
|
6927
|
-
const c2 = compareScalars(x, y);
|
|
6928
|
-
switch (op2) {
|
|
6929
|
-
case "=":
|
|
6930
|
-
return c2 === 0;
|
|
6931
|
-
case "<>":
|
|
6932
|
-
return c2 !== 0;
|
|
6933
|
-
case "<":
|
|
6934
|
-
return c2 < 0;
|
|
6935
|
-
case ">":
|
|
6936
|
-
return c2 > 0;
|
|
6937
|
-
case "<=":
|
|
6938
|
-
return c2 <= 0;
|
|
6939
|
-
default:
|
|
6940
|
-
return c2 >= 0;
|
|
6941
|
-
}
|
|
6942
|
-
}
|
|
6943
|
-
function concat(x, y) {
|
|
6944
|
-
if (isError(x)) return x;
|
|
6945
|
-
if (isError(y)) return y;
|
|
6946
|
-
return toText(x) + toText(y);
|
|
6947
|
-
}
|
|
6948
|
-
function scalarBinary(op2, x, y, snap = false) {
|
|
6949
|
-
if (op2 === "&") return concat(x, y);
|
|
6950
|
-
if (op2 === "+" || op2 === "-" || op2 === "*" || op2 === "/" || op2 === "^") {
|
|
6951
|
-
return arithmetic(op2, x, y, snap);
|
|
6952
|
-
}
|
|
6953
|
-
return comparison(op2, x, y);
|
|
6954
|
-
}
|
|
6955
|
-
function scalarUnary(op2, x) {
|
|
6956
|
-
if (isError(x)) return x;
|
|
6957
|
-
return signal(() => {
|
|
6958
|
-
const n2 = toNumber(x);
|
|
6959
|
-
const r = op2 === "-" ? -n2 : n2 / 100;
|
|
6960
|
-
return r === 0 ? 0 : r;
|
|
6961
|
-
});
|
|
6962
|
-
}
|
|
6963
|
-
function pick(m, row2, col) {
|
|
6964
|
-
const r = m.rows === 1 ? 0 : row2;
|
|
6965
|
-
const c2 = m.cols === 1 ? 0 : col;
|
|
6966
|
-
if (r >= m.rows || c2 >= m.cols) return ERR.NA;
|
|
6967
|
-
return m.get(r, c2);
|
|
6968
|
-
}
|
|
6969
|
-
function broadcastShape(operands, at) {
|
|
6970
|
-
let rows2 = 1;
|
|
6971
|
-
let cols = 1;
|
|
6972
|
-
for (const m of operands) {
|
|
6973
|
-
rows2 = Math.max(rows2, m.rows);
|
|
6974
|
-
cols = Math.max(cols, m.cols);
|
|
6975
|
-
}
|
|
6976
|
-
if (!operands.some((m) => m.isPadded)) return Matrix.build(rows2, cols, at);
|
|
6977
|
-
let blockRows = 1;
|
|
6978
|
-
let blockCols = 1;
|
|
6979
|
-
for (const m of operands) {
|
|
6980
|
-
blockRows = Math.max(blockRows, m.isPadded ? m.blockRows : m.rows);
|
|
6981
|
-
blockCols = Math.max(blockCols, m.isPadded ? m.blockCols : m.cols);
|
|
6982
|
-
}
|
|
6983
|
-
blockRows = Math.min(blockRows, rows2);
|
|
6984
|
-
blockCols = Math.min(blockCols, cols);
|
|
6985
|
-
const varies = operands.some(
|
|
6986
|
-
(m) => blockRows < rows2 && m.rows === 1 && m.cols > 1 || blockCols < cols && m.cols === 1 && m.rows > 1
|
|
6987
|
-
);
|
|
6988
|
-
if (varies) return Matrix.build(rows2, cols, at);
|
|
6989
|
-
return Matrix.padded(Matrix.build(blockRows, blockCols, at), rows2, cols, at(rows2 - 1, cols - 1));
|
|
6990
|
-
}
|
|
6991
|
-
function broadcast2(a2, b, fn) {
|
|
6992
|
-
if (!(a2 instanceof Matrix) && !(b instanceof Matrix)) return fn(a2, b);
|
|
6993
|
-
const ma = a2 instanceof Matrix ? a2 : new Matrix([[a2]]);
|
|
6994
|
-
const mb = b instanceof Matrix ? b : new Matrix([[b]]);
|
|
6995
|
-
return broadcastShape([ma, mb], (r, c2) => fn(pick(ma, r, c2), pick(mb, r, c2)));
|
|
6996
|
-
}
|
|
6997
|
-
function broadcast1(a2, fn) {
|
|
6998
|
-
return a2 instanceof Matrix ? a2.mapValues(fn) : fn(a2);
|
|
6999
|
-
}
|
|
7000
|
-
|
|
7001
7148
|
// xlsx/formula/functions/lambda.ts
|
|
7002
7149
|
var C16 = "Logical";
|
|
7003
7150
|
function lambdaArg(value3) {
|
|
@@ -11735,6 +11882,19 @@ var DEFAULT_XML_LIMITS = {
|
|
|
11735
11882
|
maxDepth: 512,
|
|
11736
11883
|
maxNodes: 5e6
|
|
11737
11884
|
};
|
|
11885
|
+
var XmlLimitError = class extends Error {
|
|
11886
|
+
code = "xml-limit";
|
|
11887
|
+
/** The limit that was exceeded. */
|
|
11888
|
+
limit;
|
|
11889
|
+
/** Its value: the largest depth or element count allowed. */
|
|
11890
|
+
maximum;
|
|
11891
|
+
constructor(message, limit2, maximum) {
|
|
11892
|
+
super(message);
|
|
11893
|
+
this.name = "XmlLimitError";
|
|
11894
|
+
this.limit = limit2;
|
|
11895
|
+
this.maximum = maximum;
|
|
11896
|
+
}
|
|
11897
|
+
};
|
|
11738
11898
|
var TAG_RE = /<(\/?)([^\s\/><]+)(?:\s+[^\s=\/><]+\s*=\s*(?:"[^"<]*"|'[^'<]*'))*\s*(\/?)>/y;
|
|
11739
11899
|
var MARKUP_SKIPS = [
|
|
11740
11900
|
["<!--", "-->"],
|
|
@@ -11768,11 +11928,22 @@ function checkXmlLimits(xml, label2, limits = {}) {
|
|
|
11768
11928
|
continue;
|
|
11769
11929
|
}
|
|
11770
11930
|
nodes++;
|
|
11771
|
-
if (nodes > maxNodes)
|
|
11931
|
+
if (nodes > maxNodes)
|
|
11932
|
+
throw new XmlLimitError(
|
|
11933
|
+
`${label2} XML exceeds the limit of ${maxNodes} elements`,
|
|
11934
|
+
"maxNodes",
|
|
11935
|
+
maxNodes
|
|
11936
|
+
);
|
|
11772
11937
|
if (!selfClosing && ++depth > maxDepth)
|
|
11773
|
-
throw new
|
|
11938
|
+
throw new XmlLimitError(
|
|
11939
|
+
`${label2} XML exceeds the nesting depth limit of ${maxDepth}`,
|
|
11940
|
+
"maxDepth",
|
|
11941
|
+
maxDepth
|
|
11942
|
+
);
|
|
11774
11943
|
}
|
|
11775
11944
|
}
|
|
11945
|
+
var CRLF_DECLARATION = /^<\?xml[^>]*\?>\r\n/;
|
|
11946
|
+
var crlfDeclarations = /* @__PURE__ */ new WeakSet();
|
|
11776
11947
|
function parseXml(xml, options7 = {}) {
|
|
11777
11948
|
const label2 = options7.label ?? "OOXML";
|
|
11778
11949
|
if (/<!DOCTYPE|<!ENTITY/i.test(xml))
|
|
@@ -11794,9 +11965,13 @@ function parseXml(xml, options7 = {}) {
|
|
|
11794
11965
|
}
|
|
11795
11966
|
if (parseError || !parsed.documentElement)
|
|
11796
11967
|
throw new Error(`Invalid ${label2} XML: ${parseError || "missing root element"}`);
|
|
11968
|
+
if (CRLF_DECLARATION.test(xml)) crlfDeclarations.add(parsed);
|
|
11797
11969
|
return parsed;
|
|
11798
11970
|
}
|
|
11799
|
-
var buildXml = (node2) =>
|
|
11971
|
+
var buildXml = (node2) => {
|
|
11972
|
+
const xml = new XMLSerializer().serializeToString(node2);
|
|
11973
|
+
return crlfDeclarations.has(node2) ? xml.replace(/^(<\?xml[^>]*\?>)\n/, "$1\r\n") : xml;
|
|
11974
|
+
};
|
|
11800
11975
|
var isElement = (node2) => node2.nodeType === 1;
|
|
11801
11976
|
var elements = (parent) => Array.from(parent.childNodes).filter(isElement);
|
|
11802
11977
|
function named(element2, local, ns, lenient = true) {
|
|
@@ -11895,6 +12070,12 @@ function parseLiteFragment(xml, container, namespaces) {
|
|
|
11895
12070
|
}
|
|
11896
12071
|
if (lt < 0) break;
|
|
11897
12072
|
const next = source2.charCodeAt(lt + 1);
|
|
12073
|
+
if (next === 33) {
|
|
12074
|
+
const after = skipCommentOrCdata(source2, lt, top);
|
|
12075
|
+
if (after < 0) return void 0;
|
|
12076
|
+
pos = after;
|
|
12077
|
+
continue;
|
|
12078
|
+
}
|
|
11898
12079
|
if (next === 47) {
|
|
11899
12080
|
const gt = source2.indexOf(">", lt);
|
|
11900
12081
|
if (gt < 0 || stack2.length < 2 || source2.slice(lt + 2, gt).trimEnd() !== top.tagName)
|
|
@@ -11915,6 +12096,25 @@ function parseLiteFragment(xml, container, namespaces) {
|
|
|
11915
12096
|
}
|
|
11916
12097
|
return stack2.length === 1 ? root : void 0;
|
|
11917
12098
|
}
|
|
12099
|
+
var DECLARATIONS = /<!DOCTYPE|<!ENTITY/i;
|
|
12100
|
+
function skipCommentOrCdata(source2, lt, parent) {
|
|
12101
|
+
if (source2.startsWith("<!--", lt)) {
|
|
12102
|
+
const end = source2.indexOf("-->", lt + 4);
|
|
12103
|
+
if (end < 0) return -1;
|
|
12104
|
+
const body2 = source2.slice(lt + 4, end);
|
|
12105
|
+
if (body2.includes("--") || body2.endsWith("-") || DECLARATIONS.test(body2)) return -1;
|
|
12106
|
+
return end + 3;
|
|
12107
|
+
}
|
|
12108
|
+
if (source2.startsWith("<![CDATA[", lt)) {
|
|
12109
|
+
const end = source2.indexOf("]]>", lt + 9);
|
|
12110
|
+
if (end < 0) return -1;
|
|
12111
|
+
const text4 = source2.slice(lt + 9, end);
|
|
12112
|
+
if (DECLARATIONS.test(text4)) return -1;
|
|
12113
|
+
parent.childNodes.push(text4);
|
|
12114
|
+
return end + 3;
|
|
12115
|
+
}
|
|
12116
|
+
return -1;
|
|
12117
|
+
}
|
|
11918
12118
|
function startTag(source2, from, namespaces) {
|
|
11919
12119
|
const n2 = source2.length;
|
|
11920
12120
|
let i2 = from;
|
|
@@ -14888,89 +15088,6 @@ function sheetBounds(sheet) {
|
|
|
14888
15088
|
return { rows: rows2, cols };
|
|
14889
15089
|
}
|
|
14890
15090
|
|
|
14891
|
-
// xlsx/formula/spill.ts
|
|
14892
|
-
var isSpilledCell = (cell) => cell !== void 0 && "spillAnchor" in cell;
|
|
14893
|
-
function releaseSpilledCell(sheet, row2, col) {
|
|
14894
|
-
const cell = getCell(sheet, row2, col);
|
|
14895
|
-
if (!isSpilledCell(cell)) return;
|
|
14896
|
-
delete cell.spillAnchor;
|
|
14897
|
-
cell.value = null;
|
|
14898
|
-
if (!cell.styleId && !cell.formula && !cell.richText && !cell.arrayRange)
|
|
14899
|
-
deleteCell(sheet, row2, col);
|
|
14900
|
-
}
|
|
14901
|
-
function clearFootprint(sheet, footprint, row2, col) {
|
|
14902
|
-
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
14903
|
-
const cells = sheet.rows.get(r);
|
|
14904
|
-
if (!cells) continue;
|
|
14905
|
-
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
14906
|
-
if (r === row2 && c2 === col) continue;
|
|
14907
|
-
const cell = cells.get(c2);
|
|
14908
|
-
if (isSpilledCell(cell) && cell.spillAnchor.row === row2 && cell.spillAnchor.col === col) {
|
|
14909
|
-
releaseSpilledCell(sheet, r, c2);
|
|
14910
|
-
}
|
|
14911
|
-
}
|
|
14912
|
-
}
|
|
14913
|
-
}
|
|
14914
|
-
function footprintFor(row2, col, m) {
|
|
14915
|
-
const end = { row: row2 + m.rows - 1, col: col + m.cols - 1 };
|
|
14916
|
-
if (end.row > MAX_ROW || end.col > MAX_COL) return void 0;
|
|
14917
|
-
return { start: { row: row2, col }, end };
|
|
14918
|
-
}
|
|
14919
|
-
function footprintFree(sheet, footprint, row2, col, claims) {
|
|
14920
|
-
if (sheet.merges.some((m) => rangesIntersect(m, footprint))) return false;
|
|
14921
|
-
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
14922
|
-
const cells = sheet.rows.get(r);
|
|
14923
|
-
if (!cells) continue;
|
|
14924
|
-
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
14925
|
-
if (r === row2 && c2 === col) continue;
|
|
14926
|
-
const cell = cells.get(c2);
|
|
14927
|
-
if (!cell) continue;
|
|
14928
|
-
if (cell.formula) return false;
|
|
14929
|
-
if (isSpilledCell(cell)) {
|
|
14930
|
-
const a2 = cell.spillAnchor;
|
|
14931
|
-
if (a2.row === row2 && a2.col === col) continue;
|
|
14932
|
-
if (claims(a2, r, c2)) return false;
|
|
14933
|
-
continue;
|
|
14934
|
-
}
|
|
14935
|
-
if (cell.value !== null) return false;
|
|
14936
|
-
}
|
|
14937
|
-
}
|
|
14938
|
-
return true;
|
|
14939
|
-
}
|
|
14940
|
-
function writeFootprint(sheet, footprint, m) {
|
|
14941
|
-
const { row: row2, col } = footprint.start;
|
|
14942
|
-
for (let r = footprint.start.row; r <= footprint.end.row; r++) {
|
|
14943
|
-
for (let c2 = footprint.start.col; c2 <= footprint.end.col; c2++) {
|
|
14944
|
-
const value3 = cellValueOf(m.get(r - row2, c2 - col));
|
|
14945
|
-
const cell = getCell(sheet, r, c2);
|
|
14946
|
-
if (r === row2 && c2 === col) {
|
|
14947
|
-
if (cell) cell.value = value3;
|
|
14948
|
-
continue;
|
|
14949
|
-
}
|
|
14950
|
-
if (cell) {
|
|
14951
|
-
cell.value = value3;
|
|
14952
|
-
if (!isSpilledCell(cell) || cell.spillAnchor.row !== row2 || cell.spillAnchor.col !== col)
|
|
14953
|
-
cell.spillAnchor = { row: row2, col };
|
|
14954
|
-
} else {
|
|
14955
|
-
const spilled = { value: value3, spillAnchor: { row: row2, col } };
|
|
14956
|
-
putCell(sheet, r, c2, spilled);
|
|
14957
|
-
}
|
|
14958
|
-
}
|
|
14959
|
-
}
|
|
14960
|
-
}
|
|
14961
|
-
function fillArrayRange(sheet, range2, m) {
|
|
14962
|
-
const { row: row2, col } = range2.start;
|
|
14963
|
-
for (let r = range2.start.row; r <= range2.end.row; r++) {
|
|
14964
|
-
for (let c2 = range2.start.col; c2 <= range2.end.col; c2++) {
|
|
14965
|
-
const value3 = cellValueOf(pick(m, r - row2, c2 - col));
|
|
14966
|
-
const cell = getCell(sheet, r, c2);
|
|
14967
|
-
if (cell) cell.value = value3;
|
|
14968
|
-
else putCell(sheet, r, c2, { value: value3 });
|
|
14969
|
-
}
|
|
14970
|
-
}
|
|
14971
|
-
}
|
|
14972
|
-
var cellValueOf = (value3) => value3 === null ? 0 : value3;
|
|
14973
|
-
|
|
14974
15091
|
// xlsx/formula/engine-host.ts
|
|
14975
15092
|
var Deferred = class {
|
|
14976
15093
|
constructor(node2) {
|
|
@@ -15895,6 +16012,8 @@ var Engine = class extends EngineStructure {
|
|
|
15895
16012
|
preparation;
|
|
15896
16013
|
/** The prepared formulas the first recalculation checks (see `trustsStoredValues`). */
|
|
15897
16014
|
prepared;
|
|
16015
|
+
/** Stored spills released when the graph was built: their readers must recalculate. */
|
|
16016
|
+
released = [];
|
|
15898
16017
|
// ---- the graph ----
|
|
15899
16018
|
prepare(timeRemaining) {
|
|
15900
16019
|
if (this.built || this.needsFull) return true;
|
|
@@ -15932,10 +16051,33 @@ var Engine = class extends EngineStructure {
|
|
|
15932
16051
|
finishPreparation(preparation) {
|
|
15933
16052
|
this.preparation = void 0;
|
|
15934
16053
|
this.built = true;
|
|
16054
|
+
this.adoptStoredSpills(preparation.spills);
|
|
15935
16055
|
this.graphChanged();
|
|
15936
16056
|
this.reverseIndex = preparation.reverse;
|
|
15937
16057
|
this.prepared = preparation.formulas;
|
|
15938
16058
|
}
|
|
16059
|
+
/**
|
|
16060
|
+
* Takes the spills a file stored as their anchors' last footprints, so that overwriting an
|
|
16061
|
+
* anchor or shrinking its result clears the cells it covered before it was ever evaluated here.
|
|
16062
|
+
* Cells marked for an anchor that holds no formula able to spill are released.
|
|
16063
|
+
*/
|
|
16064
|
+
adoptStoredSpills(spills) {
|
|
16065
|
+
for (const [s, anchors] of spills)
|
|
16066
|
+
for (const [key, range2] of anchors) {
|
|
16067
|
+
const node2 = this.nodes.get(s)?.get(key);
|
|
16068
|
+
if (node2 && !node2.legacy && !node2.arrayRange) {
|
|
16069
|
+
if (!node2.spill && !node2.blockedSpill) {
|
|
16070
|
+
node2.spill = range2;
|
|
16071
|
+
this.footprints.add(node2);
|
|
16072
|
+
}
|
|
16073
|
+
continue;
|
|
16074
|
+
}
|
|
16075
|
+
const sheet = this.workbook.sheets[s];
|
|
16076
|
+
if (!sheet) continue;
|
|
16077
|
+
clearFootprint(sheet, range2, range2.start.row, range2.start.col);
|
|
16078
|
+
this.released.push({ sheet: s, range: range2 });
|
|
16079
|
+
}
|
|
16080
|
+
}
|
|
15939
16081
|
// ---- recalculation ----
|
|
15940
16082
|
recalculateAll() {
|
|
15941
16083
|
resetArrayBudget();
|
|
@@ -15944,6 +16086,7 @@ var Engine = class extends EngineStructure {
|
|
|
15944
16086
|
if (this.needsFull) this.releaseAllSpills();
|
|
15945
16087
|
if (!this.built || this.needsFull) this.build();
|
|
15946
16088
|
this.needsFull = false;
|
|
16089
|
+
this.released = [];
|
|
15947
16090
|
this.structuralSeeds.clear();
|
|
15948
16091
|
this.cycles = /* @__PURE__ */ new Set();
|
|
15949
16092
|
this.run(new Set(this.allNodes()), true);
|
|
@@ -15962,7 +16105,9 @@ var Engine = class extends EngineStructure {
|
|
|
15962
16105
|
this.recalculateAll();
|
|
15963
16106
|
return;
|
|
15964
16107
|
}
|
|
15965
|
-
const changed =
|
|
16108
|
+
const changed = this.released;
|
|
16109
|
+
this.released = [];
|
|
16110
|
+
const written = [];
|
|
15966
16111
|
let structural = false;
|
|
15967
16112
|
for (const change of changes) {
|
|
15968
16113
|
const sheet = this.workbook.sheets[change.sheet];
|
|
@@ -15982,7 +16127,8 @@ var Engine = class extends EngineStructure {
|
|
|
15982
16127
|
seeds.add(this.createNode(change.sheet, row2, col, cell, false));
|
|
15983
16128
|
structural = true;
|
|
15984
16129
|
} else if (existing && formula) seeds.add(existing);
|
|
15985
|
-
|
|
16130
|
+
written.push(change);
|
|
16131
|
+
if (!this.footprints.size) continue;
|
|
15986
16132
|
const anchors = [];
|
|
15987
16133
|
this.footprintsBy().dependents(
|
|
15988
16134
|
change.sheet,
|
|
@@ -15999,7 +16145,8 @@ var Engine = class extends EngineStructure {
|
|
|
15999
16145
|
if (structural) this.graphChanged();
|
|
16000
16146
|
this.takeStructuralSeeds(seeds);
|
|
16001
16147
|
const reverse2 = this.reverse();
|
|
16002
|
-
for (const area of changed
|
|
16148
|
+
for (const area of [...changed, ...changeAreas(written)])
|
|
16149
|
+
reverse2.dependents(area.sheet, area.range, seeds);
|
|
16003
16150
|
for (const node2 of this.allNodes()) if (node2.volatile) seeds.add(node2);
|
|
16004
16151
|
this.run(seeds, false);
|
|
16005
16152
|
}
|
|
@@ -16012,11 +16159,17 @@ var Engine = class extends EngineStructure {
|
|
|
16012
16159
|
const prepared = this.prepared;
|
|
16013
16160
|
this.prepared = void 0;
|
|
16014
16161
|
if (!prepared) return false;
|
|
16015
|
-
const changed = new Set(changes.map((c2) => `${c2.sheet}:${cellKey(c2.row, c2.col)}`));
|
|
16016
16162
|
const current = (node2) => this.nodes.get(node2.sheet)?.get(cellKey(node2.row, node2.col)) === node2;
|
|
16017
|
-
|
|
16018
|
-
|
|
16019
|
-
|
|
16163
|
+
const dynamic = prepared.dynamic.filter(current);
|
|
16164
|
+
if (dynamic.length) {
|
|
16165
|
+
const changed = /* @__PURE__ */ new Map();
|
|
16166
|
+
for (const c2 of changes) {
|
|
16167
|
+
let keys = changed.get(c2.sheet);
|
|
16168
|
+
if (!keys) changed.set(c2.sheet, keys = /* @__PURE__ */ new Set());
|
|
16169
|
+
keys.add(cellKey(c2.row, c2.col));
|
|
16170
|
+
}
|
|
16171
|
+
for (const node2 of dynamic)
|
|
16172
|
+
if (!changed.get(node2.sheet)?.has(cellKey(node2.row, node2.col))) return false;
|
|
16020
16173
|
}
|
|
16021
16174
|
for (const node2 of prepared.unvalued) {
|
|
16022
16175
|
const cell = this.workbook.sheets[node2.sheet]?.rows.get(node2.row)?.get(node2.col);
|
|
@@ -16744,10 +16897,13 @@ var DEFAULT_ZIP_LIMITS = {
|
|
|
16744
16897
|
var ZipLimitError = class extends Error {
|
|
16745
16898
|
code = "ZIP_BOMB";
|
|
16746
16899
|
limit;
|
|
16900
|
+
/** The check that failed (absent when the error was built without one). */
|
|
16901
|
+
kind;
|
|
16747
16902
|
constructor(message, details) {
|
|
16748
16903
|
super(message);
|
|
16749
16904
|
this.name = "ZipLimitError";
|
|
16750
16905
|
this.limit = details.limit;
|
|
16906
|
+
this.kind = details.kind;
|
|
16751
16907
|
}
|
|
16752
16908
|
};
|
|
16753
16909
|
var mib = (bytes) => Math.round(bytes / 1048576);
|
|
@@ -16770,7 +16926,7 @@ function resolveLimits(limits) {
|
|
|
16770
16926
|
maxEntryBytes: limits.maxEntryBytes ?? DEFAULT_ZIP_LIMITS.maxEntryBytes,
|
|
16771
16927
|
maxTotalBytes: limits.maxTotalBytes ?? DEFAULT_ZIP_LIMITS.maxTotalBytes,
|
|
16772
16928
|
label: limits.label ?? "ZIP",
|
|
16773
|
-
fail: (message, limit2) => create ? create(message, { limit: limit2 }) : new ZipLimitError(message, { limit: limit2 })
|
|
16929
|
+
fail: (message, limit2, kind) => create ? create(message, { limit: limit2, kind }) : new ZipLimitError(message, { limit: limit2, kind })
|
|
16774
16930
|
};
|
|
16775
16931
|
}
|
|
16776
16932
|
function inflateEntryGuarded(entry3, alreadyRead, limits) {
|
|
@@ -16793,13 +16949,18 @@ function inflateEntryGuarded(entry3, alreadyRead, limits) {
|
|
|
16793
16949
|
size += chunk.byteLength;
|
|
16794
16950
|
if (size > declared || size > r.maxEntryBytes)
|
|
16795
16951
|
return abort(
|
|
16796
|
-
r.fail(
|
|
16952
|
+
r.fail(
|
|
16953
|
+
`${r.label} part ${entry3.name} inflates past its declared size`,
|
|
16954
|
+
r.maxEntryBytes,
|
|
16955
|
+
size > declared ? "declaredSize" : "maxEntryBytes"
|
|
16956
|
+
)
|
|
16797
16957
|
);
|
|
16798
16958
|
if (alreadyRead + size > r.maxTotalBytes)
|
|
16799
16959
|
return abort(
|
|
16800
16960
|
r.fail(
|
|
16801
16961
|
`${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
|
|
16802
|
-
r.maxTotalBytes
|
|
16962
|
+
r.maxTotalBytes,
|
|
16963
|
+
"maxTotalBytes"
|
|
16803
16964
|
)
|
|
16804
16965
|
);
|
|
16805
16966
|
chunks.push(chunk);
|
|
@@ -16832,26 +16993,29 @@ function guardZip(zip, limits = {}) {
|
|
|
16832
16993
|
if (entries.length > r.maxEntries)
|
|
16833
16994
|
throw r.fail(
|
|
16834
16995
|
`${r.label} package exceeds the ${r.maxEntries.toLocaleString("en-US")} part limit`,
|
|
16835
|
-
r.maxEntries
|
|
16996
|
+
r.maxEntries,
|
|
16997
|
+
"maxEntries"
|
|
16836
16998
|
);
|
|
16837
16999
|
let declared = 0;
|
|
16838
17000
|
for (const entry3 of entries) {
|
|
16839
17001
|
const original = entry3.unsafeOriginalName;
|
|
16840
17002
|
if (!isSafePartName(entry3.name) || original !== void 0 && !isSafePartName(original))
|
|
16841
|
-
throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries);
|
|
17003
|
+
throw r.fail(`${r.label} package has an unsafe part name`, r.maxEntries, "partName");
|
|
16842
17004
|
if (entry3.dir) continue;
|
|
16843
17005
|
const size = declaredEntrySize(entry3);
|
|
16844
17006
|
if (size > r.maxEntryBytes)
|
|
16845
17007
|
throw r.fail(
|
|
16846
17008
|
`${r.label} part ${entry3.name} exceeds the uncompressed part size limit`,
|
|
16847
|
-
r.maxEntryBytes
|
|
17009
|
+
r.maxEntryBytes,
|
|
17010
|
+
"maxEntryBytes"
|
|
16848
17011
|
);
|
|
16849
17012
|
declared += size;
|
|
16850
17013
|
}
|
|
16851
17014
|
if (declared > r.maxTotalBytes)
|
|
16852
17015
|
throw r.fail(
|
|
16853
17016
|
`${r.label} package exceeds the ${mib(r.maxTotalBytes)} MiB uncompressed content limit`,
|
|
16854
|
-
r.maxTotalBytes
|
|
17017
|
+
r.maxTotalBytes,
|
|
17018
|
+
"maxTotalBytes"
|
|
16855
17019
|
);
|
|
16856
17020
|
const produced = /* @__PURE__ */ new Map();
|
|
16857
17021
|
let total2 = 0;
|
|
@@ -18894,10 +19058,69 @@ function mergeComments(legacy, threaded) {
|
|
|
18894
19058
|
(a2, b) => a2.address.row - b.address.row || a2.address.col - b.address.col
|
|
18895
19059
|
);
|
|
18896
19060
|
}
|
|
18897
|
-
|
|
18898
|
-
|
|
18899
|
-
var
|
|
18900
|
-
|
|
19061
|
+
|
|
19062
|
+
// xlsx/read/limits.ts
|
|
19063
|
+
var DEFAULT_XLSX_LOAD_LIMITS = {
|
|
19064
|
+
maxInputBytes: 50 * 1024 * 1024,
|
|
19065
|
+
maxParts: 1e4,
|
|
19066
|
+
maxPartBytes: 200 * 1024 * 1024,
|
|
19067
|
+
maxTotalBytes: 300 * 1024 * 1024,
|
|
19068
|
+
maxXmlElements: 5e6
|
|
19069
|
+
};
|
|
19070
|
+
var WorkbookTooLargeError = class extends Error {
|
|
19071
|
+
code = "workbook-too-large";
|
|
19072
|
+
/** The limit that was exceeded, as named in {@link XlsxLoadLimits}. */
|
|
19073
|
+
limit;
|
|
19074
|
+
/** The value of that limit when the load failed. */
|
|
19075
|
+
maximum;
|
|
19076
|
+
constructor(message, limit2, maximum, options7) {
|
|
19077
|
+
super(message, options7);
|
|
19078
|
+
this.name = "WorkbookTooLargeError";
|
|
19079
|
+
this.limit = limit2;
|
|
19080
|
+
this.maximum = maximum;
|
|
19081
|
+
}
|
|
19082
|
+
};
|
|
19083
|
+
function resolveLoadLimits(limits = {}) {
|
|
19084
|
+
const resolved = { ...DEFAULT_XLSX_LOAD_LIMITS };
|
|
19085
|
+
for (const name of Object.keys(resolved)) {
|
|
19086
|
+
const value3 = limits[name];
|
|
19087
|
+
if (value3 === void 0) continue;
|
|
19088
|
+
if (!Number.isFinite(value3) || value3 <= 0)
|
|
19089
|
+
throw new RangeError(`limits.${name} must be a positive finite number`);
|
|
19090
|
+
resolved[name] = value3;
|
|
19091
|
+
}
|
|
19092
|
+
return resolved;
|
|
19093
|
+
}
|
|
19094
|
+
var ZIP_LIMIT_NAMES = {
|
|
19095
|
+
maxInputBytes: "maxInputBytes",
|
|
19096
|
+
maxEntries: "maxParts",
|
|
19097
|
+
maxEntryBytes: "maxPartBytes",
|
|
19098
|
+
maxTotalBytes: "maxTotalBytes"
|
|
19099
|
+
};
|
|
19100
|
+
function zipLimitsFor(limits) {
|
|
19101
|
+
return {
|
|
19102
|
+
maxInputBytes: limits.maxInputBytes,
|
|
19103
|
+
maxEntries: limits.maxParts,
|
|
19104
|
+
maxEntryBytes: limits.maxPartBytes,
|
|
19105
|
+
maxTotalBytes: limits.maxTotalBytes,
|
|
19106
|
+
label: "XLSX",
|
|
19107
|
+
createError: (message, { limit: limit2, kind }) => {
|
|
19108
|
+
const name = ZIP_LIMIT_NAMES[kind];
|
|
19109
|
+
return name ? new WorkbookTooLargeError(message, name, limit2) : new ZipLimitError(message, { limit: limit2, kind });
|
|
19110
|
+
}
|
|
19111
|
+
};
|
|
19112
|
+
}
|
|
19113
|
+
function parseDataXml(xml, label2, maxXmlElements = DEFAULT_XLSX_LOAD_LIMITS.maxXmlElements) {
|
|
19114
|
+
try {
|
|
19115
|
+
return parseXml(xml, { label: label2, limits: { maxNodes: maxXmlElements } });
|
|
19116
|
+
} catch (error) {
|
|
19117
|
+
if (error instanceof XmlLimitError && error.limit === "maxNodes")
|
|
19118
|
+
throw new WorkbookTooLargeError(error.message, "maxXmlElements", error.maximum, {
|
|
19119
|
+
cause: error
|
|
19120
|
+
});
|
|
19121
|
+
throw error;
|
|
19122
|
+
}
|
|
19123
|
+
}
|
|
18901
19124
|
var CONTENT_TYPES = {
|
|
18902
19125
|
workbook: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
|
|
18903
19126
|
workbookMacro: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
|
|
@@ -18987,16 +19210,15 @@ var SourceIndex = class {
|
|
|
18987
19210
|
};
|
|
18988
19211
|
var mib2 = (bytes) => Math.round(bytes / 1048576);
|
|
18989
19212
|
async function readZipParts(input, limits = {}) {
|
|
18990
|
-
const
|
|
18991
|
-
const
|
|
18992
|
-
maxEntries: limits.maxParts ?? MAX_PARTS,
|
|
18993
|
-
maxEntryBytes: limits.maxPartBytes ?? MAX_PART_BYTES,
|
|
18994
|
-
maxTotalBytes: limits.maxTotalBytes ?? MAX_UNCOMPRESSED_BYTES,
|
|
18995
|
-
label: "XLSX"
|
|
18996
|
-
};
|
|
19213
|
+
const resolved = resolveLoadLimits(limits);
|
|
19214
|
+
const maxInput = resolved.maxInputBytes;
|
|
18997
19215
|
const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
|
|
18998
19216
|
if (bytes.byteLength > maxInput)
|
|
18999
|
-
throw new
|
|
19217
|
+
throw new WorkbookTooLargeError(
|
|
19218
|
+
`XLSX package exceeds the ${mib2(maxInput)} MiB compressed input limit`,
|
|
19219
|
+
"maxInputBytes",
|
|
19220
|
+
maxInput
|
|
19221
|
+
);
|
|
19000
19222
|
let loaded;
|
|
19001
19223
|
try {
|
|
19002
19224
|
loaded = await JSZip2.loadAsync(bytes);
|
|
@@ -19006,7 +19228,7 @@ async function readZipParts(input, limits = {}) {
|
|
|
19006
19228
|
{ cause: error }
|
|
19007
19229
|
);
|
|
19008
19230
|
}
|
|
19009
|
-
const zip = guardZip(loaded,
|
|
19231
|
+
const zip = guardZip(loaded, zipLimitsFor(resolved));
|
|
19010
19232
|
const parts = /* @__PURE__ */ new Map();
|
|
19011
19233
|
for (const entry3 of Object.values(zip.files)) {
|
|
19012
19234
|
if (entry3.dir) continue;
|
|
@@ -19213,9 +19435,9 @@ function parseRichString(element2, palette) {
|
|
|
19213
19435
|
const text4 = parsed.map((run2) => run2.text).join("");
|
|
19214
19436
|
return { text: text4, runs: parsed };
|
|
19215
19437
|
}
|
|
19216
|
-
function parseSharedStrings(xml, palette) {
|
|
19438
|
+
function parseSharedStrings(xml, palette, maxXmlElements) {
|
|
19217
19439
|
if (!xml) return [];
|
|
19218
|
-
const root =
|
|
19440
|
+
const root = parseDataXml(xml, "XLSX shared strings", maxXmlElements).documentElement;
|
|
19219
19441
|
return xChildren(root, "si").map((si) => parseRichString(si, palette));
|
|
19220
19442
|
}
|
|
19221
19443
|
|
|
@@ -24588,21 +24810,50 @@ function rootNamespaces(xml) {
|
|
|
24588
24810
|
for (const match2 of (root[2] ?? "").matchAll(DECLARATION2)) out[match2[1] ?? ""] = match2[3] ?? "";
|
|
24589
24811
|
return out;
|
|
24590
24812
|
}
|
|
24813
|
+
var SPECIAL = /<[!?]/g;
|
|
24814
|
+
var SECTIONS = [
|
|
24815
|
+
["<!--", "-->"],
|
|
24816
|
+
["<![CDATA[", "]]>"],
|
|
24817
|
+
["<?", "?>"]
|
|
24818
|
+
];
|
|
24819
|
+
function blankComments(xml) {
|
|
24820
|
+
if (!xml.includes("<!--") && !xml.includes("<![CDATA[")) return xml;
|
|
24821
|
+
const pieces = [];
|
|
24822
|
+
let copied = 0;
|
|
24823
|
+
SPECIAL.lastIndex = 0;
|
|
24824
|
+
for (let match2 = SPECIAL.exec(xml); match2; match2 = SPECIAL.exec(xml)) {
|
|
24825
|
+
const at = match2.index;
|
|
24826
|
+
const section = SECTIONS.find(([open2]) => xml.startsWith(open2, at));
|
|
24827
|
+
if (!section) return void 0;
|
|
24828
|
+
const [open, close2] = section;
|
|
24829
|
+
const end = xml.indexOf(close2, at + open.length);
|
|
24830
|
+
if (end < 0) return void 0;
|
|
24831
|
+
const after = end + close2.length;
|
|
24832
|
+
if (open !== "<?") {
|
|
24833
|
+
pieces.push(xml.slice(copied, at), " ".repeat(after - at));
|
|
24834
|
+
copied = after;
|
|
24835
|
+
}
|
|
24836
|
+
SPECIAL.lastIndex = after;
|
|
24837
|
+
}
|
|
24838
|
+
pieces.push(xml.slice(copied));
|
|
24839
|
+
return pieces.join("");
|
|
24840
|
+
}
|
|
24591
24841
|
function splitSheetData(xml) {
|
|
24592
|
-
|
|
24593
|
-
|
|
24594
|
-
const
|
|
24842
|
+
const plain3 = blankComments(xml);
|
|
24843
|
+
if (plain3 === void 0) return void 0;
|
|
24844
|
+
const namespaces = rootNamespaces(plain3);
|
|
24845
|
+
const open = OPEN.exec(plain3);
|
|
24595
24846
|
if (!namespaces || !open) return void 0;
|
|
24596
24847
|
const prefix = (open[1] ?? "").slice(0, -1);
|
|
24597
24848
|
const ns = namespaces[prefix];
|
|
24598
24849
|
if (prefix && ns === void 0) return void 0;
|
|
24599
24850
|
const tagName = `${open[1] ?? ""}sheetData`;
|
|
24600
|
-
const openEnd =
|
|
24851
|
+
const openEnd = plain3.indexOf(">", open.index);
|
|
24601
24852
|
if (openEnd < 0) return void 0;
|
|
24602
|
-
const attributes =
|
|
24853
|
+
const attributes = plain3.slice(open.index + tagName.length + 1, openEnd);
|
|
24603
24854
|
if (attributes.trimEnd().endsWith("/") || attributes.includes("xmlns")) return void 0;
|
|
24604
|
-
const close2 =
|
|
24605
|
-
if (close2 < 0 || OPEN.test(
|
|
24855
|
+
const close2 = plain3.indexOf(`</${tagName}`, openEnd);
|
|
24856
|
+
if (close2 < 0 || OPEN.test(plain3.slice(openEnd))) return void 0;
|
|
24606
24857
|
const container = new LiteElement(tagName, "sheetData", ns || null);
|
|
24607
24858
|
const data = parseLiteFragment(xml.slice(openEnd + 1, close2), container, namespaces);
|
|
24608
24859
|
if (!data) return void 0;
|
|
@@ -24807,7 +25058,11 @@ function parseWorksheet(ctx, partName, name, sheetId) {
|
|
|
24807
25058
|
return sheet;
|
|
24808
25059
|
}
|
|
24809
25060
|
const split = splitSheetData(xml);
|
|
24810
|
-
const root =
|
|
25061
|
+
const root = parseDataXml(
|
|
25062
|
+
split?.xml ?? xml,
|
|
25063
|
+
"XLSX worksheet",
|
|
25064
|
+
ctx.maxXmlElements
|
|
25065
|
+
).documentElement;
|
|
24811
25066
|
const byName = /* @__PURE__ */ new Map();
|
|
24812
25067
|
const cfBlocks = [];
|
|
24813
25068
|
for (const node2 of elements(root)) {
|
|
@@ -24881,8 +25136,9 @@ function liftPrintAreas(workbook) {
|
|
|
24881
25136
|
return false;
|
|
24882
25137
|
});
|
|
24883
25138
|
}
|
|
24884
|
-
async function loadXlsx(input) {
|
|
24885
|
-
const
|
|
25139
|
+
async function loadXlsx(input, options7 = {}) {
|
|
25140
|
+
const limits = resolveLoadLimits(options7.limits);
|
|
25141
|
+
const parts = await readZipParts(input, limits);
|
|
24886
25142
|
const source2 = new SourceIndex(parts);
|
|
24887
25143
|
const workbookPart = source2.workbookPart();
|
|
24888
25144
|
if (!workbookPart) throw new Error("XLSX package has no workbook part (xl/workbook.xml)");
|
|
@@ -24903,7 +25159,8 @@ async function loadXlsx(input) {
|
|
|
24903
25159
|
source: source2,
|
|
24904
25160
|
sharedStrings: parseSharedStrings(
|
|
24905
25161
|
stringsPart ? source2.text(stringsPart) : void 0,
|
|
24906
|
-
styles.palette
|
|
25162
|
+
styles.palette,
|
|
25163
|
+
limits.maxXmlElements
|
|
24907
25164
|
),
|
|
24908
25165
|
xfMap: styles.xfMap,
|
|
24909
25166
|
date1904: book.date1904,
|
|
@@ -24911,7 +25168,8 @@ async function loadXlsx(input) {
|
|
|
24911
25168
|
dxfs: styles.dxfs,
|
|
24912
25169
|
persons: parsePersons(personsPart ? source2.text(personsPart) : void 0),
|
|
24913
25170
|
dynamicCells: parseDynamicArrayMetadata(metadataPart ? source2.text(metadataPart) : void 0),
|
|
24914
|
-
warn
|
|
25171
|
+
warn,
|
|
25172
|
+
maxXmlElements: limits.maxXmlElements
|
|
24915
25173
|
};
|
|
24916
25174
|
const rels = source2.rels(workbookPart);
|
|
24917
25175
|
const sheets = book.sheets.map((entry3) => {
|
|
@@ -29223,10 +29481,8 @@ function sheetFormatXml(sheet) {
|
|
|
29223
29481
|
const current = { defaultRowHeight: sheet.defaultRowHeight };
|
|
29224
29482
|
if (sheet.defaultColWidth !== void 0) current.defaultColWidth = sheet.defaultColWidth;
|
|
29225
29483
|
if (sheet.format && Object.keys(sheet.format).length) current.format = sheet.format;
|
|
29226
|
-
|
|
29227
|
-
|
|
29228
|
-
...[...sheet.rowInfo.values()].map((info) => info.outlineLevel ?? 0)
|
|
29229
|
-
);
|
|
29484
|
+
let rowLevel = 0;
|
|
29485
|
+
for (const info of sheet.rowInfo.values()) rowLevel = Math.max(rowLevel, info.outlineLevel ?? 0);
|
|
29230
29486
|
const colLevel = Math.max(0, ...sheet.columns.map((col) => col.outlineLevel ?? 0));
|
|
29231
29487
|
if (source2 && sameModel(readSheetFormat(source2), current) && Number(source2.getAttribute("outlineLevelRow") ?? 0) === rowLevel && Number(source2.getAttribute("outlineLevelCol") ?? 0) === colLevel)
|
|
29232
29488
|
return snapshotXml(sheet, "sheetFormatPr") ?? "";
|
|
@@ -29528,11 +29784,10 @@ function pivotCacheDefinitionXml(pivot, workbook, data, recordRel) {
|
|
|
29528
29784
|
const items = data.items[index3];
|
|
29529
29785
|
if (pivot.dateFields?.includes(name) && items.every((v) => typeof v === "number")) {
|
|
29530
29786
|
const serials = items;
|
|
29531
|
-
const
|
|
29532
|
-
const maxDate = Number.isInteger(latest) ? latest + 1 : latest;
|
|
29787
|
+
const range2 = dateGroupRange({}, serials);
|
|
29533
29788
|
const parent = derived.filter((entry3) => entry3.group.field === name).at(-1);
|
|
29534
29789
|
const link = parent ? `<fieldGroup par="${parent.index}"/>` : "";
|
|
29535
|
-
return `<cacheField${attrs({ name: encodeEscapes(name), numFmtId: 14 })}><sharedItems${attrs({ containsSemiMixedTypes: false, containsNonDate: false, containsDate: true, containsString: false, minDate: iso(
|
|
29790
|
+
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>`;
|
|
29536
29791
|
}
|
|
29537
29792
|
const types = new Set(
|
|
29538
29793
|
items.map((value3) => value3 === null || value3 === "" ? "blank" : typeof value3)
|
|
@@ -30947,7 +31202,8 @@ function setCellValue(ctx, s, row2, col, value3) {
|
|
|
30947
31202
|
}
|
|
30948
31203
|
function setRangeValues(ctx, s, at, values2) {
|
|
30949
31204
|
const sheet = sheetAt(ctx.workbook, s);
|
|
30950
|
-
|
|
31205
|
+
let width = 0;
|
|
31206
|
+
for (const row2 of values2) width = Math.max(width, row2.length);
|
|
30951
31207
|
if (!values2.length || !width) return;
|
|
30952
31208
|
const range2 = cellRange(at.row, at.col, at.row + values2.length - 1, at.col + width - 1);
|
|
30953
31209
|
ctx.run(
|
|
@@ -32271,23 +32527,33 @@ function toHtml(cells, theme2) {
|
|
|
32271
32527
|
for (let c2 = m.start.col; c2 <= m.end.col; c2++)
|
|
32272
32528
|
if (r !== m.start.row || c2 !== m.start.col) covered.add(`${r},${c2}`);
|
|
32273
32529
|
}
|
|
32530
|
+
const styleAttrs = /* @__PURE__ */ new Map();
|
|
32531
|
+
const styleAttr2 = (style3) => {
|
|
32532
|
+
let attr2 = styleAttrs.get(style3);
|
|
32533
|
+
if (attr2 === void 0) {
|
|
32534
|
+
const css = cssFor(style3, theme2);
|
|
32535
|
+
styleAttrs.set(style3, attr2 = css ? `style="${escapeHtml(css)}"` : "");
|
|
32536
|
+
}
|
|
32537
|
+
return attr2;
|
|
32538
|
+
};
|
|
32274
32539
|
const rows2 = [];
|
|
32275
32540
|
for (let r = 0; r < cells.rows; r++) {
|
|
32276
32541
|
const tds = [];
|
|
32277
32542
|
for (let c2 = 0; c2 < cells.cols; c2++) {
|
|
32278
|
-
|
|
32543
|
+
const key = covered.size || spans3.size || links.size ? `${r},${c2}` : "";
|
|
32544
|
+
if (covered.has(key)) continue;
|
|
32279
32545
|
const cell = cells.data[r]?.[c2] ?? null;
|
|
32280
32546
|
const attrs2 = [];
|
|
32281
|
-
const span4 = spans3.get(
|
|
32547
|
+
const span4 = spans3.get(key);
|
|
32282
32548
|
if (span4 && span4.end.row > span4.start.row)
|
|
32283
32549
|
attrs2.push(`rowspan="${span4.end.row - span4.start.row + 1}"`);
|
|
32284
32550
|
if (span4 && span4.end.col > span4.start.col)
|
|
32285
32551
|
attrs2.push(`colspan="${span4.end.col - span4.start.col + 1}"`);
|
|
32286
32552
|
if (cell && typeof cell.value === "number") attrs2.push(`x:num="${cell.value}"`);
|
|
32287
|
-
const css =
|
|
32288
|
-
if (css) attrs2.push(
|
|
32553
|
+
const css = styleAttr2(cell?.style);
|
|
32554
|
+
if (css) attrs2.push(css);
|
|
32289
32555
|
let text4 = escapeHtml(cell?.text ?? "").replace(/\n/g, "<br>");
|
|
32290
|
-
const link = links.get(
|
|
32556
|
+
const link = links.get(key);
|
|
32291
32557
|
const href = htmlHref(link);
|
|
32292
32558
|
if (href)
|
|
32293
32559
|
text4 = `<a href="${escapeHtml(href)}"${link?.tooltip ? ` title="${escapeHtml(link.tooltip)}"` : ""}>${text4}</a>`;
|
|
@@ -32595,7 +32861,8 @@ function parseTsv(text4) {
|
|
|
32595
32861
|
}
|
|
32596
32862
|
row2.push(field);
|
|
32597
32863
|
rows2.push(row2);
|
|
32598
|
-
|
|
32864
|
+
let width = 0;
|
|
32865
|
+
for (const r of rows2) width = Math.max(width, r.length);
|
|
32599
32866
|
for (const r of rows2) while (r.length < width) r.push("");
|
|
32600
32867
|
return rows2;
|
|
32601
32868
|
}
|
|
@@ -32850,10 +33117,16 @@ function copyRange(workbook, s, range2) {
|
|
|
32850
33117
|
{ length: rows2 },
|
|
32851
33118
|
() => Array.from({ length: cols }, () => null)
|
|
32852
33119
|
);
|
|
33120
|
+
const styles = /* @__PURE__ */ new Map();
|
|
33121
|
+
const styleCopy = (id) => {
|
|
33122
|
+
let style3 = styles.get(id ?? 0);
|
|
33123
|
+
if (!style3) styles.set(id ?? 0, style3 = structuredClone(styleAt(workbook, id)));
|
|
33124
|
+
return style3;
|
|
33125
|
+
};
|
|
32853
33126
|
forEachCellInRange(sheet, clipped, (cell, row2, col) => {
|
|
32854
33127
|
const clip = {
|
|
32855
33128
|
value: cell.value,
|
|
32856
|
-
style:
|
|
33129
|
+
style: styleCopy(cell.styleId),
|
|
32857
33130
|
text: displayText(workbook, cell)
|
|
32858
33131
|
};
|
|
32859
33132
|
if (cell.formula !== void 0) clip.formula = cell.formula;
|
|
@@ -33131,7 +33404,7 @@ function setColumnWidth(ctx, s, cols, width, measure3) {
|
|
|
33131
33404
|
ctx.run(
|
|
33132
33405
|
"Column width",
|
|
33133
33406
|
"view",
|
|
33134
|
-
[{ kind: "
|
|
33407
|
+
[{ kind: "parts", sheet: s, parts: ["columns"] }],
|
|
33135
33408
|
() => editColumns(sheet, cols, (info) => {
|
|
33136
33409
|
const next = widths.get(info.min);
|
|
33137
33410
|
if (next === void 0) {
|
|
@@ -33166,7 +33439,7 @@ function setRowHeight(ctx, s, rows2, height) {
|
|
|
33166
33439
|
ctx.run(
|
|
33167
33440
|
"Row height",
|
|
33168
33441
|
"view",
|
|
33169
|
-
[{ kind: "
|
|
33442
|
+
[{ kind: "rowInfo", sheet: s, rows: rows2 }],
|
|
33170
33443
|
() => {
|
|
33171
33444
|
for (const row2 of rows2) {
|
|
33172
33445
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
@@ -33196,7 +33469,9 @@ function setHidden(ctx, s, axis, indices, hidden) {
|
|
|
33196
33469
|
ctx.run(
|
|
33197
33470
|
`${hidden ? "Hide" : "Unhide"} ${noun}`,
|
|
33198
33471
|
"view",
|
|
33199
|
-
[
|
|
33472
|
+
[
|
|
33473
|
+
axis === "col" ? { kind: "parts", sheet: s, parts: ["columns"] } : { kind: "rowInfo", sheet: s, rows: indices }
|
|
33474
|
+
],
|
|
33200
33475
|
() => {
|
|
33201
33476
|
if (axis === "col") {
|
|
33202
33477
|
editColumns(sheet, indices, (info) => {
|
|
@@ -33790,6 +34065,30 @@ function shiftEdgeCells(sheet, spec2, phase) {
|
|
|
33790
34065
|
return out;
|
|
33791
34066
|
}
|
|
33792
34067
|
|
|
34068
|
+
// xlsx/edit/clone-cell.ts
|
|
34069
|
+
function cloneCell(cell) {
|
|
34070
|
+
const copy2 = { ...cell };
|
|
34071
|
+
const fields = copy2;
|
|
34072
|
+
for (const key of Object.keys(fields)) {
|
|
34073
|
+
const value3 = fields[key];
|
|
34074
|
+
if (typeof value3 === "object" && value3 !== null) fields[key] = structuredClone(value3);
|
|
34075
|
+
}
|
|
34076
|
+
return copy2;
|
|
34077
|
+
}
|
|
34078
|
+
|
|
34079
|
+
// xlsx/edit/history-rows.ts
|
|
34080
|
+
function captureRowInfo(sheet, rows2) {
|
|
34081
|
+
return [...new Set(rows2)].map((row2) => {
|
|
34082
|
+
const info = sheet.rowInfo.get(row2);
|
|
34083
|
+
return [row2, info && structuredClone(info)];
|
|
34084
|
+
});
|
|
34085
|
+
}
|
|
34086
|
+
function restoreRowInfo(sheet, entries) {
|
|
34087
|
+
for (const [row2, info] of entries)
|
|
34088
|
+
if (info) sheet.rowInfo.set(row2, structuredClone(info));
|
|
34089
|
+
else sheet.rowInfo.delete(row2);
|
|
34090
|
+
}
|
|
34091
|
+
|
|
33793
34092
|
// xlsx/edit/history.ts
|
|
33794
34093
|
var SETTING_KEYS = [
|
|
33795
34094
|
"structureLocked",
|
|
@@ -33817,12 +34116,14 @@ function restoreSettings(workbook, settings) {
|
|
|
33817
34116
|
var PROBE_LIMIT = 4096;
|
|
33818
34117
|
function captureCells(sheet, ranges) {
|
|
33819
34118
|
const cells = [];
|
|
33820
|
-
const seen = /* @__PURE__ */ new Set();
|
|
34119
|
+
const seen = ranges.length > 1 ? /* @__PURE__ */ new Set() : void 0;
|
|
33821
34120
|
const take2 = (cell, row2, col) => {
|
|
33822
|
-
|
|
33823
|
-
|
|
33824
|
-
|
|
33825
|
-
|
|
34121
|
+
if (seen) {
|
|
34122
|
+
const key = cellKey(row2, col);
|
|
34123
|
+
if (seen.has(key)) return;
|
|
34124
|
+
seen.add(key);
|
|
34125
|
+
}
|
|
34126
|
+
cells.push([row2, col, cloneCell(cell)]);
|
|
33826
34127
|
};
|
|
33827
34128
|
for (const raw2 of ranges) {
|
|
33828
34129
|
const range2 = normalizeRange(raw2);
|
|
@@ -33874,6 +34175,8 @@ function captureScope(workbook, scope, before) {
|
|
|
33874
34175
|
if (!sheet) throw new RangeError(`No sheet at index ${scope.sheet}`);
|
|
33875
34176
|
if (scope.kind === "sheet")
|
|
33876
34177
|
return { kind: "sheet", sheet: scope.sheet, data: structuredClone(sheet) };
|
|
34178
|
+
if (scope.kind === "rowInfo")
|
|
34179
|
+
return { kind: "rowInfo", sheet: scope.sheet, rows: captureRowInfo(sheet, scope.rows) };
|
|
33877
34180
|
if (scope.kind === "parts") {
|
|
33878
34181
|
const data = {};
|
|
33879
34182
|
for (const part of scope.parts) if (sheet[part] !== void 0) data[part] = sheet[part];
|
|
@@ -33897,7 +34200,7 @@ function restoreShift(workbook, snapshot) {
|
|
|
33897
34200
|
if (!sheet) return;
|
|
33898
34201
|
const shift2 = snapshot.phase === "before" ? { ...spec2.shift, count: -spec2.shift.count } : spec2.shift;
|
|
33899
34202
|
moveCellsRaw(sheet, shift2, spec2.band);
|
|
33900
|
-
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col,
|
|
34203
|
+
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
|
|
33901
34204
|
restoreRefs(workbook, snapshot.data);
|
|
33902
34205
|
workbook.activeSheet = snapshot.activeSheet;
|
|
33903
34206
|
}
|
|
@@ -33925,6 +34228,7 @@ function restoreSnapshot(workbook, snapshot) {
|
|
|
33925
34228
|
}
|
|
33926
34229
|
const sheet = workbook.sheets[snapshot.sheet];
|
|
33927
34230
|
if (!sheet) return;
|
|
34231
|
+
if (snapshot.kind === "rowInfo") return restoreRowInfo(sheet, snapshot.rows);
|
|
33928
34232
|
if (snapshot.kind === "parts") {
|
|
33929
34233
|
const target2 = sheet;
|
|
33930
34234
|
const data = structuredClone(snapshot.data);
|
|
@@ -33945,18 +34249,51 @@ function restoreSnapshot(workbook, snapshot) {
|
|
|
33945
34249
|
forEachCellInRange(sheet, range2, (_cell, row2, col) => doomed.push([row2, col]));
|
|
33946
34250
|
for (const [row2, col] of doomed) deleteCell(sheet, row2, col);
|
|
33947
34251
|
}
|
|
33948
|
-
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col,
|
|
34252
|
+
for (const [row2, col, cell] of snapshot.cells) putCell(sheet, row2, col, cloneCell(cell));
|
|
34253
|
+
}
|
|
34254
|
+
function rowMajor(cells) {
|
|
34255
|
+
for (let i2 = 1; i2 < cells.length; i2++) {
|
|
34256
|
+
const [row0, col0] = cells[i2 - 1];
|
|
34257
|
+
const [row1, col1] = cells[i2];
|
|
34258
|
+
if (row1 < row0 || row1 === row0 && col1 <= col0) return false;
|
|
34259
|
+
}
|
|
34260
|
+
return true;
|
|
33949
34261
|
}
|
|
33950
34262
|
function touchedCells(step) {
|
|
33951
34263
|
const out = [];
|
|
33952
|
-
const
|
|
34264
|
+
const lists = step.entries.flatMap((entry3) => [entry3.before, entry3.after]).filter((snapshot) => snapshot.kind === "cells" && snapshot.cells.length > 0);
|
|
34265
|
+
const [first2, second, ...rest] = lists;
|
|
34266
|
+
if (first2 && !rest.length && (!second || second.sheet === first2.sheet)) {
|
|
34267
|
+
const sheet = first2.sheet;
|
|
34268
|
+
for (const [row2, col] of first2.cells) out.push({ sheet, row: row2, col });
|
|
34269
|
+
if (!second) return out;
|
|
34270
|
+
if (rowMajor(first2.cells) && rowMajor(second.cells)) {
|
|
34271
|
+
let i2 = 0;
|
|
34272
|
+
for (const [row2, col] of second.cells) {
|
|
34273
|
+
const key = cellKey(row2, col);
|
|
34274
|
+
while (i2 < first2.cells.length) {
|
|
34275
|
+
const [r, c2] = first2.cells[i2];
|
|
34276
|
+
if (cellKey(r, c2) >= key) break;
|
|
34277
|
+
i2++;
|
|
34278
|
+
}
|
|
34279
|
+
const at = first2.cells[i2];
|
|
34280
|
+
if (at && cellKey(at[0], at[1]) === key) continue;
|
|
34281
|
+
out.push({ sheet, row: row2, col });
|
|
34282
|
+
}
|
|
34283
|
+
return out;
|
|
34284
|
+
}
|
|
34285
|
+
out.length = 0;
|
|
34286
|
+
}
|
|
34287
|
+
const seen = /* @__PURE__ */ new Map();
|
|
33953
34288
|
for (const entry3 of step.entries)
|
|
33954
34289
|
for (const snapshot of [entry3.before, entry3.after]) {
|
|
33955
34290
|
if (snapshot.kind !== "cells") continue;
|
|
34291
|
+
let keys = seen.get(snapshot.sheet);
|
|
34292
|
+
if (!keys) seen.set(snapshot.sheet, keys = /* @__PURE__ */ new Set());
|
|
33956
34293
|
for (const [row2, col] of snapshot.cells) {
|
|
33957
|
-
const key =
|
|
33958
|
-
if (
|
|
33959
|
-
|
|
34294
|
+
const key = cellKey(row2, col);
|
|
34295
|
+
if (keys.has(key)) continue;
|
|
34296
|
+
keys.add(key);
|
|
33960
34297
|
out.push({ sheet: snapshot.sheet, row: row2, col });
|
|
33961
34298
|
}
|
|
33962
34299
|
}
|
|
@@ -34053,7 +34390,7 @@ var SessionCalculator = class {
|
|
|
34053
34390
|
}
|
|
34054
34391
|
this.calc.discardPreparation();
|
|
34055
34392
|
if (structural) this.staleGraph = true;
|
|
34056
|
-
else this.dirty.push(
|
|
34393
|
+
else for (const cell of touchedCells(step)) this.dirty.push(cell);
|
|
34057
34394
|
return;
|
|
34058
34395
|
}
|
|
34059
34396
|
if (hint && !this.staleGraph) {
|
|
@@ -34072,7 +34409,7 @@ var SessionCalculator = class {
|
|
|
34072
34409
|
this.calc.discardPreparation();
|
|
34073
34410
|
if (!this.enabled) return;
|
|
34074
34411
|
if (structural) this.staleGraph = true;
|
|
34075
|
-
else this.dirty.push(
|
|
34412
|
+
else for (const cell of cells) this.dirty.push(cell);
|
|
34076
34413
|
return;
|
|
34077
34414
|
}
|
|
34078
34415
|
this.recalc(structural, () => cells);
|
|
@@ -35134,8 +35471,16 @@ function insertTimeline(ctx, s, ref) {
|
|
|
35134
35471
|
const pivot = sheet.pivotTables?.find((entry3) => entry3.name === ref.pivot);
|
|
35135
35472
|
if (!pivot || !pivot.dateFields?.includes(ref.field))
|
|
35136
35473
|
throw new Error("Choose a PivotTable with a date field.");
|
|
35137
|
-
const
|
|
35138
|
-
|
|
35474
|
+
const column2 = pivot.fields.indexOf(ref.field);
|
|
35475
|
+
let earliest = Infinity;
|
|
35476
|
+
let latest = -Infinity;
|
|
35477
|
+
for (const record of pivot.records) {
|
|
35478
|
+
const value3 = record[column2];
|
|
35479
|
+
if (typeof value3 !== "number") continue;
|
|
35480
|
+
earliest = Math.min(earliest, value3);
|
|
35481
|
+
latest = Math.max(latest, value3);
|
|
35482
|
+
}
|
|
35483
|
+
if (earliest > latest) throw new Error("Choose a PivotTable with a date field.");
|
|
35139
35484
|
const taken = /* @__PURE__ */ new Set([
|
|
35140
35485
|
...(workbook.slicers?.slicers ?? []).map((entry3) => entry3.name.toLowerCase()),
|
|
35141
35486
|
...(workbook.slicers?.timelines ?? []).map((entry3) => entry3.name.toLowerCase()),
|
|
@@ -35153,8 +35498,8 @@ function insertTimeline(ctx, s, ref) {
|
|
|
35153
35498
|
"_"
|
|
35154
35499
|
);
|
|
35155
35500
|
const bounds = boundsOfSerialRange(
|
|
35156
|
-
serialToIso(
|
|
35157
|
-
serialToIso(
|
|
35501
|
+
serialToIso(earliest, workbook.date1904),
|
|
35502
|
+
serialToIso(latest, workbook.date1904)
|
|
35158
35503
|
);
|
|
35159
35504
|
const metrics = createGridMetrics(sheet, { zoom: 100 });
|
|
35160
35505
|
let right2 = 0;
|
|
@@ -36317,12 +36662,13 @@ function span2(from, to) {
|
|
|
36317
36662
|
}
|
|
36318
36663
|
function outlineRows(ctx, s, from, to, delta) {
|
|
36319
36664
|
const sheet = sheetAt(ctx.workbook, s);
|
|
36665
|
+
const rows2 = span2(from, to);
|
|
36320
36666
|
ctx.run(
|
|
36321
36667
|
delta > 0 ? "Group rows" : "Ungroup rows",
|
|
36322
36668
|
"structure",
|
|
36323
|
-
[{ kind: "
|
|
36669
|
+
[{ kind: "rowInfo", sheet: s, rows: rows2 }],
|
|
36324
36670
|
() => {
|
|
36325
|
-
for (const row2 of
|
|
36671
|
+
for (const row2 of rows2) {
|
|
36326
36672
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
36327
36673
|
const level2 = nextLevel(info.outlineLevel, delta);
|
|
36328
36674
|
if (level2) info.outlineLevel = level2;
|
|
@@ -36342,7 +36688,7 @@ function outlineColumns(ctx, s, from, to, delta) {
|
|
|
36342
36688
|
ctx.run(
|
|
36343
36689
|
delta > 0 ? "Group columns" : "Ungroup columns",
|
|
36344
36690
|
"structure",
|
|
36345
|
-
[{ kind: "
|
|
36691
|
+
[{ kind: "parts", sheet: s, parts: ["columns"] }],
|
|
36346
36692
|
() => editColumns(sheet, span2(from, to), (info) => {
|
|
36347
36693
|
const level2 = nextLevel(info.outlineLevel, delta);
|
|
36348
36694
|
if (level2) info.outlineLevel = level2;
|
|
@@ -36365,7 +36711,7 @@ function setDefaultColumnWidth(ctx, s, width) {
|
|
|
36365
36711
|
ctx.run(
|
|
36366
36712
|
"Standard width",
|
|
36367
36713
|
"format",
|
|
36368
|
-
[{ kind: "
|
|
36714
|
+
[{ kind: "parts", sheet: s, parts: ["defaultColWidth"] }],
|
|
36369
36715
|
() => {
|
|
36370
36716
|
if (width === void 0) Reflect.deleteProperty(sheet, "defaultColWidth");
|
|
36371
36717
|
else sheet.defaultColWidth = width;
|
|
@@ -38567,6 +38913,15 @@ function mergeFont(base, font) {
|
|
|
38567
38913
|
if (value3 !== void 0) out[key] = value3;
|
|
38568
38914
|
return out;
|
|
38569
38915
|
}
|
|
38916
|
+
function cellFont(font, defaultFont) {
|
|
38917
|
+
const out = { ...font };
|
|
38918
|
+
if (!out.name && !out.scheme) {
|
|
38919
|
+
if (defaultFont.name) out.name = defaultFont.name;
|
|
38920
|
+
if (defaultFont.scheme) out.scheme = defaultFont.scheme;
|
|
38921
|
+
}
|
|
38922
|
+
if (!out.size && defaultFont.size) out.size = defaultFont.size;
|
|
38923
|
+
return out;
|
|
38924
|
+
}
|
|
38570
38925
|
function fontView(font, theme2) {
|
|
38571
38926
|
const family = font.scheme === "major" ? theme2.majorFont || font.name || "Calibri Light" : font.scheme === "minor" ? theme2.minorFont || font.name || "Calibri" : font.name || theme2.minorFont || "Calibri";
|
|
38572
38927
|
const view = {
|
|
@@ -38691,14 +39046,7 @@ function cellView(workbook, sheetIndex2, row2, col, cf, options7 = {}) {
|
|
|
38691
39046
|
const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
|
|
38692
39047
|
const conditional = cf?.at(row2, col);
|
|
38693
39048
|
const dxf = conditional?.style;
|
|
38694
|
-
const
|
|
38695
|
-
const base = { ...style3.font };
|
|
38696
|
-
if (!base.name && !base.scheme) {
|
|
38697
|
-
if (defaultFont.name) base.name = defaultFont.name;
|
|
38698
|
-
if (defaultFont.scheme) base.scheme = defaultFont.scheme;
|
|
38699
|
-
}
|
|
38700
|
-
if (!base.size && defaultFont.size) base.size = defaultFont.size;
|
|
38701
|
-
const font = mergeFont(base, dxf?.font);
|
|
39049
|
+
const font = mergeFont(cellFont(style3.font, workbook.styles[0]?.font ?? {}), dxf?.font);
|
|
38702
39050
|
const formulaText = sheet.view.showFormulas && cell?.formula !== void 0 ? `=${cell.formula}` : void 0;
|
|
38703
39051
|
const shown = formulaText !== void 0 ? { text: formulaText } : displayText2(value3, style3, dxf?.numFmt ?? style3.numFmt, workbook, sheet);
|
|
38704
39052
|
const fontViewResolved = fontView(font, workbook.theme);
|
|
@@ -38949,10 +39297,11 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
|
|
|
38949
39297
|
updates.push([row2, next]);
|
|
38950
39298
|
}
|
|
38951
39299
|
if (!updates.length) return [];
|
|
39300
|
+
const changed = updates.map(([row2]) => row2);
|
|
38952
39301
|
ctx.run(
|
|
38953
39302
|
"Row height",
|
|
38954
39303
|
"view",
|
|
38955
|
-
[{ kind: "
|
|
39304
|
+
[{ kind: "rowInfo", sheet: s, rows: changed }],
|
|
38956
39305
|
() => {
|
|
38957
39306
|
for (const [row2, height] of updates) {
|
|
38958
39307
|
const info = { ...sheet.rowInfo.get(row2) };
|
|
@@ -38964,7 +39313,7 @@ function autoGrowRows(ctx, s, rows2, measure3 = approximateMeasure) {
|
|
|
38964
39313
|
},
|
|
38965
39314
|
{ sheet: s, structural: true }
|
|
38966
39315
|
);
|
|
38967
|
-
return
|
|
39316
|
+
return changed;
|
|
38968
39317
|
}
|
|
38969
39318
|
var MAX_REFIT_ROWS = 1e4;
|
|
38970
39319
|
function rowsToRefit(sheet, ranges) {
|
|
@@ -40294,14 +40643,24 @@ function formatAxisValue(value3, percent = false) {
|
|
|
40294
40643
|
return `${v < 0 ? "-" : ""}${grouped}${frac ? `.${frac}` : ""}`;
|
|
40295
40644
|
}
|
|
40296
40645
|
|
|
40646
|
+
// chart/extent.ts
|
|
40647
|
+
function extentOf(values2) {
|
|
40648
|
+
let min = Infinity;
|
|
40649
|
+
let max = -Infinity;
|
|
40650
|
+
for (const value3 of values2) {
|
|
40651
|
+
min = Math.min(min, value3);
|
|
40652
|
+
max = Math.max(max, value3);
|
|
40653
|
+
}
|
|
40654
|
+
return { min, max };
|
|
40655
|
+
}
|
|
40656
|
+
|
|
40297
40657
|
// chart/axis-range.ts
|
|
40298
40658
|
function computeLogValueRange(series, logBase) {
|
|
40299
40659
|
const allValues = series.flatMap((item) => item.values).filter((value3) => value3 !== null && Number.isFinite(value3) && value3 > 0);
|
|
40300
40660
|
if (allValues.length === 0) {
|
|
40301
40661
|
return { min: 1, max: logBase, span: 1, logScale: true, logBase };
|
|
40302
40662
|
}
|
|
40303
|
-
const dataMin =
|
|
40304
|
-
const dataMax = Math.max(...allValues);
|
|
40663
|
+
const { min: dataMin, max: dataMax } = extentOf(allValues);
|
|
40305
40664
|
const logMin = Math.floor(Math.log(dataMin) / Math.log(logBase));
|
|
40306
40665
|
const logMax = Math.ceil(Math.log(dataMax) / Math.log(logBase));
|
|
40307
40666
|
const min = logBase ** logMin;
|
|
@@ -41328,8 +41687,7 @@ function computeHistogramBins(values2, options7, format = String) {
|
|
|
41328
41687
|
});
|
|
41329
41688
|
}
|
|
41330
41689
|
if (regular.length > 0) {
|
|
41331
|
-
const min =
|
|
41332
|
-
const max = Math.max(...regular.map((item) => item.value));
|
|
41690
|
+
const { min, max } = extentOf(regular.map((item) => item.value));
|
|
41333
41691
|
const requestedSize = options7.binSize && options7.binSize > 0 ? options7.binSize : void 0;
|
|
41334
41692
|
const requestedCount = options7.binCount && options7.binCount > 0 ? options7.binCount : void 0;
|
|
41335
41693
|
const start = requestedSize ? Math.floor(min / requestedSize) * requestedSize : min;
|
|
@@ -41457,8 +41815,9 @@ function waterfallView(chart, model, ctx) {
|
|
|
41457
41815
|
colors: { increase: role(0), decrease: role(1), total: role(2) }
|
|
41458
41816
|
};
|
|
41459
41817
|
const ends = steps.flatMap((step) => [step.startValue, step.endValue]);
|
|
41818
|
+
const range2 = extentOf(ends);
|
|
41460
41819
|
model.valueAxis = {
|
|
41461
|
-
...ends.length ? niceScale(
|
|
41820
|
+
...ends.length ? niceScale(range2.min, range2.max) : niceScale(0, 1),
|
|
41462
41821
|
percent: false
|
|
41463
41822
|
};
|
|
41464
41823
|
const labels = model.categories;
|
|
@@ -41574,7 +41933,8 @@ function chartSummaryView(chart, theme2, options7 = {}) {
|
|
|
41574
41933
|
s.xValues = s.values.map((_, k) => numeric2 ? toNumber2(cats[k] ?? null) : k + 1);
|
|
41575
41934
|
});
|
|
41576
41935
|
const xs = series.flatMap((s) => s.xValues ?? []).filter((x) => x !== null);
|
|
41577
|
-
|
|
41936
|
+
const range2 = extentOf(xs);
|
|
41937
|
+
model.xAxis = xs.length ? niceScale(range2.min, range2.max) : niceScale(0, 1);
|
|
41578
41938
|
}
|
|
41579
41939
|
if (type === "stock") model.stock = stockView(chart.stock, ctx);
|
|
41580
41940
|
if (type === "bubble") bubbleView(chart, model, ctx.evaluateRef);
|
|
@@ -41851,8 +42211,9 @@ function fitChartTrendline(options7, xVals, yVals) {
|
|
|
41851
42211
|
}
|
|
41852
42212
|
const model = fitModel(options7, xVals, yVals);
|
|
41853
42213
|
if (!model) return noFit();
|
|
41854
|
-
const
|
|
41855
|
-
const
|
|
42214
|
+
const xRange = extentOf(xVals);
|
|
42215
|
+
const startX = xRange.min - (options7.backward ?? 0);
|
|
42216
|
+
const endX = xRange.max + (options7.forward ?? 0);
|
|
41856
42217
|
const steps = Math.max(Math.ceil((endX - startX) * 4), 20);
|
|
41857
42218
|
const points = [];
|
|
41858
42219
|
for (let step = 0; step <= steps; step++) {
|
|
@@ -42421,7 +42782,7 @@ function cartesianAxes(model, area, out) {
|
|
|
42421
42782
|
const cats = Math.max(1, model.categories.length);
|
|
42422
42783
|
const catW = Math.min(
|
|
42423
42784
|
area.w * 0.3,
|
|
42424
|
-
Math.max(
|
|
42785
|
+
Math.max(extentOf(model.categories.map((c2) => textWidth(c2, categorySize))).max, 8) + 6
|
|
42425
42786
|
);
|
|
42426
42787
|
const second = horizontal2 ? void 0 : model.secondaryAxis;
|
|
42427
42788
|
const secondLabels = second?.ticks.map((t) => axisTickText(t, model.axes?.secondary, second.percent)) ?? [];
|
|
@@ -42610,7 +42971,7 @@ function computeBubbleRadius(sizeVal, maxBubble, medianRadius, options7) {
|
|
|
42610
42971
|
return medianRadius * scale2 * 0.5 + ratio * medianRadius * scale2 * 1.5;
|
|
42611
42972
|
}
|
|
42612
42973
|
function maxBubbleSize(sizes) {
|
|
42613
|
-
return
|
|
42974
|
+
return Math.max(1, extentOf(sizes.map(Math.abs)).max);
|
|
42614
42975
|
}
|
|
42615
42976
|
function medianBubbleRadius(plotWidth, plotHeight) {
|
|
42616
42977
|
return Math.min(plotWidth, plotHeight) * 0.04;
|
|
@@ -43223,13 +43584,11 @@ function chartLegendSvg(model, area, frame, options7) {
|
|
|
43223
43584
|
chartAreaRect(model, "legend", { x: manual.x, y: manual.y, w: manual.width, h: manual.height })
|
|
43224
43585
|
];
|
|
43225
43586
|
const baselineOffset = font ? (font.ascent - font.descent) / 2 : size * 0.35;
|
|
43587
|
+
const widest = extentOf(widths).max;
|
|
43226
43588
|
entries.forEach((entry3, i2) => {
|
|
43227
43589
|
const available = horizontal2 ? chartTextWidth(entry3.label, attrs2, options7) : Math.max(0, rowWidth - size / 2 - keySize - keyGap);
|
|
43228
43590
|
const label2 = fitChartText(entry3.label, available, attrs2, options7);
|
|
43229
|
-
const contentWidth = Math.min(
|
|
43230
|
-
horizontal2 ? widths[i2] ?? 0 : Math.max(...widths),
|
|
43231
|
-
rowWidth - size / 2
|
|
43232
|
-
);
|
|
43591
|
+
const contentWidth = Math.min(horizontal2 ? widths[i2] ?? 0 : widest, rowWidth - size / 2);
|
|
43233
43592
|
const x = horizontal2 ? horizontalX : manual.x + Math.max(size / 4, (rowWidth - contentWidth) / 2);
|
|
43234
43593
|
const centerY = manual.y + (horizontal2 ? 0 : i2 * rowHeight) + rowHeight / 2;
|
|
43235
43594
|
markup.push(rect(x, centerY - keySize / 2, keySize, keySize, entry3.color));
|
|
@@ -43301,7 +43660,7 @@ function automaticLegend(model, area, out, options7, bounds) {
|
|
|
43301
43660
|
}
|
|
43302
43661
|
const width = Math.min(
|
|
43303
43662
|
area.w * 0.35,
|
|
43304
|
-
|
|
43663
|
+
extentOf(entries.map((e) => chartTextWidth(e.label, attrs2, options7))).max + 22
|
|
43305
43664
|
);
|
|
43306
43665
|
const height = entries.length * rowH;
|
|
43307
43666
|
const x = pos === "l" ? area.x + 4 : area.x + area.w - width;
|
|
@@ -55327,4 +55686,51 @@ function applyThemeColors(host, previous, colors) {
|
|
|
55327
55686
|
return Object.keys(vars);
|
|
55328
55687
|
}
|
|
55329
55688
|
|
|
55330
|
-
|
|
55689
|
+
// xlsx/ui/selection-format.ts
|
|
55690
|
+
function selectionFormatting(workbook, sheetIndex2, ranges) {
|
|
55691
|
+
const values2 = {
|
|
55692
|
+
bold: /* @__PURE__ */ new Set(),
|
|
55693
|
+
italic: /* @__PURE__ */ new Set(),
|
|
55694
|
+
underline: /* @__PURE__ */ new Set(),
|
|
55695
|
+
fontFamily: /* @__PURE__ */ new Set(),
|
|
55696
|
+
fontSize: /* @__PURE__ */ new Set(),
|
|
55697
|
+
alignment: /* @__PURE__ */ new Set(),
|
|
55698
|
+
numberFormat: /* @__PURE__ */ new Set()
|
|
55699
|
+
};
|
|
55700
|
+
const sheet = workbook?.sheets[sheetIndex2];
|
|
55701
|
+
let remaining = 4096;
|
|
55702
|
+
let complete = true;
|
|
55703
|
+
if (workbook && sheet)
|
|
55704
|
+
outer: for (const raw2 of ranges) {
|
|
55705
|
+
const range2 = normalizeRange(raw2);
|
|
55706
|
+
for (let row2 = range2.start.row; row2 <= range2.end.row; row2++) {
|
|
55707
|
+
for (let col = range2.start.col; col <= range2.end.col; col++) {
|
|
55708
|
+
if (--remaining < 0) {
|
|
55709
|
+
complete = false;
|
|
55710
|
+
break outer;
|
|
55711
|
+
}
|
|
55712
|
+
const style3 = styleAt(workbook, effectiveStyleId(sheet, row2, col));
|
|
55713
|
+
values2.bold.add(Boolean(style3.font.bold));
|
|
55714
|
+
values2.italic.add(Boolean(style3.font.italic));
|
|
55715
|
+
values2.underline.add(Boolean(style3.font.underline));
|
|
55716
|
+
values2.fontFamily.add(style3.font.name ?? "Aptos");
|
|
55717
|
+
values2.fontSize.add(style3.font.size ?? 11);
|
|
55718
|
+
values2.alignment.add(style3.alignment?.horizontal ?? "general");
|
|
55719
|
+
values2.numberFormat.add(style3.numFmt ?? "General");
|
|
55720
|
+
}
|
|
55721
|
+
}
|
|
55722
|
+
}
|
|
55723
|
+
const single = (set) => complete && set.size === 1 ? [...set][0] : null;
|
|
55724
|
+
return {
|
|
55725
|
+
bold: single(values2.bold),
|
|
55726
|
+
italic: single(values2.italic),
|
|
55727
|
+
underline: single(values2.underline),
|
|
55728
|
+
fontFamily: single(values2.fontFamily),
|
|
55729
|
+
fontSize: single(values2.fontSize),
|
|
55730
|
+
alignment: single(values2.alignment),
|
|
55731
|
+
numberFormat: single(values2.numberFormat),
|
|
55732
|
+
formattingComplete: complete
|
|
55733
|
+
};
|
|
55734
|
+
}
|
|
55735
|
+
|
|
55736
|
+
export { ACCOUNTING_FORMATS, ALL_RANGE, AUTOSUM_FUNCTIONS, BORDER_PRESETS, CATEGORIES, COLOR_SCALES, COMMAND_TABLES, CORE_FEATURE_STRINGS, CellViewCache, DATA_BAR_COLORS, DATE_CODES, DEFAULT_OPTIONS, DirtyState, EDITOR_LOCALES, EDITOR_THEME_MODES, EMBED_ASPECT, FONT_NAMES, FONT_SIZES, FORECAST_UNAVAILABLE, FORMAT_CELLS_STRINGS, FRACTION_CODES, FUNCTION_MENUS, GROUPED_CHART_TYPES, GridGeometry, HIGHLIGHT_STYLES, ICON_ACCENTS, ICON_PATHS, ICON_SETS, INSERT_CHART_TYPES, MARGIN_PRESETS, MAX_GRID_COLS, MAX_GRID_ROWS, MESSAGE_STRINGS, MORE_FUNCTION_CATEGORIES, NAVIGATION_STRINGS, ORIENTATIONS2 as ORIENTATIONS, PAPER_SIZES, QUADRANTS, RIBBON_HOME_STRINGS, RIBBON_TAB_STRINGS, RULES_STRINGS, SHEET_ICONS, SPECIAL_CODES, STRINGS, SYMBOLS, SheetSelections, TABLE_STYLES, TEMPLATES, THEME_KEYS, TIME_CODES, TOOLS_STRINGS, UNSET, absoluteReference, activeChart, activeRef, activeSlicer, activeStyle, activeTable, activeTimeline, addRange, alignItems, alignmentCommands, applyThemeColors, autoSumRange, buildChart, buildCode, buildItems, cellCommands, cellMenu, cellRange3 as cellRange, cellStyleItems, chartGridText, clampAddress, clipState, clipboardCommands, colSelected, colorScaleRule, colsOf, colsRange, columnHeaderHeight, columnHeaderMenu, commandStrings, contextualCommands, createCommandRegistry, createDialogRegistry, createEditBridge, createSelectionModel, createTemplateWorkbook, cssFont2 as cssFont, cssFontFamily, darkTheme, dataBarRule, dataCommands, detectCategory, diagonalSvg, dxfCss, edgeCss, editBridge, editChart, editing, editingCommands, evaluateRef, expandForMerges, extendSelection, fillPaint, fillSource, fillTemplate, findDefinedName2 as findDefinedName, findSpecial, fitNumber2 as fitNumber, fontCommands, formatNumber2 as formatNumber, formulaCommands, functionsIn, gridChart, gridChartSvg, gridChartWorkbook, guessHeader, hasBorders, hasWorkbook, hashes, helpTab, historyOf, icon, iconCount, iconSetRule, iconSvg, iconThresholds, initialSelection, insertFunctionCall, installFormatPainter, isBlankView, isMenuSeparator, isSingleCell, isTabHidden, isWholeCols, isWholeRows2 as isWholeRows, justify, lightTheme, measure2 as measure, moveWithinSelection, movingEnd, nameForRange, negativeCodes, normalizeEditorLocale, normalizeThemeMode, noteFunctionUse, numberCommands, numberFormatOptions, onRibbonTabsChange, pageBreakCommands, pageLayoutCommands, parseBorderArg, parseChartGrid, parseSelectionRef, parseSheetReference, pasteWith, patternImage, pickColor, rangeRef, readEmbeddedChart, recentFunctions, refresh, regionOf, registerRibbonTabs, repeatToFill, resetRibbonTabs, resolveNameBox, reviewTab, ribbonTabs, rowHeaderMenu, rowHeaderWidth, rowSelected, rowsOf, rowsRange, scrollToReveal, searchCommands, selectCell, selectSpecial, selectTab, selectionCellCount, selectionFormatting, selectionRef, setTabHidden, sheetBaseName, sheetLocked, slicerSourceAt, sortCommands, span3 as span, spanRange, stepFontSize, structureLocked, style2 as style, styleCssFont, tabButton, tabMenu, tableAt, tableStyleColor, tableStylePreview, target, textAlign, textDecoration, themePaletteItems, themeToCssVars, timelineSourceAt, translate, translator, viewTab, viewing, whatIfCommands, wholeColumns, wholeRows, withTarget };
|