@rowsncolumns/toolkit 24.4.1
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/LICENSE.md +100 -0
- package/Readme.md +27 -0
- package/dist/cjs/autofilter-condition.d.ts +43 -0
- package/dist/cjs/autofilter-condition.d.ts.map +1 -0
- package/dist/cjs/autofilter-condition.js +155 -0
- package/dist/cjs/csv-export.d.ts +49 -0
- package/dist/cjs/csv-export.d.ts.map +1 -0
- package/dist/cjs/csv-export.js +142 -0
- package/dist/cjs/csv-import-worker.d.ts +16 -0
- package/dist/cjs/csv-import-worker.d.ts.map +1 -0
- package/dist/cjs/csv-import-worker.js +60 -0
- package/dist/cjs/csv-import.d.ts +38 -0
- package/dist/cjs/csv-import.d.ts.map +1 -0
- package/dist/cjs/csv-import.js +166 -0
- package/dist/cjs/csv-parser/helpers.d.ts +14 -0
- package/dist/cjs/csv-parser/helpers.d.ts.map +1 -0
- package/dist/cjs/csv-parser/helpers.js +145 -0
- package/dist/cjs/csv-parser/types.d.ts +66 -0
- package/dist/cjs/csv-parser/types.d.ts.map +1 -0
- package/dist/cjs/csv-parser/types.js +14 -0
- package/dist/cjs/csv-parser/worker.d.ts +2 -0
- package/dist/cjs/csv-parser/worker.d.ts.map +1 -0
- package/dist/cjs/csv-parser/worker.js +200 -0
- package/dist/cjs/excel-export.d.ts +11 -0
- package/dist/cjs/excel-export.d.ts.map +1 -0
- package/dist/cjs/excel-export.js +22 -0
- package/dist/cjs/excel-import-session.d.ts +51 -0
- package/dist/cjs/excel-import-session.d.ts.map +1 -0
- package/dist/cjs/excel-import-session.js +307 -0
- package/dist/cjs/excel-import-worker.d.ts +7 -0
- package/dist/cjs/excel-import-worker.d.ts.map +1 -0
- package/dist/cjs/excel-import-worker.js +119 -0
- package/dist/cjs/excel-parser/builtin-numfmts.d.ts +24 -0
- package/dist/cjs/excel-parser/builtin-numfmts.d.ts.map +1 -0
- package/dist/cjs/excel-parser/builtin-numfmts.js +63 -0
- package/dist/cjs/excel-parser/cfb-decryptor.d.ts +53 -0
- package/dist/cjs/excel-parser/cfb-decryptor.d.ts.map +1 -0
- package/dist/cjs/excel-parser/cfb-decryptor.js +553 -0
- package/dist/cjs/excel-parser/cfb-encryptor.d.ts +23 -0
- package/dist/cjs/excel-parser/cfb-encryptor.d.ts.map +1 -0
- package/dist/cjs/excel-parser/cfb-encryptor.js +200 -0
- package/dist/cjs/excel-parser/dv-cell-stamp.d.ts +29 -0
- package/dist/cjs/excel-parser/dv-cell-stamp.d.ts.map +1 -0
- package/dist/cjs/excel-parser/dv-cell-stamp.js +239 -0
- package/dist/cjs/excel-parser/helpers.d.ts +28 -0
- package/dist/cjs/excel-parser/helpers.d.ts.map +1 -0
- package/dist/cjs/excel-parser/helpers.js +188 -0
- package/dist/cjs/excel-parser/interface.d.ts +179 -0
- package/dist/cjs/excel-parser/interface.d.ts.map +1 -0
- package/dist/cjs/excel-parser/interface.js +1 -0
- package/dist/cjs/excel-parser/plugins/base/index.d.ts +31 -0
- package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/base/index.js +101 -0
- package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
- package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.js +488 -0
- package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts +15 -0
- package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/data-validations.js +353 -0
- package/dist/cjs/excel-parser/plugins/ods/formula.d.ts +8 -0
- package/dist/cjs/excel-parser/plugins/ods/formula.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/formula.js +82 -0
- package/dist/cjs/excel-parser/plugins/ods/index.d.ts +122 -0
- package/dist/cjs/excel-parser/plugins/ods/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/index.js +3642 -0
- package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts +25 -0
- package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/sparklines.js +221 -0
- package/dist/cjs/excel-parser/plugins/ods/styles.d.ts +60 -0
- package/dist/cjs/excel-parser/plugins/ods/styles.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/styles.js +808 -0
- package/dist/cjs/excel-parser/plugins/ods/types.d.ts +7 -0
- package/dist/cjs/excel-parser/plugins/ods/types.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/ods/types.js +1 -0
- package/dist/cjs/excel-parser/plugins/xls/index.d.ts +5 -0
- package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xls/index.js +19 -0
- package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
- package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.js +49 -0
- package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts +117 -0
- package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsb/index.js +2972 -0
- package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
- package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.js +527 -0
- package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts +5 -0
- package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsm/index.js +10 -0
- package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts +60 -0
- package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/charts.js +2178 -0
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.js +620 -0
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.js +515 -0
- package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
- package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/drawing.js +941 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +320 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.js +6056 -0
- package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
- package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/numfmt.js +3 -0
- package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
- package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/pivots.js +342 -0
- package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
- package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/relationships.js +26 -0
- package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
- package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.js +59 -0
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +44 -0
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/styles.js +1377 -0
- package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts +50 -0
- package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/theme.js +150 -0
- package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
- package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.js +141 -0
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.js +407 -0
- package/dist/cjs/excel-parser/registry.d.ts +5 -0
- package/dist/cjs/excel-parser/registry.d.ts.map +1 -0
- package/dist/cjs/excel-parser/registry.js +21 -0
- package/dist/cjs/excel-parser/style-registry.d.ts +51 -0
- package/dist/cjs/excel-parser/style-registry.d.ts.map +1 -0
- package/dist/cjs/excel-parser/style-registry.js +175 -0
- package/dist/cjs/excel-parser/theme-default.d.ts +3 -0
- package/dist/cjs/excel-parser/theme-default.d.ts.map +1 -0
- package/dist/cjs/excel-parser/theme-default.js +19 -0
- package/dist/cjs/excel-parser/types.d.ts +365 -0
- package/dist/cjs/excel-parser/types.d.ts.map +1 -0
- package/dist/cjs/excel-parser/types.js +59 -0
- package/dist/cjs/excel-parser/utils.d.ts +6 -0
- package/dist/cjs/excel-parser/utils.d.ts.map +1 -0
- package/dist/cjs/excel-parser/utils.js +30 -0
- package/dist/cjs/excel-parser/workbook.d.ts +51 -0
- package/dist/cjs/excel-parser/workbook.d.ts.map +1 -0
- package/dist/cjs/excel-parser/workbook.js +317 -0
- package/dist/cjs/excel-parser/worker.d.ts +2 -0
- package/dist/cjs/excel-parser/worker.d.ts.map +1 -0
- package/dist/cjs/excel-parser/worker.js +1149 -0
- package/dist/cjs/excel-parser/zip-parser-streaming.d.ts +13 -0
- package/dist/cjs/excel-parser/zip-parser-streaming.d.ts.map +1 -0
- package/dist/cjs/excel-parser/zip-parser-streaming.js +200 -0
- package/dist/cjs/excel-parser/zip-parser.d.ts +11 -0
- package/dist/cjs/excel-parser/zip-parser.d.ts.map +1 -0
- package/dist/cjs/excel-parser/zip-parser.js +49 -0
- package/dist/cjs/exporter/invalid-data-validation.d.ts +19 -0
- package/dist/cjs/exporter/invalid-data-validation.d.ts.map +1 -0
- package/dist/cjs/exporter/invalid-data-validation.js +39 -0
- package/dist/cjs/exporter/ods/ods-export.d.ts +26 -0
- package/dist/cjs/exporter/ods/ods-export.d.ts.map +1 -0
- package/dist/cjs/exporter/ods/ods-export.js +3714 -0
- package/dist/cjs/exporter/ods/sparkline-builder.d.ts +33 -0
- package/dist/cjs/exporter/ods/sparkline-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/ods/sparkline-builder.js +221 -0
- package/dist/cjs/exporter/xlsx/chart-builder.d.ts +3 -0
- package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/chart-builder.js +1901 -0
- package/dist/cjs/exporter/xlsx/chart-templates.d.ts +1781 -0
- package/dist/cjs/exporter/xlsx/chart-templates.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/chart-templates.js +1798 -0
- package/dist/cjs/exporter/xlsx/future-functions.d.ts +10 -0
- package/dist/cjs/exporter/xlsx/future-functions.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/future-functions.js +264 -0
- package/dist/cjs/exporter/xlsx/pivot-builder.d.ts +58 -0
- package/dist/cjs/exporter/xlsx/pivot-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/pivot-builder.js +277 -0
- package/dist/cjs/exporter/xlsx/power-query-builder.d.ts +26 -0
- package/dist/cjs/exporter/xlsx/power-query-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/power-query-builder.js +306 -0
- package/dist/cjs/exporter/xlsx/slicer-builder.d.ts +11 -0
- package/dist/cjs/exporter/xlsx/slicer-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/slicer-builder.js +87 -0
- package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts +61 -0
- package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/sparkline-builder.js +489 -0
- package/dist/cjs/exporter/xlsx/style-builder.d.ts +93 -0
- package/dist/cjs/exporter/xlsx/style-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/style-builder.js +813 -0
- package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
- package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/threaded-comments-builder.js +189 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts +121 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.js +4596 -0
- package/dist/cjs/helpers/theme-xml-generator.d.ts +8 -0
- package/dist/cjs/helpers/theme-xml-generator.d.ts.map +1 -0
- package/dist/cjs/helpers/theme-xml-generator.js +33 -0
- package/dist/cjs/helpers.d.ts +34 -0
- package/dist/cjs/helpers.d.ts.map +1 -0
- package/dist/cjs/helpers.js +189 -0
- package/dist/cjs/index.d.ts +16 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/indexed-colors.d.ts +2 -0
- package/dist/cjs/indexed-colors.d.ts.map +1 -0
- package/dist/cjs/indexed-colors.js +75 -0
- package/dist/cjs/ods-export.d.ts +24 -0
- package/dist/cjs/ods-export.d.ts.map +1 -0
- package/dist/cjs/ods-export.js +23 -0
- package/dist/cjs/parse.d.ts +24 -0
- package/dist/cjs/parse.d.ts.map +1 -0
- package/dist/cjs/parse.js +68 -0
- package/dist/cjs/power-query.d.ts +41 -0
- package/dist/cjs/power-query.d.ts.map +1 -0
- package/dist/cjs/power-query.js +22 -0
- package/dist/cjs/server.d.ts +9 -0
- package/dist/cjs/server.d.ts.map +1 -0
- package/dist/cjs/server.js +8 -0
- package/dist/cjs/theme1.d.ts +3 -0
- package/dist/cjs/theme1.d.ts.map +1 -0
- package/dist/cjs/theme1.js +2 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/types.d.ts +14 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +14 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +16 -0
- package/dist/esm/autofilter-condition.d.ts +43 -0
- package/dist/esm/autofilter-condition.d.ts.map +1 -0
- package/dist/esm/autofilter-condition.js +145 -0
- package/dist/esm/csv-export.d.ts +49 -0
- package/dist/esm/csv-export.d.ts.map +1 -0
- package/dist/esm/csv-export.js +126 -0
- package/dist/esm/csv-import-worker.d.ts +16 -0
- package/dist/esm/csv-import-worker.d.ts.map +1 -0
- package/dist/esm/csv-import-worker.js +60 -0
- package/dist/esm/csv-import.d.ts +38 -0
- package/dist/esm/csv-import.d.ts.map +1 -0
- package/dist/esm/csv-import.js +132 -0
- package/dist/esm/csv-parser/helpers.d.ts +14 -0
- package/dist/esm/csv-parser/helpers.d.ts.map +1 -0
- package/dist/esm/csv-parser/helpers.js +0 -0
- package/dist/esm/csv-parser/types.d.ts +66 -0
- package/dist/esm/csv-parser/types.d.ts.map +1 -0
- package/dist/esm/csv-parser/types.js +14 -0
- package/dist/esm/csv-parser/worker.d.ts +2 -0
- package/dist/esm/csv-parser/worker.d.ts.map +1 -0
- package/dist/esm/csv-parser/worker.js +154 -0
- package/dist/esm/excel-export.d.ts +11 -0
- package/dist/esm/excel-export.d.ts.map +1 -0
- package/dist/esm/excel-export.js +13 -0
- package/dist/esm/excel-import-session.d.ts +51 -0
- package/dist/esm/excel-import-session.d.ts.map +1 -0
- package/dist/esm/excel-import-session.js +255 -0
- package/dist/esm/excel-import-worker.d.ts +7 -0
- package/dist/esm/excel-import-worker.d.ts.map +1 -0
- package/dist/esm/excel-import-worker.js +116 -0
- package/dist/esm/excel-parser/builtin-numfmts.d.ts +24 -0
- package/dist/esm/excel-parser/builtin-numfmts.d.ts.map +1 -0
- package/dist/esm/excel-parser/builtin-numfmts.js +59 -0
- package/dist/esm/excel-parser/cfb-decryptor.d.ts +53 -0
- package/dist/esm/excel-parser/cfb-decryptor.d.ts.map +1 -0
- package/dist/esm/excel-parser/cfb-decryptor.js +493 -0
- package/dist/esm/excel-parser/cfb-encryptor.d.ts +23 -0
- package/dist/esm/excel-parser/cfb-encryptor.d.ts.map +1 -0
- package/dist/esm/excel-parser/cfb-encryptor.js +181 -0
- package/dist/esm/excel-parser/dv-cell-stamp.d.ts +29 -0
- package/dist/esm/excel-parser/dv-cell-stamp.d.ts.map +1 -0
- package/dist/esm/excel-parser/dv-cell-stamp.js +155 -0
- package/dist/esm/excel-parser/helpers.d.ts +28 -0
- package/dist/esm/excel-parser/helpers.d.ts.map +1 -0
- package/dist/esm/excel-parser/helpers.js +160 -0
- package/dist/esm/excel-parser/interface.d.ts +179 -0
- package/dist/esm/excel-parser/interface.d.ts.map +1 -0
- package/dist/esm/excel-parser/interface.js +1 -0
- package/dist/esm/excel-parser/plugins/base/index.d.ts +31 -0
- package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/base/index.js +64 -0
- package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
- package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/conditional-formatting.js +405 -0
- package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts +15 -0
- package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/data-validations.js +331 -0
- package/dist/esm/excel-parser/plugins/ods/formula.d.ts +8 -0
- package/dist/esm/excel-parser/plugins/ods/formula.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/formula.js +82 -0
- package/dist/esm/excel-parser/plugins/ods/index.d.ts +122 -0
- package/dist/esm/excel-parser/plugins/ods/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/index.js +2896 -0
- package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts +25 -0
- package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/sparklines.js +188 -0
- package/dist/esm/excel-parser/plugins/ods/styles.d.ts +60 -0
- package/dist/esm/excel-parser/plugins/ods/styles.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/styles.js +732 -0
- package/dist/esm/excel-parser/plugins/ods/types.d.ts +7 -0
- package/dist/esm/excel-parser/plugins/ods/types.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/ods/types.js +1 -0
- package/dist/esm/excel-parser/plugins/xls/index.d.ts +5 -0
- package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xls/index.js +7 -0
- package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
- package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.js +48 -0
- package/dist/esm/excel-parser/plugins/xlsb/index.d.ts +117 -0
- package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsb/index.js +2339 -0
- package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
- package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.js +522 -0
- package/dist/esm/excel-parser/plugins/xlsm/index.d.ts +5 -0
- package/dist/esm/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsm/index.js +6 -0
- package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts +60 -0
- package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/charts.js +2036 -0
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.js +621 -0
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.js +493 -0
- package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
- package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/drawing.js +905 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +320 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.js +4654 -0
- package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
- package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/numfmt.js +3 -0
- package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
- package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/pivots.js +254 -0
- package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
- package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/relationships.js +13 -0
- package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
- package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/sheet-views.js +64 -0
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +44 -0
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/styles.js +1365 -0
- package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts +50 -0
- package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/theme.js +127 -0
- package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
- package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.js +103 -0
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.js +399 -0
- package/dist/esm/excel-parser/registry.d.ts +5 -0
- package/dist/esm/excel-parser/registry.d.ts.map +1 -0
- package/dist/esm/excel-parser/registry.js +20 -0
- package/dist/esm/excel-parser/style-registry.d.ts +51 -0
- package/dist/esm/excel-parser/style-registry.d.ts.map +1 -0
- package/dist/esm/excel-parser/style-registry.js +163 -0
- package/dist/esm/excel-parser/theme-default.d.ts +3 -0
- package/dist/esm/excel-parser/theme-default.d.ts.map +1 -0
- package/dist/esm/excel-parser/theme-default.js +19 -0
- package/dist/esm/excel-parser/types.d.ts +365 -0
- package/dist/esm/excel-parser/types.d.ts.map +1 -0
- package/dist/esm/excel-parser/types.js +59 -0
- package/dist/esm/excel-parser/utils.d.ts +6 -0
- package/dist/esm/excel-parser/utils.d.ts.map +1 -0
- package/dist/esm/excel-parser/utils.js +25 -0
- package/dist/esm/excel-parser/workbook.d.ts +51 -0
- package/dist/esm/excel-parser/workbook.d.ts.map +1 -0
- package/dist/esm/excel-parser/workbook.js +192 -0
- package/dist/esm/excel-parser/worker.d.ts +2 -0
- package/dist/esm/excel-parser/worker.d.ts.map +1 -0
- package/dist/esm/excel-parser/worker.js +862 -0
- package/dist/esm/excel-parser/zip-parser-streaming.d.ts +13 -0
- package/dist/esm/excel-parser/zip-parser-streaming.d.ts.map +1 -0
- package/dist/esm/excel-parser/zip-parser-streaming.js +119 -0
- package/dist/esm/excel-parser/zip-parser.d.ts +11 -0
- package/dist/esm/excel-parser/zip-parser.d.ts.map +1 -0
- package/dist/esm/excel-parser/zip-parser.js +43 -0
- package/dist/esm/exporter/invalid-data-validation.d.ts +19 -0
- package/dist/esm/exporter/invalid-data-validation.d.ts.map +1 -0
- package/dist/esm/exporter/invalid-data-validation.js +37 -0
- package/dist/esm/exporter/ods/ods-export.d.ts +26 -0
- package/dist/esm/exporter/ods/ods-export.d.ts.map +1 -0
- package/dist/esm/exporter/ods/ods-export.js +3238 -0
- package/dist/esm/exporter/ods/sparkline-builder.d.ts +33 -0
- package/dist/esm/exporter/ods/sparkline-builder.d.ts.map +1 -0
- package/dist/esm/exporter/ods/sparkline-builder.js +165 -0
- package/dist/esm/exporter/xlsx/chart-builder.d.ts +3 -0
- package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/chart-builder.js +1805 -0
- package/dist/esm/exporter/xlsx/chart-templates.d.ts +1781 -0
- package/dist/esm/exporter/xlsx/chart-templates.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/chart-templates.js +1798 -0
- package/dist/esm/exporter/xlsx/future-functions.d.ts +10 -0
- package/dist/esm/exporter/xlsx/future-functions.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/future-functions.js +264 -0
- package/dist/esm/exporter/xlsx/pivot-builder.d.ts +58 -0
- package/dist/esm/exporter/xlsx/pivot-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/pivot-builder.js +230 -0
- package/dist/esm/exporter/xlsx/power-query-builder.d.ts +26 -0
- package/dist/esm/exporter/xlsx/power-query-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/power-query-builder.js +257 -0
- package/dist/esm/exporter/xlsx/slicer-builder.d.ts +11 -0
- package/dist/esm/exporter/xlsx/slicer-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/slicer-builder.js +84 -0
- package/dist/esm/exporter/xlsx/sparkline-builder.d.ts +61 -0
- package/dist/esm/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/sparkline-builder.js +437 -0
- package/dist/esm/exporter/xlsx/style-builder.d.ts +93 -0
- package/dist/esm/exporter/xlsx/style-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/style-builder.js +795 -0
- package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
- package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/threaded-comments-builder.js +175 -0
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts +121 -0
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/xlsx-export.js +4062 -0
- package/dist/esm/helpers/theme-xml-generator.d.ts +8 -0
- package/dist/esm/helpers/theme-xml-generator.d.ts.map +1 -0
- package/dist/esm/helpers/theme-xml-generator.js +33 -0
- package/dist/esm/helpers.d.ts +34 -0
- package/dist/esm/helpers.d.ts.map +1 -0
- package/dist/esm/helpers.js +182 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/indexed-colors.d.ts +2 -0
- package/dist/esm/indexed-colors.d.ts.map +1 -0
- package/dist/esm/indexed-colors.js +75 -0
- package/dist/esm/ods-export.d.ts +24 -0
- package/dist/esm/ods-export.d.ts.map +1 -0
- package/dist/esm/ods-export.js +12 -0
- package/dist/esm/parse.d.ts +24 -0
- package/dist/esm/parse.d.ts.map +1 -0
- package/dist/esm/parse.js +55 -0
- package/dist/esm/power-query.d.ts +41 -0
- package/dist/esm/power-query.d.ts.map +1 -0
- package/dist/esm/power-query.js +19 -0
- package/dist/esm/server.d.ts +9 -0
- package/dist/esm/server.d.ts.map +1 -0
- package/dist/esm/server.js +8 -0
- package/dist/esm/theme1.d.ts +3 -0
- package/dist/esm/theme1.d.ts.map +1 -0
- package/dist/esm/theme1.js +2 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +14 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +14 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +16 -0
- package/package.json +62 -0
- package/xlsx.d.ts +52 -0
|
@@ -0,0 +1,2178 @@
|
|
|
1
|
+
import { __assign, __awaiter, __generator, __values } from "tslib";
|
|
2
|
+
import { generateSelectionsFromFormula } from "@rowsncolumns/utils";
|
|
3
|
+
import { uuid } from "@rowsncolumns/utils";
|
|
4
|
+
import { get } from "lodash-es";
|
|
5
|
+
/**
|
|
6
|
+
* Pick the data sheetId for a parsed selection. Honours the explicit
|
|
7
|
+
* sheet prefix in the chart's formula reference (cross-sheet charts);
|
|
8
|
+
* falls back to the host sheet when the formula has no prefix.
|
|
9
|
+
*/
|
|
10
|
+
function pickSheetId(sheetName, hostSheetId, resolveSheetId) {
|
|
11
|
+
if (sheetName && resolveSheetId) {
|
|
12
|
+
var resolved = resolveSheetId(sheetName);
|
|
13
|
+
if (resolved !== undefined)
|
|
14
|
+
return resolved;
|
|
15
|
+
}
|
|
16
|
+
return hostSheetId;
|
|
17
|
+
}
|
|
18
|
+
// Import from index.ts in the same directory (circular dependency but resolving symbols)
|
|
19
|
+
// Note: We need to use type import for Workbook if needed, or functions
|
|
20
|
+
// In this case, we need getChartReferenceFromAnchor which was exported from workbook.ts originally
|
|
21
|
+
// but now is in index.ts of the plugin. However, charts.ts doesn't seem to import it based on the file content I read.
|
|
22
|
+
// The search_replace failed because the import wasn't there.
|
|
23
|
+
// Let me double check the file content again.
|
|
24
|
+
// The file content I read has NO imports from "../charts" or "../workbook".
|
|
25
|
+
// It seems I was trying to fix a linter error that I *assumed* existed or was trying to match code that wasn't there.
|
|
26
|
+
// The file content shows standard imports and internal functions.
|
|
27
|
+
function getWithFallback(source, paths) {
|
|
28
|
+
var e_1, _a;
|
|
29
|
+
try {
|
|
30
|
+
for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
|
|
31
|
+
var path = paths_1_1.value;
|
|
32
|
+
var value = get(source, path);
|
|
33
|
+
if (value !== undefined) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
39
|
+
finally {
|
|
40
|
+
try {
|
|
41
|
+
if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
|
|
42
|
+
}
|
|
43
|
+
finally { if (e_1) throw e_1.error; }
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
function toInt(value) {
|
|
48
|
+
var parsed = parseInt(typeof value === "number" ? String(value) : value !== null && value !== void 0 ? value : "0", 10);
|
|
49
|
+
return Number.isNaN(parsed) ? 0 : parsed;
|
|
50
|
+
}
|
|
51
|
+
export function processChart(chartTarget, drawingPath, anchor, sheetId, zipParser, xmlParser, sheetDimensions, resolveSheetId) {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
53
|
+
var chartPath, drawingDir, chartContent, chartXml, chart, chartSpaceRoot, roundedCornersRaw, roundedCornersVal, roundedCorners, chartId, title, titleTextFormat, chartType, plotArea, series, domains, dataRange, bubbleSizes, scatterStyle, hiddenDimensionStrategy, position, legend, dataLabels, _a, valueAxisOptions, secondaryValueAxisOptions, categoryAxisOptions, doughnutHoleSize, ofPieOptions, radarStyle, binCount, barLayout, err_1;
|
|
54
|
+
var _b;
|
|
55
|
+
return __generator(this, function (_c) {
|
|
56
|
+
switch (_c.label) {
|
|
57
|
+
case 0:
|
|
58
|
+
_c.trys.push([0, 2, , 3]);
|
|
59
|
+
chartPath = chartTarget;
|
|
60
|
+
drawingDir = drawingPath.substring(0, drawingPath.lastIndexOf("/"));
|
|
61
|
+
if (chartPath.startsWith("../")) {
|
|
62
|
+
chartPath = "xl/".concat(chartPath.replace("../", ""));
|
|
63
|
+
}
|
|
64
|
+
else if (!chartPath.startsWith("/") && !chartPath.startsWith("xl/")) {
|
|
65
|
+
chartPath = "".concat(drawingDir, "/").concat(chartPath);
|
|
66
|
+
}
|
|
67
|
+
return [4 /*yield*/, zipParser.getText(chartPath)];
|
|
68
|
+
case 1:
|
|
69
|
+
chartContent = _c.sent();
|
|
70
|
+
if (!chartContent) {
|
|
71
|
+
return [2 /*return*/, null];
|
|
72
|
+
}
|
|
73
|
+
chartXml = xmlParser.parse(chartContent);
|
|
74
|
+
chart = getWithFallback(chartXml, [
|
|
75
|
+
"c:chartSpace.c:chart",
|
|
76
|
+
"chartSpace.chart",
|
|
77
|
+
"chartSpace.c:chart",
|
|
78
|
+
"c:chartSpace.chart",
|
|
79
|
+
]);
|
|
80
|
+
if (!chart) {
|
|
81
|
+
console.log("Chart data not found in file:", chartPath);
|
|
82
|
+
console.log("Available keys:", Object.keys(chartXml));
|
|
83
|
+
return [2 /*return*/, null];
|
|
84
|
+
}
|
|
85
|
+
chartSpaceRoot = getWithFallback(chartXml, [
|
|
86
|
+
"c:chartSpace",
|
|
87
|
+
"chartSpace",
|
|
88
|
+
]);
|
|
89
|
+
roundedCornersRaw = getWithFallback(chartSpaceRoot, [
|
|
90
|
+
"c:roundedCorners",
|
|
91
|
+
"roundedCorners",
|
|
92
|
+
]);
|
|
93
|
+
roundedCornersVal = (_b = roundedCornersRaw === null || roundedCornersRaw === void 0 ? void 0 : roundedCornersRaw.a$) === null || _b === void 0 ? void 0 : _b.val;
|
|
94
|
+
roundedCorners = roundedCornersVal === "1" ||
|
|
95
|
+
roundedCornersVal === "true" ||
|
|
96
|
+
roundedCornersVal === true
|
|
97
|
+
? true
|
|
98
|
+
: undefined;
|
|
99
|
+
chartId = uuid();
|
|
100
|
+
title = extractChartTitle(chart);
|
|
101
|
+
titleTextFormat = extractChartTitleTextFormat(chart);
|
|
102
|
+
chartType = determineChartType(chart);
|
|
103
|
+
plotArea = getWithFallback(chart, ["c:plotArea", "plotArea"]);
|
|
104
|
+
series = extractChartSeries(plotArea, chartType, sheetId, resolveSheetId);
|
|
105
|
+
domains = extractChartDomains(plotArea, chartType, sheetId, resolveSheetId);
|
|
106
|
+
dataRange = extractChartDataRange(plotArea, chartType, sheetId, resolveSheetId);
|
|
107
|
+
bubbleSizes = chartType === "bubble"
|
|
108
|
+
? extractChartBubbleSizes(plotArea, sheetId, resolveSheetId)
|
|
109
|
+
: undefined;
|
|
110
|
+
scatterStyle = chartType === "scatter" ? extractScatterStyle(plotArea) : undefined;
|
|
111
|
+
hiddenDimensionStrategy = extractHiddenDimensionStrategy(chart);
|
|
112
|
+
position = extractChartPosition(anchor, sheetId, sheetDimensions);
|
|
113
|
+
if (!position) {
|
|
114
|
+
console.log("Could not extract chart position");
|
|
115
|
+
return [2 /*return*/, null];
|
|
116
|
+
}
|
|
117
|
+
legend = extractLegendOptions(chart);
|
|
118
|
+
dataLabels = extractDataLabelsOptions(plotArea, chartType);
|
|
119
|
+
_a = extractAxisOptions(plotArea), valueAxisOptions = _a.valueAxisOptions, secondaryValueAxisOptions = _a.secondaryValueAxisOptions, categoryAxisOptions = _a.categoryAxisOptions;
|
|
120
|
+
doughnutHoleSize = chartType === "doughnut" ? extractDoughnutHoleSize(plotArea) : undefined;
|
|
121
|
+
ofPieOptions = chartType === "pie" ? extractOfPieOptions(plotArea) : undefined;
|
|
122
|
+
radarStyle = chartType === "radar" ? extractRadarStyle(plotArea) : undefined;
|
|
123
|
+
binCount = chartType === "histogram"
|
|
124
|
+
? extractC15HistogramBinCount(plotArea)
|
|
125
|
+
: undefined;
|
|
126
|
+
barLayout = chartType === "bar" || chartType === "column"
|
|
127
|
+
? extractBarLayoutOptions(plotArea)
|
|
128
|
+
: undefined;
|
|
129
|
+
return [2 /*return*/, {
|
|
130
|
+
chartId: chartId,
|
|
131
|
+
spec: __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ title: title }, (titleTextFormat ? { titleTextFormat: titleTextFormat } : {})), { chartType: chartType, domains: domains, series: series, dataRange: dataRange, hiddenDimensionStrategy: hiddenDimensionStrategy }), (chartType === "scatter" || chartType === "bubble"
|
|
132
|
+
? { bubbleLabels: [] }
|
|
133
|
+
: {})), (bubbleSizes && bubbleSizes.length ? { bubbleSizes: bubbleSizes } : {})), (scatterStyle
|
|
134
|
+
? { scatterStyle: scatterStyle }
|
|
135
|
+
: {})), (legend ? { legend: legend } : {})), (dataLabels ? { dataLabels: dataLabels } : {})), (valueAxisOptions ? { valueAxisOptions: valueAxisOptions } : {})), (secondaryValueAxisOptions
|
|
136
|
+
? { secondaryValueAxisOptions: secondaryValueAxisOptions }
|
|
137
|
+
: {})), (categoryAxisOptions ? { categoryAxisOptions: categoryAxisOptions } : {})), (typeof doughnutHoleSize === "number"
|
|
138
|
+
? { doughnutHoleSize: doughnutHoleSize }
|
|
139
|
+
: {})), (ofPieOptions
|
|
140
|
+
? __assign({ sourceChartType: "OF_PIE" }, ofPieOptions) : {})), (radarStyle ? { radarStyle: radarStyle } : {})), (typeof binCount === "number" ? { binCount: binCount } : {})), ((barLayout === null || barLayout === void 0 ? void 0 : barLayout.stackedType)
|
|
141
|
+
? { stackedType: barLayout.stackedType }
|
|
142
|
+
: {})), (typeof (barLayout === null || barLayout === void 0 ? void 0 : barLayout.overlap) === "number"
|
|
143
|
+
? { overlap: barLayout.overlap }
|
|
144
|
+
: {})), (typeof (barLayout === null || barLayout === void 0 ? void 0 : barLayout.gapWidth) === "number"
|
|
145
|
+
? { gapWidth: barLayout.gapWidth }
|
|
146
|
+
: {})), (roundedCorners ? { roundedCorners: roundedCorners } : {})),
|
|
147
|
+
position: position,
|
|
148
|
+
id: chartId,
|
|
149
|
+
type: "chart",
|
|
150
|
+
}];
|
|
151
|
+
case 2:
|
|
152
|
+
err_1 = _c.sent();
|
|
153
|
+
console.log("Error processing chart:", err_1);
|
|
154
|
+
return [2 /*return*/, null];
|
|
155
|
+
case 3: return [2 /*return*/];
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Helper to get series elements with namespace fallbacks
|
|
161
|
+
function getSeriesElements(plotArea, chartType) {
|
|
162
|
+
switch (chartType) {
|
|
163
|
+
case "bar":
|
|
164
|
+
case "column":
|
|
165
|
+
// Phase 5.5 — c15 extension chart types emit a c:barChart body
|
|
166
|
+
// for older-Excel compatibility, so their series live in the same
|
|
167
|
+
// place as a bar/column chart. Phase 5.5b — histogram additionally
|
|
168
|
+
// wraps the barChart in mc:AlternateContent > mc:Fallback, so we
|
|
169
|
+
// also probe that path.
|
|
170
|
+
case "histogram":
|
|
171
|
+
case "boxplot":
|
|
172
|
+
case "waterfall":
|
|
173
|
+
case "funnel":
|
|
174
|
+
return getWithFallback(plotArea, [
|
|
175
|
+
"c:barChart.c:ser",
|
|
176
|
+
"barChart.ser",
|
|
177
|
+
"c:bar3DChart.c:ser",
|
|
178
|
+
"bar3DChart.ser",
|
|
179
|
+
"mc:AlternateContent.mc:Fallback.c:barChart.c:ser",
|
|
180
|
+
"AlternateContent.Fallback.barChart.ser",
|
|
181
|
+
]);
|
|
182
|
+
case "line":
|
|
183
|
+
return getWithFallback(plotArea, [
|
|
184
|
+
"c:lineChart.c:ser",
|
|
185
|
+
"lineChart.ser",
|
|
186
|
+
"c:line3DChart.c:ser",
|
|
187
|
+
"line3DChart.ser",
|
|
188
|
+
]);
|
|
189
|
+
case "pie":
|
|
190
|
+
return getWithFallback(plotArea, [
|
|
191
|
+
"c:pieChart.c:ser",
|
|
192
|
+
"pieChart.ser",
|
|
193
|
+
"c:pie3DChart.c:ser",
|
|
194
|
+
"pie3DChart.ser",
|
|
195
|
+
// pie-of-pie / bar-of-pie — determineChartType maps
|
|
196
|
+
// <c:ofPieChart> to "pie", so its series live here too.
|
|
197
|
+
"c:ofPieChart.c:ser",
|
|
198
|
+
"ofPieChart.ser",
|
|
199
|
+
]);
|
|
200
|
+
case "doughnut":
|
|
201
|
+
return getWithFallback(plotArea, [
|
|
202
|
+
"c:doughnutChart.c:ser",
|
|
203
|
+
"doughnutChart.ser",
|
|
204
|
+
]);
|
|
205
|
+
case "area":
|
|
206
|
+
return getWithFallback(plotArea, [
|
|
207
|
+
"c:areaChart.c:ser",
|
|
208
|
+
"areaChart.ser",
|
|
209
|
+
"c:area3DChart.c:ser",
|
|
210
|
+
"area3DChart.ser",
|
|
211
|
+
]);
|
|
212
|
+
case "radar":
|
|
213
|
+
return getWithFallback(plotArea, ["c:radarChart.c:ser", "radarChart.ser"]);
|
|
214
|
+
case "stock":
|
|
215
|
+
return getWithFallback(plotArea, ["c:stockChart.c:ser", "stockChart.ser"]);
|
|
216
|
+
case "scatter":
|
|
217
|
+
return getWithFallback(plotArea, [
|
|
218
|
+
"c:scatterChart.c:ser",
|
|
219
|
+
"scatterChart.ser",
|
|
220
|
+
]);
|
|
221
|
+
case "bubble":
|
|
222
|
+
return getWithFallback(plotArea, [
|
|
223
|
+
"c:bubbleChart.c:ser",
|
|
224
|
+
"bubbleChart.ser",
|
|
225
|
+
]);
|
|
226
|
+
default:
|
|
227
|
+
return getWithFallback(plotArea, ["c:barChart.c:ser", "barChart.ser"]);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Path tuples used by the per-series ref extractors below. We accept
|
|
231
|
+
// both namespaced and stripped forms because fast-xml-parser is
|
|
232
|
+
// configured both ways in different code paths.
|
|
233
|
+
var X_VAL_REF_PATHS = [
|
|
234
|
+
"c:xVal.c:numRef.c:f",
|
|
235
|
+
"c:xVal.c:numRef.c:f.t$",
|
|
236
|
+
"xVal.numRef.f",
|
|
237
|
+
"xVal.numRef.f.t$",
|
|
238
|
+
// scatter X axis can also be string (categorical X)
|
|
239
|
+
"c:xVal.c:strRef.c:f",
|
|
240
|
+
"c:xVal.c:strRef.c:f.t$",
|
|
241
|
+
"xVal.strRef.f",
|
|
242
|
+
"xVal.strRef.f.t$",
|
|
243
|
+
];
|
|
244
|
+
var Y_VAL_REF_PATHS = [
|
|
245
|
+
"c:yVal.c:numRef.c:f",
|
|
246
|
+
"c:yVal.c:numRef.c:f.t$",
|
|
247
|
+
"yVal.numRef.f",
|
|
248
|
+
"yVal.numRef.f.t$",
|
|
249
|
+
];
|
|
250
|
+
var BUBBLE_SIZE_REF_PATHS = [
|
|
251
|
+
"c:bubbleSize.c:numRef.c:f",
|
|
252
|
+
"c:bubbleSize.c:numRef.c:f.t$",
|
|
253
|
+
"bubbleSize.numRef.f",
|
|
254
|
+
"bubbleSize.numRef.f.t$",
|
|
255
|
+
];
|
|
256
|
+
var CAT_REF_PATHS = [
|
|
257
|
+
"c:cat.c:strRef.c:f",
|
|
258
|
+
"c:cat.c:numRef.c:f",
|
|
259
|
+
"c:cat.c:strRef.c:f.t$",
|
|
260
|
+
"c:cat.c:numRef.c:f.t$",
|
|
261
|
+
"cat.strRef.f",
|
|
262
|
+
"cat.numRef.f",
|
|
263
|
+
"cat.strRef.f.t$",
|
|
264
|
+
"cat.numRef.f.t$",
|
|
265
|
+
];
|
|
266
|
+
var VAL_REF_PATHS = [
|
|
267
|
+
"c:val.c:numRef.c:f",
|
|
268
|
+
"c:val.c:numRef.c:f.t$",
|
|
269
|
+
"val.numRef.f",
|
|
270
|
+
"val.numRef.f.t$",
|
|
271
|
+
];
|
|
272
|
+
var TX_REF_PATHS = [
|
|
273
|
+
"c:tx.c:strRef.c:f",
|
|
274
|
+
"c:tx.c:strRef.c:f.t$",
|
|
275
|
+
"tx.strRef.f",
|
|
276
|
+
"tx.strRef.f.t$",
|
|
277
|
+
];
|
|
278
|
+
var isXYChart = function (chartType) {
|
|
279
|
+
return chartType === "scatter" || chartType === "bubble";
|
|
280
|
+
};
|
|
281
|
+
// Extract the overall data range for the chart
|
|
282
|
+
export function extractChartDataRange(plotArea, chartType, sheetId, resolveSheetId) {
|
|
283
|
+
var e_2, _a;
|
|
284
|
+
try {
|
|
285
|
+
var seriesElements = getSeriesElements(plotArea, chartType);
|
|
286
|
+
if (!seriesElements)
|
|
287
|
+
return null;
|
|
288
|
+
var seriesArray = Array.isArray(seriesElements)
|
|
289
|
+
? seriesElements
|
|
290
|
+
: [seriesElements];
|
|
291
|
+
// Collect all ranges from the chart, tagged with their parsed
|
|
292
|
+
// sheet name so cross-sheet refs can be honoured.
|
|
293
|
+
var allRanges = [];
|
|
294
|
+
try {
|
|
295
|
+
for (var seriesArray_1 = __values(seriesArray), seriesArray_1_1 = seriesArray_1.next(); !seriesArray_1_1.done; seriesArray_1_1 = seriesArray_1.next()) {
|
|
296
|
+
var ser = seriesArray_1_1.value;
|
|
297
|
+
if (isXYChart(chartType)) {
|
|
298
|
+
var xRef = getWithFallback(ser, X_VAL_REF_PATHS);
|
|
299
|
+
var yRef = getWithFallback(ser, Y_VAL_REF_PATHS);
|
|
300
|
+
var sizeRef = chartType === "bubble"
|
|
301
|
+
? getWithFallback(ser, BUBBLE_SIZE_REF_PATHS)
|
|
302
|
+
: undefined;
|
|
303
|
+
var nameRef = getWithFallback(ser, TX_REF_PATHS);
|
|
304
|
+
if (xRef)
|
|
305
|
+
allRanges.push(xRef);
|
|
306
|
+
if (yRef)
|
|
307
|
+
allRanges.push(yRef);
|
|
308
|
+
if (sizeRef)
|
|
309
|
+
allRanges.push(sizeRef);
|
|
310
|
+
if (nameRef)
|
|
311
|
+
allRanges.push(nameRef);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
var catRef = getWithFallback(ser, CAT_REF_PATHS);
|
|
315
|
+
var valRef = getWithFallback(ser, VAL_REF_PATHS);
|
|
316
|
+
var nameRef = getWithFallback(ser, TX_REF_PATHS);
|
|
317
|
+
if (catRef)
|
|
318
|
+
allRanges.push(catRef);
|
|
319
|
+
if (valRef)
|
|
320
|
+
allRanges.push(valRef);
|
|
321
|
+
if (nameRef)
|
|
322
|
+
allRanges.push(nameRef);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
327
|
+
finally {
|
|
328
|
+
try {
|
|
329
|
+
if (seriesArray_1_1 && !seriesArray_1_1.done && (_a = seriesArray_1.return)) _a.call(seriesArray_1);
|
|
330
|
+
}
|
|
331
|
+
finally { if (e_2) throw e_2.error; }
|
|
332
|
+
}
|
|
333
|
+
if (allRanges.length === 0)
|
|
334
|
+
return null;
|
|
335
|
+
// Bounding range is computed per-sheet — different ranges may live
|
|
336
|
+
// on different sheets (a chart referencing both the host sheet and
|
|
337
|
+
// a data sheet, for example). Per Excel, the chart's "data range"
|
|
338
|
+
// is logically the union of inputs; we pick the first sheet's
|
|
339
|
+
// bounding box as the reportable dataRange and pin the rest via
|
|
340
|
+
// the per-series sources.
|
|
341
|
+
var boundingRange = calculateBoundingRange(allRanges);
|
|
342
|
+
if (boundingRange) {
|
|
343
|
+
var selections = generateSelectionsFromFormula("=".concat(boundingRange));
|
|
344
|
+
if (selections.length > 0) {
|
|
345
|
+
var sel = selections[0];
|
|
346
|
+
var resolved = pickSheetId(sel.sheetName, sheetId, resolveSheetId);
|
|
347
|
+
return __assign(__assign({}, sel.range), { sheetId: resolved });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
console.log("Error extracting chart data range:", err);
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Calculate the bounding range that encompasses all the individual ranges
|
|
358
|
+
function calculateBoundingRange(ranges) {
|
|
359
|
+
var e_3, _a;
|
|
360
|
+
try {
|
|
361
|
+
var minRow = Infinity;
|
|
362
|
+
var maxRow = -Infinity;
|
|
363
|
+
var minCol = Infinity;
|
|
364
|
+
var maxCol = -Infinity;
|
|
365
|
+
var sheetName = "";
|
|
366
|
+
try {
|
|
367
|
+
for (var ranges_1 = __values(ranges), ranges_1_1 = ranges_1.next(); !ranges_1_1.done; ranges_1_1 = ranges_1.next()) {
|
|
368
|
+
var range = ranges_1_1.value;
|
|
369
|
+
// Parse each range (e.g., "Sheet1!$A$2:$A$20" or "Sheet1!$C$1")
|
|
370
|
+
var selections = generateSelectionsFromFormula("=".concat(range));
|
|
371
|
+
if (selections.length > 0) {
|
|
372
|
+
var sel = selections[0];
|
|
373
|
+
// Extract sheet name from the first range
|
|
374
|
+
if (!sheetName && range.includes("!")) {
|
|
375
|
+
sheetName = range.split("!")[0];
|
|
376
|
+
}
|
|
377
|
+
// Update bounding box
|
|
378
|
+
minRow = Math.min(minRow, sel.range.startRowIndex);
|
|
379
|
+
maxRow = Math.max(maxRow, sel.range.endRowIndex);
|
|
380
|
+
minCol = Math.min(minCol, sel.range.startColumnIndex);
|
|
381
|
+
maxCol = Math.max(maxCol, sel.range.endColumnIndex);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
386
|
+
finally {
|
|
387
|
+
try {
|
|
388
|
+
if (ranges_1_1 && !ranges_1_1.done && (_a = ranges_1.return)) _a.call(ranges_1);
|
|
389
|
+
}
|
|
390
|
+
finally { if (e_3) throw e_3.error; }
|
|
391
|
+
}
|
|
392
|
+
if (minRow === Infinity || minCol === Infinity) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
// Convert back to Excel range format
|
|
396
|
+
var startCell = columnIndexToLetter(minCol) + minRow;
|
|
397
|
+
var endCell = columnIndexToLetter(maxCol) + maxRow;
|
|
398
|
+
var rangeStr = startCell === endCell ? startCell : "".concat(startCell, ":").concat(endCell);
|
|
399
|
+
return sheetName ? "".concat(sheetName, "!").concat(rangeStr) : rangeStr;
|
|
400
|
+
}
|
|
401
|
+
catch (err) {
|
|
402
|
+
console.log("Error calculating bounding range:", err);
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// Helper function to convert column index to letter (1 -> A, 2 -> B, etc.)
|
|
407
|
+
function columnIndexToLetter(index) {
|
|
408
|
+
var result = "";
|
|
409
|
+
var num = index;
|
|
410
|
+
while (num > 0) {
|
|
411
|
+
num--;
|
|
412
|
+
result = String.fromCharCode(65 + (num % 26)) + result;
|
|
413
|
+
num = Math.floor(num / 26);
|
|
414
|
+
}
|
|
415
|
+
return result;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Extract hidden dimension strategy from plotVisOnly attribute
|
|
419
|
+
* In Excel: plotVisOnly="1" means skip hidden rows/columns, "0" means show all
|
|
420
|
+
*/
|
|
421
|
+
export function extractHiddenDimensionStrategy(chart) {
|
|
422
|
+
var plotVisOnly = getWithFallback(chart, [
|
|
423
|
+
"c:plotVisOnly.a$.val",
|
|
424
|
+
"c:plotVisOnly.a$.t$",
|
|
425
|
+
"plotVisOnly.a$.val",
|
|
426
|
+
"plotVisOnly.a$.t$",
|
|
427
|
+
]);
|
|
428
|
+
if (plotVisOnly === undefined) {
|
|
429
|
+
return undefined;
|
|
430
|
+
}
|
|
431
|
+
// "1" or "true" = skip hidden cells, "0" or "false" = show all
|
|
432
|
+
var skipHidden = plotVisOnly === "1" || plotVisOnly === "true" || plotVisOnly === true;
|
|
433
|
+
return skipHidden ? "SKIP_HIDDEN_ROWS_AND_COLUMNS" : "SHOW_ALL";
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Read the chart title's text formatting. Excel chart titles can be
|
|
437
|
+
* styled two ways:
|
|
438
|
+
* - via `<c:title><c:txPr>` (paragraph default, affects future
|
|
439
|
+
* content); writers use this when no inline rich text is present.
|
|
440
|
+
* - via `<c:title><c:tx><c:rich>` (the title text itself, with
|
|
441
|
+
* per-paragraph `<a:pPr><a:defRPr>` carrying the styling).
|
|
442
|
+
* We probe both, with the rich-text path winning when present (it's
|
|
443
|
+
* the more explicit signal). Returns `undefined` when neither carries
|
|
444
|
+
* formatting so the renderer falls back to its theme defaults.
|
|
445
|
+
*/
|
|
446
|
+
function extractChartTitleTextFormat(chart) {
|
|
447
|
+
var _a, _b, _c;
|
|
448
|
+
var title = (_a = get(chart, "c:title")) !== null && _a !== void 0 ? _a : get(chart, "title");
|
|
449
|
+
if (!title)
|
|
450
|
+
return undefined;
|
|
451
|
+
var richTxPr = (_b = get(title, "c:tx.c:rich")) !== null && _b !== void 0 ? _b : get(title, "tx.rich");
|
|
452
|
+
var fromRich = extractTextProperties(richTxPr);
|
|
453
|
+
if (fromRich)
|
|
454
|
+
return fromRich;
|
|
455
|
+
var txPr = (_c = get(title, "c:txPr")) !== null && _c !== void 0 ? _c : get(title, "txPr");
|
|
456
|
+
return extractTextProperties(txPr);
|
|
457
|
+
}
|
|
458
|
+
export function extractChartTitle(chart) {
|
|
459
|
+
// Try different possible paths for chart title
|
|
460
|
+
var title =
|
|
461
|
+
// Rich text format (your current structure)
|
|
462
|
+
get(chart, "c:title.c:tx.c:rich.a:p.a:r.a:t") ||
|
|
463
|
+
// Alternative rich text paths
|
|
464
|
+
get(chart, "c:title.c:tx.c:rich.a:p.a:r.a:t.t$") ||
|
|
465
|
+
// String reference format
|
|
466
|
+
get(chart, "c:title.c:tx.c:strRef.c:strCache.c:pt.c:v") ||
|
|
467
|
+
get(chart, "c:title.c:tx.c:strRef.c:strCache.c:pt.c:v.t$") ||
|
|
468
|
+
// Direct value format
|
|
469
|
+
get(chart, "c:title.c:tx.c:v") ||
|
|
470
|
+
get(chart, "c:title.c:tx.c:v.t$") ||
|
|
471
|
+
// Simple text format
|
|
472
|
+
get(chart, "c:title.c:tx") ||
|
|
473
|
+
// Fallback: look for any text in title
|
|
474
|
+
extractTextFromTitle(get(chart, "c:title")) ||
|
|
475
|
+
"";
|
|
476
|
+
return typeof title === "string" ? title : "";
|
|
477
|
+
}
|
|
478
|
+
// Helper function to recursively search for text in title structure
|
|
479
|
+
function extractTextFromTitle(titleObj) {
|
|
480
|
+
if (!titleObj)
|
|
481
|
+
return "";
|
|
482
|
+
// If it's already a string, return it
|
|
483
|
+
if (typeof titleObj === "string")
|
|
484
|
+
return titleObj;
|
|
485
|
+
// Look for common text properties
|
|
486
|
+
if (titleObj["a:t"])
|
|
487
|
+
return titleObj["a:t"];
|
|
488
|
+
if (titleObj.t$)
|
|
489
|
+
return titleObj.t$;
|
|
490
|
+
if (titleObj.text)
|
|
491
|
+
return titleObj.text;
|
|
492
|
+
if (titleObj.value)
|
|
493
|
+
return titleObj.value;
|
|
494
|
+
// Recursively search through nested objects
|
|
495
|
+
for (var key in titleObj) {
|
|
496
|
+
if (typeof titleObj[key] === "object") {
|
|
497
|
+
var result = extractTextFromTitle(titleObj[key]);
|
|
498
|
+
if (result)
|
|
499
|
+
return result;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return "";
|
|
503
|
+
}
|
|
504
|
+
export function determineChartType(chart) {
|
|
505
|
+
var plotArea = getWithFallback(chart, ["c:plotArea", "plotArea"]);
|
|
506
|
+
// c15 extension marker (Phase 5.5): if the plotArea's c:extLst tags
|
|
507
|
+
// the chart as histogram / boxplot / waterfall / funnel, that overrides
|
|
508
|
+
// the bar-chart fallback the body uses for older-Excel compatibility.
|
|
509
|
+
var c15Type = detectC15ChartType(plotArea);
|
|
510
|
+
if (c15Type)
|
|
511
|
+
return c15Type;
|
|
512
|
+
var barChart = getWithFallback(plotArea, [
|
|
513
|
+
"c:barChart",
|
|
514
|
+
"barChart",
|
|
515
|
+
"c:bar3DChart",
|
|
516
|
+
"bar3DChart",
|
|
517
|
+
]);
|
|
518
|
+
if (barChart) {
|
|
519
|
+
var direction = get(barChart, "c:barDir.a$.val") ||
|
|
520
|
+
get(barChart, "c:barDir.a$.t$") ||
|
|
521
|
+
get(barChart, "barDir.a$.val") ||
|
|
522
|
+
get(barChart, "barDir.a$.t$") ||
|
|
523
|
+
get(barChart, "c:barDir.a$.v") ||
|
|
524
|
+
get(barChart, "barDir.a$.v");
|
|
525
|
+
return direction === "bar" ? "bar" : "column";
|
|
526
|
+
}
|
|
527
|
+
if (getWithFallback(plotArea, [
|
|
528
|
+
"c:lineChart",
|
|
529
|
+
"lineChart",
|
|
530
|
+
"c:line3DChart",
|
|
531
|
+
"line3DChart",
|
|
532
|
+
]))
|
|
533
|
+
return "line";
|
|
534
|
+
// OOXML uses a dedicated <c:doughnutChart> element. Check it before
|
|
535
|
+
// <c:pieChart>/<c:ofPieChart> so the more-specific shape wins.
|
|
536
|
+
if (getWithFallback(plotArea, ["c:doughnutChart", "doughnutChart"]))
|
|
537
|
+
return "doughnut";
|
|
538
|
+
// pie-of-pie / bar-of-pie — the renderer draws the composite from a
|
|
539
|
+
// plain "pie" chartType plus sourceChartType "OF_PIE" and the of-pie
|
|
540
|
+
// split fields (extracted in extractOfPieOptions).
|
|
541
|
+
if (getWithFallback(plotArea, ["c:ofPieChart", "ofPieChart"]))
|
|
542
|
+
return "pie";
|
|
543
|
+
if (getWithFallback(plotArea, [
|
|
544
|
+
"c:pieChart",
|
|
545
|
+
"pieChart",
|
|
546
|
+
"c:pie3DChart",
|
|
547
|
+
"pie3DChart",
|
|
548
|
+
]))
|
|
549
|
+
return "pie";
|
|
550
|
+
if (getWithFallback(plotArea, [
|
|
551
|
+
"c:areaChart",
|
|
552
|
+
"areaChart",
|
|
553
|
+
"c:area3DChart",
|
|
554
|
+
"area3DChart",
|
|
555
|
+
]))
|
|
556
|
+
return "area";
|
|
557
|
+
if (getWithFallback(plotArea, ["c:radarChart", "radarChart"]))
|
|
558
|
+
return "radar";
|
|
559
|
+
if (getWithFallback(plotArea, ["c:stockChart", "stockChart"]))
|
|
560
|
+
return "stock";
|
|
561
|
+
// Scatter and bubble — both use c:xVal/c:yVal series shape (not
|
|
562
|
+
// c:cat/c:val like other charts). Bubble additionally has c:bubbleSize.
|
|
563
|
+
if (getWithFallback(plotArea, ["c:scatterChart", "scatterChart"]))
|
|
564
|
+
return "scatter";
|
|
565
|
+
if (getWithFallback(plotArea, ["c:bubbleChart", "bubbleChart"]))
|
|
566
|
+
return "bubble";
|
|
567
|
+
return "column"; // default
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Phase 5.5 — detect the c15 extension marker our exporter writes on
|
|
571
|
+
* the plotArea. Returns the originating chart type (histogram /
|
|
572
|
+
* boxplot / waterfall / funnel) or null if no marker is present.
|
|
573
|
+
*
|
|
574
|
+
* The marker shape is:
|
|
575
|
+
* c:plotArea > c:extLst > c:ext (uri = ...) > c15:<chartName>Chart
|
|
576
|
+
*
|
|
577
|
+
* We accept either array or single-object shape for `c:ext` since
|
|
578
|
+
* fast-xml-parser normalizes lone children to objects.
|
|
579
|
+
*/
|
|
580
|
+
function detectC15ChartType(plotArea) {
|
|
581
|
+
var e_4, _a, e_5, _b;
|
|
582
|
+
if (!plotArea)
|
|
583
|
+
return null;
|
|
584
|
+
// Empty c15 elements (`<c15:histogramChart/>`) parse to "" — truthy
|
|
585
|
+
// checks skip them, so we test for key presence instead.
|
|
586
|
+
var hasKey = function (obj, key) {
|
|
587
|
+
return obj != null && Object.prototype.hasOwnProperty.call(obj, key);
|
|
588
|
+
};
|
|
589
|
+
// Phase 5.5b: c15 chart wrapped in mc:AlternateContent > mc:Choice.
|
|
590
|
+
// This is the Excel-native shape — modern Excel renders the chart
|
|
591
|
+
// from here, older Excel uses mc:Fallback (a c:barChart).
|
|
592
|
+
var altContent = getWithFallback(plotArea, [
|
|
593
|
+
"mc:AlternateContent",
|
|
594
|
+
"AlternateContent",
|
|
595
|
+
]);
|
|
596
|
+
if (altContent) {
|
|
597
|
+
var choice = getWithFallback(altContent, ["mc:Choice", "Choice"]);
|
|
598
|
+
if (choice) {
|
|
599
|
+
var choices = Array.isArray(choice) ? choice : [choice];
|
|
600
|
+
try {
|
|
601
|
+
for (var choices_1 = __values(choices), choices_1_1 = choices_1.next(); !choices_1_1.done; choices_1_1 = choices_1.next()) {
|
|
602
|
+
var c = choices_1_1.value;
|
|
603
|
+
if (hasKey(c, "c15:histogramChart") || hasKey(c, "histogramChart"))
|
|
604
|
+
return "histogram";
|
|
605
|
+
if (hasKey(c, "c15:boxWhiskerChart") || hasKey(c, "boxWhiskerChart"))
|
|
606
|
+
return "boxplot";
|
|
607
|
+
if (hasKey(c, "c15:waterfallChart") || hasKey(c, "waterfallChart"))
|
|
608
|
+
return "waterfall";
|
|
609
|
+
if (hasKey(c, "c15:funnelChart") || hasKey(c, "funnelChart"))
|
|
610
|
+
return "funnel";
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
614
|
+
finally {
|
|
615
|
+
try {
|
|
616
|
+
if (choices_1_1 && !choices_1_1.done && (_a = choices_1.return)) _a.call(choices_1);
|
|
617
|
+
}
|
|
618
|
+
finally { if (e_4) throw e_4.error; }
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
// Phase 5.5 (legacy): c15 extension marker inside c:extLst > c:ext.
|
|
623
|
+
// Round-trips through our pipeline; opens as bar chart in Excel.
|
|
624
|
+
// Kept so files written by older versions of this code still parse.
|
|
625
|
+
var extLst = getWithFallback(plotArea, ["c:extLst", "extLst"]);
|
|
626
|
+
if (!extLst)
|
|
627
|
+
return null;
|
|
628
|
+
var extNode = getWithFallback(extLst, ["c:ext", "ext"]);
|
|
629
|
+
if (!extNode)
|
|
630
|
+
return null;
|
|
631
|
+
var exts = Array.isArray(extNode) ? extNode : [extNode];
|
|
632
|
+
try {
|
|
633
|
+
for (var exts_1 = __values(exts), exts_1_1 = exts_1.next(); !exts_1_1.done; exts_1_1 = exts_1.next()) {
|
|
634
|
+
var ext = exts_1_1.value;
|
|
635
|
+
if (!ext)
|
|
636
|
+
continue;
|
|
637
|
+
if (hasKey(ext, "c15:histogramChart") || hasKey(ext, "histogramChart"))
|
|
638
|
+
return "histogram";
|
|
639
|
+
if (hasKey(ext, "c15:boxWhiskerChart") || hasKey(ext, "boxWhiskerChart"))
|
|
640
|
+
return "boxplot";
|
|
641
|
+
if (hasKey(ext, "c15:waterfallChart") || hasKey(ext, "waterfallChart"))
|
|
642
|
+
return "waterfall";
|
|
643
|
+
if (hasKey(ext, "c15:funnelChart") || hasKey(ext, "funnelChart"))
|
|
644
|
+
return "funnel";
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
648
|
+
finally {
|
|
649
|
+
try {
|
|
650
|
+
if (exts_1_1 && !exts_1_1.done && (_b = exts_1.return)) _b.call(exts_1);
|
|
651
|
+
}
|
|
652
|
+
finally { if (e_5) throw e_5.error; }
|
|
653
|
+
}
|
|
654
|
+
return null;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* Phase 5.5 — pull binCount out of the c15:histogramChart extension
|
|
658
|
+
* marker. Returns undefined if absent.
|
|
659
|
+
*/
|
|
660
|
+
export function extractC15HistogramBinCount(plotArea) {
|
|
661
|
+
var e_6, _a, e_7, _b;
|
|
662
|
+
var _c, _d, _e, _f;
|
|
663
|
+
if (!plotArea)
|
|
664
|
+
return undefined;
|
|
665
|
+
var readBinCount = function (hist) {
|
|
666
|
+
var _a, _b, _c;
|
|
667
|
+
if (!hist)
|
|
668
|
+
return undefined;
|
|
669
|
+
var raw = (_c = (_b = (_a = get(hist, "c15:binCount.a$.val")) !== null && _a !== void 0 ? _a : get(hist, "binCount.a$.val")) !== null && _b !== void 0 ? _b : get(hist, "c15:binCount.a$.v")) !== null && _c !== void 0 ? _c : get(hist, "binCount.a$.v");
|
|
670
|
+
if (raw === undefined || raw === null)
|
|
671
|
+
return undefined;
|
|
672
|
+
var num = Number(raw);
|
|
673
|
+
return Number.isFinite(num) ? num : undefined;
|
|
674
|
+
};
|
|
675
|
+
// Phase 5.5b: histogram inside mc:AlternateContent > mc:Choice.
|
|
676
|
+
var altContent = getWithFallback(plotArea, [
|
|
677
|
+
"mc:AlternateContent",
|
|
678
|
+
"AlternateContent",
|
|
679
|
+
]);
|
|
680
|
+
if (altContent) {
|
|
681
|
+
var choice = getWithFallback(altContent, ["mc:Choice", "Choice"]);
|
|
682
|
+
var choices = Array.isArray(choice)
|
|
683
|
+
? choice
|
|
684
|
+
: choice
|
|
685
|
+
? [choice]
|
|
686
|
+
: [];
|
|
687
|
+
try {
|
|
688
|
+
for (var choices_2 = __values(choices), choices_2_1 = choices_2.next(); !choices_2_1.done; choices_2_1 = choices_2.next()) {
|
|
689
|
+
var c = choices_2_1.value;
|
|
690
|
+
var hist = (_d = (_c = c === null || c === void 0 ? void 0 : c["c15:histogramChart"]) !== null && _c !== void 0 ? _c : c === null || c === void 0 ? void 0 : c["histogramChart"]) !== null && _d !== void 0 ? _d : null;
|
|
691
|
+
var v = readBinCount(hist);
|
|
692
|
+
if (v !== undefined)
|
|
693
|
+
return v;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
697
|
+
finally {
|
|
698
|
+
try {
|
|
699
|
+
if (choices_2_1 && !choices_2_1.done && (_a = choices_2.return)) _a.call(choices_2);
|
|
700
|
+
}
|
|
701
|
+
finally { if (e_6) throw e_6.error; }
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
// Phase 5.5 (legacy): histogram inside c:extLst > c:ext marker.
|
|
705
|
+
var extLst = getWithFallback(plotArea, ["c:extLst", "extLst"]);
|
|
706
|
+
if (!extLst)
|
|
707
|
+
return undefined;
|
|
708
|
+
var extNode = getWithFallback(extLst, ["c:ext", "ext"]);
|
|
709
|
+
if (!extNode)
|
|
710
|
+
return undefined;
|
|
711
|
+
var exts = Array.isArray(extNode) ? extNode : [extNode];
|
|
712
|
+
try {
|
|
713
|
+
for (var exts_2 = __values(exts), exts_2_1 = exts_2.next(); !exts_2_1.done; exts_2_1 = exts_2.next()) {
|
|
714
|
+
var ext = exts_2_1.value;
|
|
715
|
+
var hist = (_f = (_e = ext === null || ext === void 0 ? void 0 : ext["c15:histogramChart"]) !== null && _e !== void 0 ? _e : ext === null || ext === void 0 ? void 0 : ext["histogramChart"]) !== null && _f !== void 0 ? _f : null;
|
|
716
|
+
var v = readBinCount(hist);
|
|
717
|
+
if (v !== undefined)
|
|
718
|
+
return v;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
722
|
+
finally {
|
|
723
|
+
try {
|
|
724
|
+
if (exts_2_1 && !exts_2_1.done && (_b = exts_2.return)) _b.call(exts_2);
|
|
725
|
+
}
|
|
726
|
+
finally { if (e_7) throw e_7.error; }
|
|
727
|
+
}
|
|
728
|
+
return undefined;
|
|
729
|
+
}
|
|
730
|
+
// Chart type containers to search for series. Combo charts can mix
|
|
731
|
+
// multiple containers (e.g. column + line on one chart), so we iterate
|
|
732
|
+
// through all of them. XY charts (scatter/bubble) have a different
|
|
733
|
+
// per-series shape (xVal/yVal/bubbleSize) and require their own series
|
|
734
|
+
// extractor — they're listed here so combo charts that mix XY with
|
|
735
|
+
// non-XY series (rare but valid in OOXML) still pick up both.
|
|
736
|
+
var CHART_TYPE_CONTAINERS = [
|
|
737
|
+
{
|
|
738
|
+
paths: ["c:barChart", "barChart", "c:bar3DChart", "bar3DChart"],
|
|
739
|
+
chartType: "column",
|
|
740
|
+
isBar: true,
|
|
741
|
+
},
|
|
742
|
+
{
|
|
743
|
+
paths: ["c:lineChart", "lineChart", "c:line3DChart", "line3DChart"],
|
|
744
|
+
chartType: "line",
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
paths: ["c:areaChart", "areaChart", "c:area3DChart", "area3DChart"],
|
|
748
|
+
chartType: "area",
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
paths: ["c:scatterChart", "scatterChart"],
|
|
752
|
+
chartType: "scatter",
|
|
753
|
+
isXY: true,
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
paths: ["c:bubbleChart", "bubbleChart"],
|
|
757
|
+
chartType: "bubble",
|
|
758
|
+
isXY: true,
|
|
759
|
+
},
|
|
760
|
+
];
|
|
761
|
+
/**
|
|
762
|
+
* Resolve a chart-formula range string (e.g.
|
|
763
|
+
* `'Data for the Chart'!$A$7:$A$26`) into the sources array our chart
|
|
764
|
+
* model expects (one entry per parsed selection, with the data sheet's
|
|
765
|
+
* sheetId — not the chart's host sheet).
|
|
766
|
+
*/
|
|
767
|
+
function resolveSourcesFromRef(ref, hostSheetId, resolveSheetId) {
|
|
768
|
+
var selections = generateSelectionsFromFormula("=".concat(ref));
|
|
769
|
+
return selections.map(function (sel) { return (__assign(__assign({}, sel.range), { sheetId: pickSheetId(sel.sheetName, hostSheetId, resolveSheetId) })); });
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Extract inline values from a `<c:strLit>` or `<c:numLit>` element —
|
|
773
|
+
* these appear when chart data is embedded directly in the chart XML
|
|
774
|
+
* rather than referencing the sheet (Event Budget.xlsx uses this for
|
|
775
|
+
* its `["Estimated", "Actual"]` category labels).
|
|
776
|
+
*
|
|
777
|
+
* Returns the values ordered by their `idx` attribute (Excel allows
|
|
778
|
+
* sparse indices). Returns `undefined` when no inline data is present.
|
|
779
|
+
*/
|
|
780
|
+
function extractInlineValues(node) {
|
|
781
|
+
var e_8, _a;
|
|
782
|
+
var _b, _c, _d, _e;
|
|
783
|
+
if (!node)
|
|
784
|
+
return undefined;
|
|
785
|
+
var strLit = (_b = get(node, "c:strLit")) !== null && _b !== void 0 ? _b : get(node, "strLit");
|
|
786
|
+
var numLit = (_c = get(node, "c:numLit")) !== null && _c !== void 0 ? _c : get(node, "numLit");
|
|
787
|
+
var lit = strLit !== null && strLit !== void 0 ? strLit : numLit;
|
|
788
|
+
if (!lit)
|
|
789
|
+
return undefined;
|
|
790
|
+
var pts = (_d = get(lit, "c:pt")) !== null && _d !== void 0 ? _d : get(lit, "pt");
|
|
791
|
+
if (!pts)
|
|
792
|
+
return [];
|
|
793
|
+
var ptArray = Array.isArray(pts) ? pts : [pts];
|
|
794
|
+
// Order by the `idx` attribute. Most files emit them in order but
|
|
795
|
+
// spec permits any order; we honour that to avoid mis-aligning the
|
|
796
|
+
// first column when authors hand-craft chart XML.
|
|
797
|
+
var indexed = [];
|
|
798
|
+
try {
|
|
799
|
+
for (var ptArray_1 = __values(ptArray), ptArray_1_1 = ptArray_1.next(); !ptArray_1_1.done; ptArray_1_1 = ptArray_1.next()) {
|
|
800
|
+
var pt = ptArray_1_1.value;
|
|
801
|
+
var idxAttr = get(pt, "a$.idx");
|
|
802
|
+
var idx = idxAttr !== undefined ? Number(idxAttr) : indexed.length;
|
|
803
|
+
var rawV = (_e = get(pt, "c:v")) !== null && _e !== void 0 ? _e : get(pt, "v");
|
|
804
|
+
var v = void 0;
|
|
805
|
+
if (typeof rawV === "number" || typeof rawV === "boolean") {
|
|
806
|
+
v = rawV;
|
|
807
|
+
}
|
|
808
|
+
else if (numLit && typeof rawV === "string" && rawV.trim() !== "") {
|
|
809
|
+
var n = Number(rawV);
|
|
810
|
+
v = Number.isFinite(n) ? n : rawV;
|
|
811
|
+
}
|
|
812
|
+
else {
|
|
813
|
+
v = typeof rawV === "string" ? rawV : String(rawV !== null && rawV !== void 0 ? rawV : "");
|
|
814
|
+
}
|
|
815
|
+
indexed.push({ idx: Number.isFinite(idx) ? idx : indexed.length, v: v });
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
819
|
+
finally {
|
|
820
|
+
try {
|
|
821
|
+
if (ptArray_1_1 && !ptArray_1_1.done && (_a = ptArray_1.return)) _a.call(ptArray_1);
|
|
822
|
+
}
|
|
823
|
+
finally { if (e_8) throw e_8.error; }
|
|
824
|
+
}
|
|
825
|
+
indexed.sort(function (a, b) { return a.idx - b.idx; });
|
|
826
|
+
return indexed.map(function (entry) { return entry.v; });
|
|
827
|
+
}
|
|
828
|
+
export function extractChartSeries(plotArea, chartType, sheetId, resolveSheetId) {
|
|
829
|
+
var e_9, _a, e_10, _b;
|
|
830
|
+
var _c, _d;
|
|
831
|
+
var series = [];
|
|
832
|
+
var seriesIndex = 0;
|
|
833
|
+
try {
|
|
834
|
+
// Iterate through all chart type containers to support combo charts
|
|
835
|
+
for (var CHART_TYPE_CONTAINERS_1 = __values(CHART_TYPE_CONTAINERS), CHART_TYPE_CONTAINERS_1_1 = CHART_TYPE_CONTAINERS_1.next(); !CHART_TYPE_CONTAINERS_1_1.done; CHART_TYPE_CONTAINERS_1_1 = CHART_TYPE_CONTAINERS_1.next()) {
|
|
836
|
+
var container = CHART_TYPE_CONTAINERS_1_1.value;
|
|
837
|
+
var chartElement = getWithFallback(plotArea, container.paths);
|
|
838
|
+
if (!chartElement)
|
|
839
|
+
continue;
|
|
840
|
+
// Handle case where chart element is an array (e.g., multiple c:lineChart elements)
|
|
841
|
+
var chartElements = Array.isArray(chartElement)
|
|
842
|
+
? chartElement
|
|
843
|
+
: [chartElement];
|
|
844
|
+
try {
|
|
845
|
+
for (var chartElements_1 = (e_10 = void 0, __values(chartElements)), chartElements_1_1 = chartElements_1.next(); !chartElements_1_1.done; chartElements_1_1 = chartElements_1.next()) {
|
|
846
|
+
var singleChartElement = chartElements_1_1.value;
|
|
847
|
+
// Determine the actual chart type for this container
|
|
848
|
+
var seriesChartType = container.chartType;
|
|
849
|
+
if (container.isBar) {
|
|
850
|
+
// Check barDir to distinguish bar vs column
|
|
851
|
+
var direction = get(singleChartElement, "c:barDir.a$.val") ||
|
|
852
|
+
get(singleChartElement, "c:barDir.a$.t$") ||
|
|
853
|
+
get(singleChartElement, "barDir.a$.val") ||
|
|
854
|
+
get(singleChartElement, "barDir.a$.t$");
|
|
855
|
+
seriesChartType = direction === "bar" ? "bar" : "column";
|
|
856
|
+
}
|
|
857
|
+
// Get series elements from this container
|
|
858
|
+
var seriesElements = getWithFallback(singleChartElement, [
|
|
859
|
+
"c:ser",
|
|
860
|
+
"ser",
|
|
861
|
+
]);
|
|
862
|
+
if (!seriesElements)
|
|
863
|
+
continue;
|
|
864
|
+
var seriesArray = Array.isArray(seriesElements)
|
|
865
|
+
? seriesElements
|
|
866
|
+
: [seriesElements];
|
|
867
|
+
for (var i = 0; i < seriesArray.length; i++) {
|
|
868
|
+
var ser = seriesArray[i];
|
|
869
|
+
// Scatter/bubble — "series" carries Y values (yVal). Non-XY —
|
|
870
|
+
// it carries c:val.
|
|
871
|
+
var valRef = container.isXY
|
|
872
|
+
? getWithFallback(ser, Y_VAL_REF_PATHS)
|
|
873
|
+
: getWithFallback(ser, VAL_REF_PATHS);
|
|
874
|
+
var seriesTitle = extractSeriesTitleFromSeries(ser);
|
|
875
|
+
var colorInfo = extractSeriesColorInfo(ser);
|
|
876
|
+
// Resolve the series' value source — preferring the cell-range
|
|
877
|
+
// reference and falling back to inline `<c:numLit>`/`<c:strLit>`
|
|
878
|
+
// when there's no range (rare for series values, common for
|
|
879
|
+
// tiny embedded charts).
|
|
880
|
+
var sources = [];
|
|
881
|
+
var inlineValues = void 0;
|
|
882
|
+
if (valRef) {
|
|
883
|
+
sources = resolveSourcesFromRef(valRef, sheetId, resolveSheetId);
|
|
884
|
+
}
|
|
885
|
+
if (!sources.length) {
|
|
886
|
+
var valNode = container.isXY
|
|
887
|
+
? (_c = get(ser, "c:yVal")) !== null && _c !== void 0 ? _c : get(ser, "yVal")
|
|
888
|
+
: (_d = get(ser, "c:val")) !== null && _d !== void 0 ? _d : get(ser, "val");
|
|
889
|
+
inlineValues = extractInlineValues(valNode);
|
|
890
|
+
}
|
|
891
|
+
if (!sources.length && (!inlineValues || !inlineValues.length)) {
|
|
892
|
+
seriesIndex++;
|
|
893
|
+
continue;
|
|
894
|
+
}
|
|
895
|
+
var trendlines = extractTrendlines(ser);
|
|
896
|
+
var errorBars = extractErrorBars(ser, sheetId, resolveSheetId);
|
|
897
|
+
var marker = extractSeriesMarker(ser);
|
|
898
|
+
var dataPointColors = extractSeriesDataPointColors(ser);
|
|
899
|
+
var nameRef = getWithFallback(ser, TX_REF_PATHS);
|
|
900
|
+
// Per-series category reference — charts whose series plot against
|
|
901
|
+
// different category ranges can't be represented by the single
|
|
902
|
+
// chart-level domain alone; the exporter prefers this when present.
|
|
903
|
+
var serCatRef = container.isXY
|
|
904
|
+
? undefined
|
|
905
|
+
: getWithFallback(ser, CAT_REF_PATHS);
|
|
906
|
+
var categorySources = serCatRef
|
|
907
|
+
? resolveSourcesFromRef(serCatRef, sheetId, resolveSheetId)
|
|
908
|
+
: [];
|
|
909
|
+
series.push(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ dataLabel: seriesTitle || "Series ".concat(seriesIndex + 1) }, (nameRef ? { dataLabelRef: nameRef } : {})), (categorySources.length ? { categorySources: categorySources } : {})), { color: colorInfo.color }), (colorInfo.noFill ? { noFill: true } : {})), { negativeColor: colorInfo.negativeColor, invertIfNegative: colorInfo.invertIfNegative }), (colorInfo.gradient ? { gradient: colorInfo.gradient } : {})), (container.isXY ? {} : { seriesChartType: seriesChartType })), { sources: sources }), (inlineValues && inlineValues.length ? { inlineValues: inlineValues } : {})), (trendlines && trendlines.length ? { trendlines: trendlines } : {})), (errorBars ? { errorBars: errorBars } : {})), (marker ? { marker: marker } : {})), (dataPointColors && dataPointColors.length
|
|
910
|
+
? { dataPointColors: dataPointColors }
|
|
911
|
+
: {})));
|
|
912
|
+
seriesIndex++;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
917
|
+
finally {
|
|
918
|
+
try {
|
|
919
|
+
if (chartElements_1_1 && !chartElements_1_1.done && (_b = chartElements_1.return)) _b.call(chartElements_1);
|
|
920
|
+
}
|
|
921
|
+
finally { if (e_10) throw e_10.error; }
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
926
|
+
finally {
|
|
927
|
+
try {
|
|
928
|
+
if (CHART_TYPE_CONTAINERS_1_1 && !CHART_TYPE_CONTAINERS_1_1.done && (_a = CHART_TYPE_CONTAINERS_1.return)) _a.call(CHART_TYPE_CONTAINERS_1);
|
|
929
|
+
}
|
|
930
|
+
finally { if (e_9) throw e_9.error; }
|
|
931
|
+
}
|
|
932
|
+
// Fallback: pie/doughnut/radar/stock/ofPie/etc. aren't in
|
|
933
|
+
// CHART_TYPE_CONTAINERS; they're single-container, type-specific,
|
|
934
|
+
// and don't combo with other types. Pick up via the type-specific
|
|
935
|
+
// path-set helper.
|
|
936
|
+
if (series.length === 0) {
|
|
937
|
+
var seriesElements = getSeriesElements(plotArea, chartType);
|
|
938
|
+
if (seriesElements) {
|
|
939
|
+
var seriesArray = Array.isArray(seriesElements)
|
|
940
|
+
? seriesElements
|
|
941
|
+
: [seriesElements];
|
|
942
|
+
seriesArray.forEach(function (ser, index) {
|
|
943
|
+
var _a, _b;
|
|
944
|
+
var valRef = isXYChart(chartType)
|
|
945
|
+
? getWithFallback(ser, Y_VAL_REF_PATHS)
|
|
946
|
+
: getWithFallback(ser, VAL_REF_PATHS);
|
|
947
|
+
var seriesTitle = extractSeriesTitleFromSeries(ser);
|
|
948
|
+
var colorInfo = extractSeriesColorInfo(ser);
|
|
949
|
+
var sources = [];
|
|
950
|
+
var inlineValues;
|
|
951
|
+
if (valRef) {
|
|
952
|
+
sources = resolveSourcesFromRef(valRef, sheetId, resolveSheetId);
|
|
953
|
+
}
|
|
954
|
+
if (!sources.length) {
|
|
955
|
+
var valNode = isXYChart(chartType)
|
|
956
|
+
? (_a = get(ser, "c:yVal")) !== null && _a !== void 0 ? _a : get(ser, "yVal")
|
|
957
|
+
: (_b = get(ser, "c:val")) !== null && _b !== void 0 ? _b : get(ser, "val");
|
|
958
|
+
inlineValues = extractInlineValues(valNode);
|
|
959
|
+
}
|
|
960
|
+
if (!sources.length && (!inlineValues || !inlineValues.length)) {
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
var marker = extractSeriesMarker(ser);
|
|
964
|
+
var dataPointColors = extractSeriesDataPointColors(ser);
|
|
965
|
+
var nameRef = getWithFallback(ser, TX_REF_PATHS);
|
|
966
|
+
var serCatRef = isXYChart(chartType)
|
|
967
|
+
? undefined
|
|
968
|
+
: getWithFallback(ser, CAT_REF_PATHS);
|
|
969
|
+
var categorySources = serCatRef
|
|
970
|
+
? resolveSourcesFromRef(serCatRef, sheetId, resolveSheetId)
|
|
971
|
+
: [];
|
|
972
|
+
series.push(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ dataLabel: seriesTitle || "Series ".concat(index + 1) }, (nameRef ? { dataLabelRef: nameRef } : {})), (categorySources.length ? { categorySources: categorySources } : {})), { color: colorInfo.color }), (colorInfo.noFill ? { noFill: true } : {})), { negativeColor: colorInfo.negativeColor, invertIfNegative: colorInfo.invertIfNegative }), (colorInfo.gradient ? { gradient: colorInfo.gradient } : {})), { sources: sources }), (inlineValues && inlineValues.length ? { inlineValues: inlineValues } : {})), (marker ? { marker: marker } : {})), (dataPointColors && dataPointColors.length
|
|
973
|
+
? { dataPointColors: dataPointColors }
|
|
974
|
+
: {})));
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
return series;
|
|
979
|
+
}
|
|
980
|
+
/**
|
|
981
|
+
* Extract per-data-point color overrides — `<c:dPt>` array inside
|
|
982
|
+
* `<c:ser>`. Each entry pins a specific category index to its own
|
|
983
|
+
* fill color (Gantt charts use this to colour individual tasks; pie
|
|
984
|
+
* charts use it for per-slice colors). Returns `undefined` when there
|
|
985
|
+
* are no overrides.
|
|
986
|
+
*/
|
|
987
|
+
function extractSeriesDataPointColors(ser) {
|
|
988
|
+
var e_11, _a;
|
|
989
|
+
var _b, _c, _d;
|
|
990
|
+
var raw = (_b = get(ser, "c:dPt")) !== null && _b !== void 0 ? _b : get(ser, "dPt");
|
|
991
|
+
if (!raw)
|
|
992
|
+
return undefined;
|
|
993
|
+
var list = Array.isArray(raw) ? raw : [raw];
|
|
994
|
+
var result = [];
|
|
995
|
+
try {
|
|
996
|
+
for (var list_1 = __values(list), list_1_1 = list_1.next(); !list_1_1.done; list_1_1 = list_1.next()) {
|
|
997
|
+
var dPt = list_1_1.value;
|
|
998
|
+
var idxRaw = (_c = get(dPt, "c:idx.a$.val")) !== null && _c !== void 0 ? _c : get(dPt, "idx.a$.val");
|
|
999
|
+
var idx = idxRaw !== undefined ? Number(idxRaw) : NaN;
|
|
1000
|
+
if (!Number.isFinite(idx))
|
|
1001
|
+
continue;
|
|
1002
|
+
var solidFill = (_d = get(dPt, "c:spPr.a:solidFill")) !== null && _d !== void 0 ? _d : get(dPt, "spPr.a:solidFill");
|
|
1003
|
+
var color = resolveDrawingColor(solidFill);
|
|
1004
|
+
if (!color)
|
|
1005
|
+
continue;
|
|
1006
|
+
result.push({ idx: idx, color: color });
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
1010
|
+
finally {
|
|
1011
|
+
try {
|
|
1012
|
+
if (list_1_1 && !list_1_1.done && (_a = list_1.return)) _a.call(list_1);
|
|
1013
|
+
}
|
|
1014
|
+
finally { if (e_11) throw e_11.error; }
|
|
1015
|
+
}
|
|
1016
|
+
return result.length ? result : undefined;
|
|
1017
|
+
}
|
|
1018
|
+
var MARKER_SYMBOL_SET = new Set([
|
|
1019
|
+
"none",
|
|
1020
|
+
"circle",
|
|
1021
|
+
"square",
|
|
1022
|
+
"diamond",
|
|
1023
|
+
"triangle",
|
|
1024
|
+
"x",
|
|
1025
|
+
"plus",
|
|
1026
|
+
"star",
|
|
1027
|
+
"dash",
|
|
1028
|
+
"dot",
|
|
1029
|
+
"auto",
|
|
1030
|
+
"picture",
|
|
1031
|
+
]);
|
|
1032
|
+
function extractSeriesMarker(ser) {
|
|
1033
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1034
|
+
var raw = (_a = get(ser, "c:marker")) !== null && _a !== void 0 ? _a : get(ser, "marker");
|
|
1035
|
+
if (!raw)
|
|
1036
|
+
return undefined;
|
|
1037
|
+
var symbolRaw = (_d = (_c = (_b = get(raw, "c:symbol.a$.val")) !== null && _b !== void 0 ? _b : get(raw, "symbol.a$.val")) !== null && _c !== void 0 ? _c : get(raw, "c:symbol.a$.t$")) !== null && _d !== void 0 ? _d : get(raw, "symbol.a$.t$");
|
|
1038
|
+
var symbol = typeof symbolRaw === "string" &&
|
|
1039
|
+
MARKER_SYMBOL_SET.has(symbolRaw)
|
|
1040
|
+
? symbolRaw
|
|
1041
|
+
: undefined;
|
|
1042
|
+
var sizeAttr = (_g = (_f = (_e = get(raw, "c:size.a$.val")) !== null && _e !== void 0 ? _e : get(raw, "size.a$.val")) !== null && _f !== void 0 ? _f : get(raw, "c:size.a$.t$")) !== null && _g !== void 0 ? _g : get(raw, "size.a$.t$");
|
|
1043
|
+
var size = sizeAttr !== undefined && sizeAttr !== null && sizeAttr !== ""
|
|
1044
|
+
? Number(sizeAttr)
|
|
1045
|
+
: undefined;
|
|
1046
|
+
// Marker fill — used when explicit (not derived from series color).
|
|
1047
|
+
var fillRgb = (_h = get(raw, "c:spPr.a:solidFill.a:srgbClr.a$.val")) !== null && _h !== void 0 ? _h : get(raw, "spPr.solidFill.srgbClr.a$.val");
|
|
1048
|
+
var color = fillRgb ? "#".concat(fillRgb) : undefined;
|
|
1049
|
+
var result = {};
|
|
1050
|
+
if (symbol)
|
|
1051
|
+
result.symbol = symbol;
|
|
1052
|
+
if (typeof size === "number" && Number.isFinite(size))
|
|
1053
|
+
result.size = size;
|
|
1054
|
+
if (color)
|
|
1055
|
+
result.color = color;
|
|
1056
|
+
return Object.keys(result).length ? result : undefined;
|
|
1057
|
+
}
|
|
1058
|
+
// ─── Text property extraction (color, font) ──────────────────────────
|
|
1059
|
+
// Used by `readAxis`, `extractLegendOptions`, `extractDataLabelsOptions`,
|
|
1060
|
+
// `extractChartTitle` to pull `<c:txPr>` / `<a:rPr>` styling so axis
|
|
1061
|
+
// labels, data labels, legend entries and chart titles render with
|
|
1062
|
+
// their authored colors instead of falling back to the renderer's
|
|
1063
|
+
// theme default (the BEP.xlsx import showed all labels as
|
|
1064
|
+
// near-black).
|
|
1065
|
+
var OFFICE_THEME_FALLBACK = {
|
|
1066
|
+
// Standard Office theme color tokens. We don't try to resolve from
|
|
1067
|
+
// the workbook's actual `xl/theme/themeN.xml` here — the chart is
|
|
1068
|
+
// typically authored against the same theme palette and these
|
|
1069
|
+
// defaults match the in-app theme defaults closely enough that the
|
|
1070
|
+
// visual difference is below noise level.
|
|
1071
|
+
tx1: "#000000",
|
|
1072
|
+
tx2: "#44546A",
|
|
1073
|
+
bg1: "#FFFFFF",
|
|
1074
|
+
bg2: "#E7E6E6",
|
|
1075
|
+
dk1: "#000000",
|
|
1076
|
+
dk2: "#44546A",
|
|
1077
|
+
lt1: "#FFFFFF",
|
|
1078
|
+
lt2: "#E7E6E6",
|
|
1079
|
+
accent1: "#4472C4",
|
|
1080
|
+
accent2: "#ED7D31",
|
|
1081
|
+
accent3: "#A5A5A5",
|
|
1082
|
+
accent4: "#FFC000",
|
|
1083
|
+
accent5: "#5B9BD5",
|
|
1084
|
+
accent6: "#70AD47",
|
|
1085
|
+
hlink: "#0563C1",
|
|
1086
|
+
folHlink: "#954F72",
|
|
1087
|
+
};
|
|
1088
|
+
/**
|
|
1089
|
+
* Apply OOXML lumMod / lumOff / shade / tint modifiers to a base RGB
|
|
1090
|
+
* color. All are stored as 1000ths of a percent (75000 = 75%).
|
|
1091
|
+
*
|
|
1092
|
+
* - `lumMod` scales each channel (`c * mod`)
|
|
1093
|
+
* - `lumOff` adds toward white (`+ 255 * off`)
|
|
1094
|
+
* - `shade` darkens — interpolates toward black (`c * shade`)
|
|
1095
|
+
* - `tint` lightens — interpolates toward white (`c + (255 - c) * tint`)
|
|
1096
|
+
*
|
|
1097
|
+
* Order: shade/tint apply first (they're independent transforms), then
|
|
1098
|
+
* lumMod/lumOff. Matches Excel's behaviour closely for common patterns:
|
|
1099
|
+
* - `tx1 + lumMod=75% + lumOff=25%` → `#404040` dark gray (BEP)
|
|
1100
|
+
* - `accent1 + shade=76%` → darker accent1 (Gantt)
|
|
1101
|
+
*/
|
|
1102
|
+
var applyLumModOff = function (hex, lumMod, lumOff, shade, tint) {
|
|
1103
|
+
var m = /^#?([0-9a-fA-F]{6})$/.exec(hex);
|
|
1104
|
+
if (!m)
|
|
1105
|
+
return hex;
|
|
1106
|
+
var v = parseInt(m[1], 16);
|
|
1107
|
+
var r = (v >> 16) & 0xff;
|
|
1108
|
+
var g = (v >> 8) & 0xff;
|
|
1109
|
+
var b = v & 0xff;
|
|
1110
|
+
// shade darkens (multiply by factor < 1); tint lightens (interp
|
|
1111
|
+
// toward white). Apply before lumMod/lumOff since those mix in a
|
|
1112
|
+
// different luminance space and Excel evaluates shade/tint first.
|
|
1113
|
+
if (typeof shade === "number" && shade > 0 && shade < 1) {
|
|
1114
|
+
r = r * shade;
|
|
1115
|
+
g = g * shade;
|
|
1116
|
+
b = b * shade;
|
|
1117
|
+
}
|
|
1118
|
+
if (typeof tint === "number" && tint > 0 && tint < 1) {
|
|
1119
|
+
r = r + (255 - r) * tint;
|
|
1120
|
+
g = g + (255 - g) * tint;
|
|
1121
|
+
b = b + (255 - b) * tint;
|
|
1122
|
+
}
|
|
1123
|
+
var mod = typeof lumMod === "number" ? lumMod : 1;
|
|
1124
|
+
var off = typeof lumOff === "number" ? lumOff : 0;
|
|
1125
|
+
var apply = function (c) {
|
|
1126
|
+
return Math.max(0, Math.min(255, Math.round(c * mod + 255 * off)));
|
|
1127
|
+
};
|
|
1128
|
+
var toHex = function (c) {
|
|
1129
|
+
return c.toString(16).padStart(2, "0").toUpperCase();
|
|
1130
|
+
};
|
|
1131
|
+
return "#".concat(toHex(apply(r))).concat(toHex(apply(g))).concat(toHex(apply(b)));
|
|
1132
|
+
};
|
|
1133
|
+
/**
|
|
1134
|
+
* Resolve a DrawingML `<a:solidFill>` (or any element that wraps an
|
|
1135
|
+
* `<a:srgbClr>` / `<a:schemeClr>`) to a hex color string. Handles
|
|
1136
|
+
* `lumMod`/`lumOff` modifiers used to derive grays from theme tokens.
|
|
1137
|
+
*/
|
|
1138
|
+
function resolveDrawingColor(node) {
|
|
1139
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
1140
|
+
if (!node)
|
|
1141
|
+
return undefined;
|
|
1142
|
+
// Direct RGB.
|
|
1143
|
+
var srgb = (_a = get(node, "a:srgbClr.a$.val")) !== null && _a !== void 0 ? _a : get(node, "srgbClr.a$.val");
|
|
1144
|
+
if (srgb) {
|
|
1145
|
+
var lumMod = readPctNumber((_b = get(node, "a:srgbClr.a:lumMod.a$.val")) !== null && _b !== void 0 ? _b : get(node, "srgbClr.lumMod.a$.val"));
|
|
1146
|
+
var lumOff = readPctNumber((_c = get(node, "a:srgbClr.a:lumOff.a$.val")) !== null && _c !== void 0 ? _c : get(node, "srgbClr.lumOff.a$.val"));
|
|
1147
|
+
var shade = readPctNumber((_d = get(node, "a:srgbClr.a:shade.a$.val")) !== null && _d !== void 0 ? _d : get(node, "srgbClr.shade.a$.val"));
|
|
1148
|
+
var tint = readPctNumber((_e = get(node, "a:srgbClr.a:tint.a$.val")) !== null && _e !== void 0 ? _e : get(node, "srgbClr.tint.a$.val"));
|
|
1149
|
+
return applyLumModOff("#".concat(srgb), lumMod, lumOff, shade, tint);
|
|
1150
|
+
}
|
|
1151
|
+
// Theme reference.
|
|
1152
|
+
var schemeName = (_f = get(node, "a:schemeClr.a$.val")) !== null && _f !== void 0 ? _f : get(node, "schemeClr.a$.val");
|
|
1153
|
+
if (typeof schemeName === "string") {
|
|
1154
|
+
var base = (_g = OFFICE_THEME_FALLBACK[schemeName]) !== null && _g !== void 0 ? _g : "#000000";
|
|
1155
|
+
var lumMod = readPctNumber((_h = get(node, "a:schemeClr.a:lumMod.a$.val")) !== null && _h !== void 0 ? _h : get(node, "schemeClr.lumMod.a$.val"));
|
|
1156
|
+
var lumOff = readPctNumber((_j = get(node, "a:schemeClr.a:lumOff.a$.val")) !== null && _j !== void 0 ? _j : get(node, "schemeClr.lumOff.a$.val"));
|
|
1157
|
+
var shade = readPctNumber((_k = get(node, "a:schemeClr.a:shade.a$.val")) !== null && _k !== void 0 ? _k : get(node, "schemeClr.shade.a$.val"));
|
|
1158
|
+
var tint = readPctNumber((_l = get(node, "a:schemeClr.a:tint.a$.val")) !== null && _l !== void 0 ? _l : get(node, "schemeClr.tint.a$.val"));
|
|
1159
|
+
return applyLumModOff(base, lumMod, lumOff, shade, tint);
|
|
1160
|
+
}
|
|
1161
|
+
return undefined;
|
|
1162
|
+
}
|
|
1163
|
+
/** Parse an OOXML percentage stored as 1000ths-of-a-percent → 0..1. */
|
|
1164
|
+
function readPctNumber(val) {
|
|
1165
|
+
if (val === undefined || val === null || val === "")
|
|
1166
|
+
return undefined;
|
|
1167
|
+
var n = Number(val);
|
|
1168
|
+
return Number.isFinite(n) ? n / 100000 : undefined;
|
|
1169
|
+
}
|
|
1170
|
+
/**
|
|
1171
|
+
* Extract a `ChartTextFormat` from an OOXML text-properties node. The
|
|
1172
|
+
* input is typically `<c:txPr>` or `<c:title><c:tx><c:rich>` — both
|
|
1173
|
+
* use the same `<a:p><a:pPr><a:defRPr>…</a:defRPr></a:pPr></a:p>`
|
|
1174
|
+
* shape to express paragraph-default character properties.
|
|
1175
|
+
*
|
|
1176
|
+
* Returns `undefined` when the node carries no formatting (so the
|
|
1177
|
+
* caller doesn't emit an empty `textFormat` field).
|
|
1178
|
+
*/
|
|
1179
|
+
function extractTextProperties(txPr) {
|
|
1180
|
+
var _a, _b, _c, _d, _e, _f;
|
|
1181
|
+
if (!txPr)
|
|
1182
|
+
return undefined;
|
|
1183
|
+
// The font/color lives on `<a:p><a:pPr><a:defRPr>`. Some writers put
|
|
1184
|
+
// it directly on `<a:r><a:rPr>` for rich titles — accept both.
|
|
1185
|
+
var defRPr = (_c = (_b = (_a = get(txPr, "a:p.a:pPr.a:defRPr")) !== null && _a !== void 0 ? _a : get(txPr, "p.pPr.defRPr")) !== null && _b !== void 0 ? _b : get(txPr, "a:p.a:r.a:rPr")) !== null && _c !== void 0 ? _c : get(txPr, "p.r.rPr");
|
|
1186
|
+
if (!defRPr)
|
|
1187
|
+
return undefined;
|
|
1188
|
+
var result = {};
|
|
1189
|
+
// Font size — `sz` is in 100ths of a point (`sz="900"` → 9pt).
|
|
1190
|
+
var szAttr = (_d = get(defRPr, "a$.sz")) !== null && _d !== void 0 ? _d : get(defRPr, "a$.t$");
|
|
1191
|
+
if (szAttr !== undefined && szAttr !== null && szAttr !== "") {
|
|
1192
|
+
var sz = Number(szAttr);
|
|
1193
|
+
if (Number.isFinite(sz) && sz > 0)
|
|
1194
|
+
result.fontSize = sz / 100;
|
|
1195
|
+
}
|
|
1196
|
+
// Bold / italic / underline / strikethrough.
|
|
1197
|
+
var bAttr = get(defRPr, "a$.b");
|
|
1198
|
+
if (bAttr === "1" || bAttr === 1 || bAttr === true)
|
|
1199
|
+
result.bold = true;
|
|
1200
|
+
var iAttr = get(defRPr, "a$.i");
|
|
1201
|
+
if (iAttr === "1" || iAttr === 1 || iAttr === true)
|
|
1202
|
+
result.italic = true;
|
|
1203
|
+
var uAttr = get(defRPr, "a$.u");
|
|
1204
|
+
if (typeof uAttr === "string" && uAttr !== "none")
|
|
1205
|
+
result.underline = true;
|
|
1206
|
+
var strikeAttr = get(defRPr, "a$.strike");
|
|
1207
|
+
if (typeof strikeAttr === "string" && strikeAttr !== "noStrike") {
|
|
1208
|
+
result.strikethrough = true;
|
|
1209
|
+
}
|
|
1210
|
+
// Font family — `<a:latin typeface="…">`.
|
|
1211
|
+
var latin = (_e = get(defRPr, "a:latin.a$.typeface")) !== null && _e !== void 0 ? _e : get(defRPr, "latin.a$.typeface");
|
|
1212
|
+
if (typeof latin === "string" && latin)
|
|
1213
|
+
result.fontFamily = latin;
|
|
1214
|
+
// Color — `<a:solidFill>` containing `<a:srgbClr>` or `<a:schemeClr>`.
|
|
1215
|
+
var solidFill = (_f = get(defRPr, "a:solidFill")) !== null && _f !== void 0 ? _f : get(defRPr, "solidFill");
|
|
1216
|
+
var color = resolveDrawingColor(solidFill);
|
|
1217
|
+
if (color)
|
|
1218
|
+
result.color = color;
|
|
1219
|
+
return Object.keys(result).length ? result : undefined;
|
|
1220
|
+
}
|
|
1221
|
+
/**
|
|
1222
|
+
* Read bar/column `<c:grouping>`, `<c:overlap>`, `<c:gapWidth>` —
|
|
1223
|
+
* controls how multi-series bars are arranged (clustered / stacked /
|
|
1224
|
+
* percent-stacked). Looks inside `<c:barChart>` / `<c:bar3DChart>`
|
|
1225
|
+
* containers; returns `undefined` if no settings are present so the
|
|
1226
|
+
* renderer keeps its defaults.
|
|
1227
|
+
*/
|
|
1228
|
+
function extractBarLayoutOptions(plotArea) {
|
|
1229
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1230
|
+
var bar = (_c = (_b = (_a = get(plotArea, "c:barChart")) !== null && _a !== void 0 ? _a : get(plotArea, "barChart")) !== null && _b !== void 0 ? _b : get(plotArea, "c:bar3DChart")) !== null && _c !== void 0 ? _c : get(plotArea, "bar3DChart");
|
|
1231
|
+
if (!bar)
|
|
1232
|
+
return undefined;
|
|
1233
|
+
// `<c:grouping val="clustered|stacked|percentStacked|standard"/>`.
|
|
1234
|
+
// `standard` is "side-by-side, no stacking" — same as `clustered`
|
|
1235
|
+
// semantically; map both to UNSTACKED.
|
|
1236
|
+
var groupingVal = (_f = (_e = (_d = get(bar, "c:grouping.a$.val")) !== null && _d !== void 0 ? _d : get(bar, "grouping.a$.val")) !== null && _e !== void 0 ? _e : get(bar, "c:grouping.a$.t$")) !== null && _f !== void 0 ? _f : get(bar, "grouping.a$.t$");
|
|
1237
|
+
var stackedType;
|
|
1238
|
+
switch (groupingVal) {
|
|
1239
|
+
case "stacked":
|
|
1240
|
+
stackedType = "STACKED";
|
|
1241
|
+
break;
|
|
1242
|
+
case "percentStacked":
|
|
1243
|
+
stackedType = "PERCENT_STACKED";
|
|
1244
|
+
break;
|
|
1245
|
+
case "clustered":
|
|
1246
|
+
case "standard":
|
|
1247
|
+
stackedType = "UNSTACKED";
|
|
1248
|
+
break;
|
|
1249
|
+
}
|
|
1250
|
+
var overlapVal = readNumber((_g = get(bar, "c:overlap.a$.val")) !== null && _g !== void 0 ? _g : get(bar, "overlap.a$.val"));
|
|
1251
|
+
var gapWidthVal = readNumber((_h = get(bar, "c:gapWidth.a$.val")) !== null && _h !== void 0 ? _h : get(bar, "gapWidth.a$.val"));
|
|
1252
|
+
var result = {};
|
|
1253
|
+
if (stackedType)
|
|
1254
|
+
result.stackedType = stackedType;
|
|
1255
|
+
if (typeof overlapVal === "number")
|
|
1256
|
+
result.overlap = overlapVal;
|
|
1257
|
+
if (typeof gapWidthVal === "number")
|
|
1258
|
+
result.gapWidth = gapWidthVal;
|
|
1259
|
+
return Object.keys(result).length ? result : undefined;
|
|
1260
|
+
}
|
|
1261
|
+
/**
|
|
1262
|
+
* Extract chart-level `<c:scatterStyle val=…>`. Excel default is
|
|
1263
|
+
* "lineMarker" (straight lines + markers). Returns undefined for
|
|
1264
|
+
* non-scatter charts.
|
|
1265
|
+
*/
|
|
1266
|
+
function extractScatterStyle(plotArea) {
|
|
1267
|
+
var _a, _b, _c;
|
|
1268
|
+
var val = (_c = (_b = (_a = get(plotArea, "c:scatterChart.c:scatterStyle.a$.val")) !== null && _a !== void 0 ? _a : get(plotArea, "scatterChart.scatterStyle.a$.val")) !== null && _b !== void 0 ? _b : get(plotArea, "c:scatterChart.c:scatterStyle.a$.t$")) !== null && _c !== void 0 ? _c : get(plotArea, "scatterChart.scatterStyle.a$.t$");
|
|
1269
|
+
return typeof val === "string" && val ? val : undefined;
|
|
1270
|
+
}
|
|
1271
|
+
function extractSeriesTitleFromSeries(ser) {
|
|
1272
|
+
var e_12, _a;
|
|
1273
|
+
// Prefer cached textual value if present
|
|
1274
|
+
var cacheEntries = get(ser, "c:tx.c:strRef.c:strCache.c:pt");
|
|
1275
|
+
if (cacheEntries) {
|
|
1276
|
+
var pts = Array.isArray(cacheEntries) ? cacheEntries : [cacheEntries];
|
|
1277
|
+
try {
|
|
1278
|
+
for (var pts_1 = __values(pts), pts_1_1 = pts_1.next(); !pts_1_1.done; pts_1_1 = pts_1.next()) {
|
|
1279
|
+
var pt = pts_1_1.value;
|
|
1280
|
+
var value = coerceTitleText(get(pt, "c:v.t$") ||
|
|
1281
|
+
get(pt, "c:v") ||
|
|
1282
|
+
extractRichText(get(pt, "c:rich")));
|
|
1283
|
+
if (value) {
|
|
1284
|
+
return value;
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
1289
|
+
finally {
|
|
1290
|
+
try {
|
|
1291
|
+
if (pts_1_1 && !pts_1_1.done && (_a = pts_1.return)) _a.call(pts_1);
|
|
1292
|
+
}
|
|
1293
|
+
finally { if (e_12) throw e_12.error; }
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
// Fall back to literal
|
|
1297
|
+
var literal = coerceTitleText(get(ser, "c:tx.c:v.t$") ||
|
|
1298
|
+
get(ser, "c:tx.c:v") ||
|
|
1299
|
+
extractRichText(get(ser, "c:tx.c:rich")));
|
|
1300
|
+
if (literal) {
|
|
1301
|
+
return literal;
|
|
1302
|
+
}
|
|
1303
|
+
return undefined;
|
|
1304
|
+
}
|
|
1305
|
+
/**
|
|
1306
|
+
* fast-xml-parser converts numeric `<c:v>` values (e.g. a series header
|
|
1307
|
+
* like 2024) into numbers; normalize primitives to strings and drop
|
|
1308
|
+
* anything else so titles are always strings downstream.
|
|
1309
|
+
*/
|
|
1310
|
+
function coerceTitleText(value) {
|
|
1311
|
+
if (typeof value === "string")
|
|
1312
|
+
return value;
|
|
1313
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
1314
|
+
return String(value);
|
|
1315
|
+
}
|
|
1316
|
+
return undefined;
|
|
1317
|
+
}
|
|
1318
|
+
function extractRichText(node) {
|
|
1319
|
+
var e_13, _a, e_14, _b;
|
|
1320
|
+
if (!node) {
|
|
1321
|
+
return undefined;
|
|
1322
|
+
}
|
|
1323
|
+
var paragraphs = getWithFallback(node, ["a:p", "p"]);
|
|
1324
|
+
var paragraphArray = Array.isArray(paragraphs)
|
|
1325
|
+
? paragraphs
|
|
1326
|
+
: paragraphs
|
|
1327
|
+
? [paragraphs]
|
|
1328
|
+
: [];
|
|
1329
|
+
var fragments = [];
|
|
1330
|
+
try {
|
|
1331
|
+
for (var paragraphArray_1 = __values(paragraphArray), paragraphArray_1_1 = paragraphArray_1.next(); !paragraphArray_1_1.done; paragraphArray_1_1 = paragraphArray_1.next()) {
|
|
1332
|
+
var paragraph = paragraphArray_1_1.value;
|
|
1333
|
+
var runs = getWithFallback(paragraph, ["a:r", "r"]);
|
|
1334
|
+
var runArray = Array.isArray(runs) ? runs : runs ? [runs] : [paragraph];
|
|
1335
|
+
try {
|
|
1336
|
+
for (var runArray_1 = (e_14 = void 0, __values(runArray)), runArray_1_1 = runArray_1.next(); !runArray_1_1.done; runArray_1_1 = runArray_1.next()) {
|
|
1337
|
+
var run = runArray_1_1.value;
|
|
1338
|
+
var text = getWithFallback(run, ["a:t.t$", "a:t"]) ||
|
|
1339
|
+
getWithFallback(run, ["t$", "t"]);
|
|
1340
|
+
if (typeof text === "string") {
|
|
1341
|
+
fragments.push(text);
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
1346
|
+
finally {
|
|
1347
|
+
try {
|
|
1348
|
+
if (runArray_1_1 && !runArray_1_1.done && (_b = runArray_1.return)) _b.call(runArray_1);
|
|
1349
|
+
}
|
|
1350
|
+
finally { if (e_14) throw e_14.error; }
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
|
1355
|
+
finally {
|
|
1356
|
+
try {
|
|
1357
|
+
if (paragraphArray_1_1 && !paragraphArray_1_1.done && (_a = paragraphArray_1.return)) _a.call(paragraphArray_1);
|
|
1358
|
+
}
|
|
1359
|
+
finally { if (e_13) throw e_13.error; }
|
|
1360
|
+
}
|
|
1361
|
+
if (fragments.length > 0) {
|
|
1362
|
+
return fragments.join("");
|
|
1363
|
+
}
|
|
1364
|
+
return undefined;
|
|
1365
|
+
}
|
|
1366
|
+
function normalizeHexColor(value) {
|
|
1367
|
+
if (!value)
|
|
1368
|
+
return undefined;
|
|
1369
|
+
var trimmed = value.toString().trim().replace(/^#/, "");
|
|
1370
|
+
if (!trimmed)
|
|
1371
|
+
return undefined;
|
|
1372
|
+
var sanitized = trimmed.replace(/[^0-9a-fA-F]/g, "").toUpperCase();
|
|
1373
|
+
if (sanitized.length === 6) {
|
|
1374
|
+
return "#".concat(sanitized);
|
|
1375
|
+
}
|
|
1376
|
+
if (sanitized.length === 8) {
|
|
1377
|
+
return "#".concat(sanitized.slice(-6));
|
|
1378
|
+
}
|
|
1379
|
+
return undefined;
|
|
1380
|
+
}
|
|
1381
|
+
function extractSeriesColorInfo(ser) {
|
|
1382
|
+
var e_15, _a, e_16, _b;
|
|
1383
|
+
var _c, _d, _e, _f;
|
|
1384
|
+
var result = {};
|
|
1385
|
+
// <a:noFill/> on the series shape properties — transparent series.
|
|
1386
|
+
// OOXML can express this as the singleton element with no children;
|
|
1387
|
+
// the absence of a:solidFill / a:gradFill is also a signal but
|
|
1388
|
+
// brittler. fast-xml-parser emits `noFill: ""` or `noFill: {}` for
|
|
1389
|
+
// empty elements — both falsy by-value but truthy by-presence.
|
|
1390
|
+
var noFillFill = (_c = get(ser, "c:spPr.a:noFill")) !== null && _c !== void 0 ? _c : get(ser, "spPr.a:noFill");
|
|
1391
|
+
if (noFillFill !== undefined) {
|
|
1392
|
+
result.noFill = true;
|
|
1393
|
+
}
|
|
1394
|
+
// Try the full <a:solidFill> shape first — handles both srgbClr
|
|
1395
|
+
// and schemeClr (with lumMod/lumOff/shade/tint/alpha modifiers).
|
|
1396
|
+
var solidFillNode = (_d = get(ser, "c:spPr.a:solidFill")) !== null && _d !== void 0 ? _d : get(ser, "spPr.a:solidFill");
|
|
1397
|
+
var resolvedFill = resolveDrawingColor(solidFillNode);
|
|
1398
|
+
// Extract main color - check both fill color (for bar/column) and line color (for line/area charts)
|
|
1399
|
+
var fillColorValue = getWithFallback(ser, [
|
|
1400
|
+
"c:spPr.a:solidFill.a:srgbClr.a$.val",
|
|
1401
|
+
"c:spPr.a:solidFill.a:srgbClr.a$.t$",
|
|
1402
|
+
"c:spPr.a:solidFill.a:srgbClr.a$.rgb",
|
|
1403
|
+
"c:spPr.solidFill.srgbClr.a$.val",
|
|
1404
|
+
"spPr.a:solidFill.a:srgbClr.a$.val",
|
|
1405
|
+
"spPr.solidFill.srgbClr.a$.val",
|
|
1406
|
+
]);
|
|
1407
|
+
// Line color for line/scatter/area charts
|
|
1408
|
+
var lineColorValue = getWithFallback(ser, [
|
|
1409
|
+
"c:spPr.a:ln.a:solidFill.a:srgbClr.a$.val",
|
|
1410
|
+
"c:spPr.a:ln.a:solidFill.a:srgbClr.a$.t$",
|
|
1411
|
+
"c:spPr.a:ln.a:solidFill.a:srgbClr.a$.rgb",
|
|
1412
|
+
"c:spPr.a:ln.solidFill.srgbClr.a$.val",
|
|
1413
|
+
"spPr.a:ln.a:solidFill.a:srgbClr.a$.val",
|
|
1414
|
+
"spPr.ln.solidFill.srgbClr.a$.val",
|
|
1415
|
+
]);
|
|
1416
|
+
// Use fill color if available, otherwise use line color.
|
|
1417
|
+
// resolvedFill handles schemeClr; the legacy normalize call handles
|
|
1418
|
+
// the explicit srgbClr path (kept as a fallback). When noFill is set
|
|
1419
|
+
// we leave `color` undefined — the renderer treats the series as
|
|
1420
|
+
// transparent.
|
|
1421
|
+
if (!result.noFill) {
|
|
1422
|
+
result.color =
|
|
1423
|
+
(_e = resolvedFill !== null && resolvedFill !== void 0 ? resolvedFill : normalizeHexColor(fillColorValue)) !== null && _e !== void 0 ? _e : normalizeHexColor(lineColorValue);
|
|
1424
|
+
}
|
|
1425
|
+
// Gradient fill — DrawingML `<a:gradFill>` inside `<c:spPr>`. Stops
|
|
1426
|
+
// come in EMU per-mille (0..100000); positions get normalized back
|
|
1427
|
+
// to 0..1 for our shape. Linear angle is in 60000ths of a degree;
|
|
1428
|
+
// path gradients carry insets via `<a:path><a:fillToRect/>`.
|
|
1429
|
+
var gradFill = getWithFallback(ser, [
|
|
1430
|
+
"c:spPr.a:gradFill",
|
|
1431
|
+
"spPr.a:gradFill",
|
|
1432
|
+
"c:spPr.gradFill",
|
|
1433
|
+
]);
|
|
1434
|
+
if (gradFill) {
|
|
1435
|
+
var rawStops = getWithFallback(gradFill, [
|
|
1436
|
+
"a:gsLst.a:gs",
|
|
1437
|
+
"gsLst.gs",
|
|
1438
|
+
]);
|
|
1439
|
+
var stopList = rawStops
|
|
1440
|
+
? Array.isArray(rawStops)
|
|
1441
|
+
? rawStops
|
|
1442
|
+
: [rawStops]
|
|
1443
|
+
: [];
|
|
1444
|
+
var stops = [];
|
|
1445
|
+
try {
|
|
1446
|
+
for (var stopList_1 = __values(stopList), stopList_1_1 = stopList_1.next(); !stopList_1_1.done; stopList_1_1 = stopList_1.next()) {
|
|
1447
|
+
var stop_1 = stopList_1_1.value;
|
|
1448
|
+
var posRaw = (_f = stop_1 === null || stop_1 === void 0 ? void 0 : stop_1.a$) === null || _f === void 0 ? void 0 : _f.pos;
|
|
1449
|
+
var position = posRaw != null
|
|
1450
|
+
? Math.max(0, Math.min(1, parseFloat(posRaw) / 100000))
|
|
1451
|
+
: NaN;
|
|
1452
|
+
if (!Number.isFinite(position))
|
|
1453
|
+
continue;
|
|
1454
|
+
var hex = getWithFallback(stop_1, [
|
|
1455
|
+
"a:srgbClr.a$.val",
|
|
1456
|
+
"srgbClr.a$.val",
|
|
1457
|
+
]);
|
|
1458
|
+
var color = normalizeHexColor(hex);
|
|
1459
|
+
if (!color)
|
|
1460
|
+
continue;
|
|
1461
|
+
stops.push({ position: position, color: color });
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
|
1465
|
+
finally {
|
|
1466
|
+
try {
|
|
1467
|
+
if (stopList_1_1 && !stopList_1_1.done && (_a = stopList_1.return)) _a.call(stopList_1);
|
|
1468
|
+
}
|
|
1469
|
+
finally { if (e_15) throw e_15.error; }
|
|
1470
|
+
}
|
|
1471
|
+
if (stops.length > 0) {
|
|
1472
|
+
stops.sort(function (a, b) { return a.position - b.position; });
|
|
1473
|
+
var lin = getWithFallback(gradFill, ["a:lin.a$", "lin.a$"]);
|
|
1474
|
+
var path = getWithFallback(gradFill, ["a:path", "path"]);
|
|
1475
|
+
if (path) {
|
|
1476
|
+
var insets = getWithFallback(path, [
|
|
1477
|
+
"a:fillToRect.a$",
|
|
1478
|
+
"fillToRect.a$",
|
|
1479
|
+
]);
|
|
1480
|
+
var emuToFraction = function (v) {
|
|
1481
|
+
if (v == null)
|
|
1482
|
+
return undefined;
|
|
1483
|
+
var n = parseFloat(v);
|
|
1484
|
+
return Number.isFinite(n) ? n / 100000 : undefined;
|
|
1485
|
+
};
|
|
1486
|
+
result.gradient = {
|
|
1487
|
+
type: "path",
|
|
1488
|
+
left: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.l),
|
|
1489
|
+
right: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.r),
|
|
1490
|
+
top: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.t),
|
|
1491
|
+
bottom: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.b),
|
|
1492
|
+
stops: stops,
|
|
1493
|
+
};
|
|
1494
|
+
}
|
|
1495
|
+
else {
|
|
1496
|
+
var ang = (lin === null || lin === void 0 ? void 0 : lin.ang) != null ? parseFloat(lin.ang) : 0;
|
|
1497
|
+
result.gradient = {
|
|
1498
|
+
type: "linear",
|
|
1499
|
+
degree: Number.isFinite(ang) ? ang / 60000 : 0,
|
|
1500
|
+
stops: stops,
|
|
1501
|
+
};
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
// Extract invertIfNegative flag
|
|
1506
|
+
var invertIfNegativeVal = getWithFallback(ser, [
|
|
1507
|
+
"c:invertIfNegative.a$.val",
|
|
1508
|
+
"c:invertIfNegative.t$",
|
|
1509
|
+
"c:invertIfNegative",
|
|
1510
|
+
"invertIfNegative.a$.val",
|
|
1511
|
+
"invertIfNegative",
|
|
1512
|
+
]);
|
|
1513
|
+
// Value can be "1", "true", true, or 1
|
|
1514
|
+
if (invertIfNegativeVal !== undefined) {
|
|
1515
|
+
result.invertIfNegative =
|
|
1516
|
+
invertIfNegativeVal === "1" ||
|
|
1517
|
+
invertIfNegativeVal === true ||
|
|
1518
|
+
invertIfNegativeVal === 1 ||
|
|
1519
|
+
invertIfNegativeVal === "true";
|
|
1520
|
+
}
|
|
1521
|
+
// Extract negative fill color from extLst (Excel 2010+ format)
|
|
1522
|
+
// The negative color is stored in c:extLst.c:ext with specific URI
|
|
1523
|
+
var extLst = getWithFallback(ser, [
|
|
1524
|
+
"c:extLst.c:ext",
|
|
1525
|
+
"c:extLst",
|
|
1526
|
+
"extLst.ext",
|
|
1527
|
+
"extLst",
|
|
1528
|
+
]);
|
|
1529
|
+
if (extLst) {
|
|
1530
|
+
var extArray = Array.isArray(extLst) ? extLst : [extLst];
|
|
1531
|
+
try {
|
|
1532
|
+
for (var extArray_1 = __values(extArray), extArray_1_1 = extArray_1.next(); !extArray_1_1.done; extArray_1_1 = extArray_1.next()) {
|
|
1533
|
+
var ext = extArray_1_1.value;
|
|
1534
|
+
// Look for invertSolidFillFmt extension (negative fill format)
|
|
1535
|
+
var negFillColor = getWithFallback(ext, [
|
|
1536
|
+
"c14:invertSolidFillFmt.c14:spPr.a:solidFill.a:srgbClr.a$.val",
|
|
1537
|
+
"c14:invertSolidFillFmt.c14:spPr.a:solidFill.a:srgbClr.a$.rgb",
|
|
1538
|
+
"invertSolidFillFmt.spPr.solidFill.srgbClr.a$.val",
|
|
1539
|
+
// Also check for c15 namespace (Excel 2013+)
|
|
1540
|
+
"c15:invertSolidFillFmt.c15:spPr.a:solidFill.a:srgbClr.a$.val",
|
|
1541
|
+
]);
|
|
1542
|
+
if (negFillColor) {
|
|
1543
|
+
result.negativeColor = normalizeHexColor(negFillColor);
|
|
1544
|
+
// If we have a negative color, invertIfNegative should be true
|
|
1545
|
+
if (result.negativeColor) {
|
|
1546
|
+
result.invertIfNegative = true;
|
|
1547
|
+
}
|
|
1548
|
+
break;
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
1553
|
+
finally {
|
|
1554
|
+
try {
|
|
1555
|
+
if (extArray_1_1 && !extArray_1_1.done && (_b = extArray_1.return)) _b.call(extArray_1);
|
|
1556
|
+
}
|
|
1557
|
+
finally { if (e_16) throw e_16.error; }
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
return result;
|
|
1561
|
+
}
|
|
1562
|
+
export function extractChartDomains(plotArea, chartType, sheetId, resolveSheetId) {
|
|
1563
|
+
var e_17, _a, e_18, _b, e_19, _c, e_20, _d;
|
|
1564
|
+
var _e, _f;
|
|
1565
|
+
var domains = [];
|
|
1566
|
+
try {
|
|
1567
|
+
// Search all chart type containers for domains. For XY charts the
|
|
1568
|
+
// "domain" is the X values (c:xVal); for everything else it's the
|
|
1569
|
+
// category axis (c:cat). Per-container loop covers combo charts.
|
|
1570
|
+
for (var CHART_TYPE_CONTAINERS_2 = __values(CHART_TYPE_CONTAINERS), CHART_TYPE_CONTAINERS_2_1 = CHART_TYPE_CONTAINERS_2.next(); !CHART_TYPE_CONTAINERS_2_1.done; CHART_TYPE_CONTAINERS_2_1 = CHART_TYPE_CONTAINERS_2.next()) {
|
|
1571
|
+
var container = CHART_TYPE_CONTAINERS_2_1.value;
|
|
1572
|
+
var chartElement = getWithFallback(plotArea, container.paths);
|
|
1573
|
+
if (!chartElement)
|
|
1574
|
+
continue;
|
|
1575
|
+
var chartElements = Array.isArray(chartElement)
|
|
1576
|
+
? chartElement
|
|
1577
|
+
: [chartElement];
|
|
1578
|
+
try {
|
|
1579
|
+
for (var chartElements_2 = (e_18 = void 0, __values(chartElements)), chartElements_2_1 = chartElements_2.next(); !chartElements_2_1.done; chartElements_2_1 = chartElements_2.next()) {
|
|
1580
|
+
var singleChartElement = chartElements_2_1.value;
|
|
1581
|
+
var seriesElements_1 = getWithFallback(singleChartElement, [
|
|
1582
|
+
"c:ser",
|
|
1583
|
+
"ser",
|
|
1584
|
+
]);
|
|
1585
|
+
if (!seriesElements_1)
|
|
1586
|
+
continue;
|
|
1587
|
+
var seriesArray = Array.isArray(seriesElements_1)
|
|
1588
|
+
? seriesElements_1
|
|
1589
|
+
: [seriesElements_1];
|
|
1590
|
+
try {
|
|
1591
|
+
for (var seriesArray_2 = (e_19 = void 0, __values(seriesArray)), seriesArray_2_1 = seriesArray_2.next(); !seriesArray_2_1.done; seriesArray_2_1 = seriesArray_2.next()) {
|
|
1592
|
+
var ser = seriesArray_2_1.value;
|
|
1593
|
+
var domainRef = container.isXY
|
|
1594
|
+
? getWithFallback(ser, X_VAL_REF_PATHS)
|
|
1595
|
+
: getWithFallback(ser, CAT_REF_PATHS);
|
|
1596
|
+
if (domainRef) {
|
|
1597
|
+
var sources = resolveSourcesFromRef(domainRef, sheetId, resolveSheetId);
|
|
1598
|
+
if (sources.length) {
|
|
1599
|
+
domains.push({ sources: sources });
|
|
1600
|
+
// XY charts may carry per-series domains that differ — keep
|
|
1601
|
+
// the first one we encounter for the dataRange anchor, but
|
|
1602
|
+
// continue collecting so the renderer has a per-series X
|
|
1603
|
+
// when it needs one. For non-XY, first-found is enough.
|
|
1604
|
+
if (!container.isXY)
|
|
1605
|
+
return domains;
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
else if (!container.isXY) {
|
|
1609
|
+
// No cell ref — check for an inline `<c:strLit>`/`<c:numLit>`
|
|
1610
|
+
// category list (e.g. `["Estimated", "Actual"]` embedded
|
|
1611
|
+
// directly in the chart XML). Same for the series val side,
|
|
1612
|
+
// but domains is by far the most common case.
|
|
1613
|
+
var catNode = (_e = get(ser, "c:cat")) !== null && _e !== void 0 ? _e : get(ser, "cat");
|
|
1614
|
+
var inlineValues = extractInlineValues(catNode);
|
|
1615
|
+
if (inlineValues && inlineValues.length) {
|
|
1616
|
+
domains.push({ sources: [], inlineValues: inlineValues });
|
|
1617
|
+
return domains;
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
catch (e_19_1) { e_19 = { error: e_19_1 }; }
|
|
1623
|
+
finally {
|
|
1624
|
+
try {
|
|
1625
|
+
if (seriesArray_2_1 && !seriesArray_2_1.done && (_c = seriesArray_2.return)) _c.call(seriesArray_2);
|
|
1626
|
+
}
|
|
1627
|
+
finally { if (e_19) throw e_19.error; }
|
|
1628
|
+
}
|
|
1629
|
+
if (domains.length && container.isXY)
|
|
1630
|
+
return domains;
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
catch (e_18_1) { e_18 = { error: e_18_1 }; }
|
|
1634
|
+
finally {
|
|
1635
|
+
try {
|
|
1636
|
+
if (chartElements_2_1 && !chartElements_2_1.done && (_b = chartElements_2.return)) _b.call(chartElements_2);
|
|
1637
|
+
}
|
|
1638
|
+
finally { if (e_18) throw e_18.error; }
|
|
1639
|
+
}
|
|
1640
|
+
}
|
|
1641
|
+
}
|
|
1642
|
+
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
1643
|
+
finally {
|
|
1644
|
+
try {
|
|
1645
|
+
if (CHART_TYPE_CONTAINERS_2_1 && !CHART_TYPE_CONTAINERS_2_1.done && (_a = CHART_TYPE_CONTAINERS_2.return)) _a.call(CHART_TYPE_CONTAINERS_2);
|
|
1646
|
+
}
|
|
1647
|
+
finally { if (e_17) throw e_17.error; }
|
|
1648
|
+
}
|
|
1649
|
+
// Fallback for chart types not in CHART_TYPE_CONTAINERS
|
|
1650
|
+
// (pie/doughnut/radar/stock/ofPie/scatter/bubble outside combos).
|
|
1651
|
+
var seriesElements = getSeriesElements(plotArea, chartType);
|
|
1652
|
+
if (seriesElements) {
|
|
1653
|
+
var seriesArray = Array.isArray(seriesElements)
|
|
1654
|
+
? seriesElements
|
|
1655
|
+
: [seriesElements];
|
|
1656
|
+
try {
|
|
1657
|
+
for (var seriesArray_3 = __values(seriesArray), seriesArray_3_1 = seriesArray_3.next(); !seriesArray_3_1.done; seriesArray_3_1 = seriesArray_3.next()) {
|
|
1658
|
+
var ser = seriesArray_3_1.value;
|
|
1659
|
+
var domainRef = isXYChart(chartType)
|
|
1660
|
+
? getWithFallback(ser, X_VAL_REF_PATHS)
|
|
1661
|
+
: getWithFallback(ser, CAT_REF_PATHS);
|
|
1662
|
+
if (domainRef) {
|
|
1663
|
+
var sources = resolveSourcesFromRef(domainRef, sheetId, resolveSheetId);
|
|
1664
|
+
if (sources.length) {
|
|
1665
|
+
domains.push({ sources: sources });
|
|
1666
|
+
if (!isXYChart(chartType))
|
|
1667
|
+
break;
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
else if (!isXYChart(chartType)) {
|
|
1671
|
+
var catNode = (_f = get(ser, "c:cat")) !== null && _f !== void 0 ? _f : get(ser, "cat");
|
|
1672
|
+
var inlineValues = extractInlineValues(catNode);
|
|
1673
|
+
if (inlineValues && inlineValues.length) {
|
|
1674
|
+
domains.push({ sources: [], inlineValues: inlineValues });
|
|
1675
|
+
break;
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
catch (e_20_1) { e_20 = { error: e_20_1 }; }
|
|
1681
|
+
finally {
|
|
1682
|
+
try {
|
|
1683
|
+
if (seriesArray_3_1 && !seriesArray_3_1.done && (_d = seriesArray_3.return)) _d.call(seriesArray_3);
|
|
1684
|
+
}
|
|
1685
|
+
finally { if (e_20) throw e_20.error; }
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
return domains;
|
|
1689
|
+
}
|
|
1690
|
+
/**
|
|
1691
|
+
* Bubble charts have a third dimension — bubble size — referenced
|
|
1692
|
+
* via `<c:bubbleSize><c:numRef><c:f>` on each series. Returns one
|
|
1693
|
+
* `ChartData` entry per series (matches the shape used by `domains` /
|
|
1694
|
+
* `series`).
|
|
1695
|
+
*/
|
|
1696
|
+
export function extractChartBubbleSizes(plotArea, sheetId, resolveSheetId) {
|
|
1697
|
+
var e_21, _a;
|
|
1698
|
+
var sizes = [];
|
|
1699
|
+
var seriesElements = getSeriesElements(plotArea, "bubble");
|
|
1700
|
+
if (!seriesElements)
|
|
1701
|
+
return sizes;
|
|
1702
|
+
var seriesArray = Array.isArray(seriesElements)
|
|
1703
|
+
? seriesElements
|
|
1704
|
+
: [seriesElements];
|
|
1705
|
+
try {
|
|
1706
|
+
for (var seriesArray_4 = __values(seriesArray), seriesArray_4_1 = seriesArray_4.next(); !seriesArray_4_1.done; seriesArray_4_1 = seriesArray_4.next()) {
|
|
1707
|
+
var ser = seriesArray_4_1.value;
|
|
1708
|
+
var sizeRef = getWithFallback(ser, BUBBLE_SIZE_REF_PATHS);
|
|
1709
|
+
if (!sizeRef)
|
|
1710
|
+
continue;
|
|
1711
|
+
var sources = resolveSourcesFromRef(sizeRef, sheetId, resolveSheetId);
|
|
1712
|
+
if (sources.length)
|
|
1713
|
+
sizes.push({ sources: sources });
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
catch (e_21_1) { e_21 = { error: e_21_1 }; }
|
|
1717
|
+
finally {
|
|
1718
|
+
try {
|
|
1719
|
+
if (seriesArray_4_1 && !seriesArray_4_1.done && (_a = seriesArray_4.return)) _a.call(seriesArray_4);
|
|
1720
|
+
}
|
|
1721
|
+
finally { if (e_21) throw e_21.error; }
|
|
1722
|
+
}
|
|
1723
|
+
return sizes;
|
|
1724
|
+
}
|
|
1725
|
+
export function extractChartPosition(anchor, sheetId, sheetDimensions) {
|
|
1726
|
+
var _a, _b, _c, _d, _e, _f;
|
|
1727
|
+
try {
|
|
1728
|
+
// Handle oneCellAnchor
|
|
1729
|
+
var oneCellFrom = (_a = getWithFallback(anchor, ["xdr:from", "from"])) !== null && _a !== void 0 ? _a : undefined;
|
|
1730
|
+
var hasTwoCellTarget = getWithFallback(anchor, ["xdr:to", "to"]) !== undefined;
|
|
1731
|
+
if (oneCellFrom && !hasTwoCellTarget) {
|
|
1732
|
+
var extNode = getWithFallback(anchor, ["xdr:ext", "ext"]);
|
|
1733
|
+
var extAttributes = (extNode && ((_b = extNode.a$) !== null && _b !== void 0 ? _b : extNode)) || undefined;
|
|
1734
|
+
var col = toInt(getWithFallback(oneCellFrom, ["xdr:col", "col"]));
|
|
1735
|
+
var row = toInt(getWithFallback(oneCellFrom, ["xdr:row", "row"]));
|
|
1736
|
+
var colOff = toInt(getWithFallback(oneCellFrom, ["xdr:colOff", "colOff"]));
|
|
1737
|
+
var rowOff = toInt(getWithFallback(oneCellFrom, ["xdr:rowOff", "rowOff"]));
|
|
1738
|
+
// Convert EMU to pixels (1 EMU = 1/9525 pixels)
|
|
1739
|
+
var width = extAttributes && extAttributes.cx
|
|
1740
|
+
? Math.round(parseInt(String(extAttributes.cx), 10) / 9525)
|
|
1741
|
+
: 400;
|
|
1742
|
+
var height = extAttributes && extAttributes.cy
|
|
1743
|
+
? Math.round(parseInt(String(extAttributes.cy), 10) / 9525)
|
|
1744
|
+
: 300;
|
|
1745
|
+
return {
|
|
1746
|
+
sheetId: sheetId,
|
|
1747
|
+
overlayPosition: {
|
|
1748
|
+
anchorCell: {
|
|
1749
|
+
rowIndex: row + 1,
|
|
1750
|
+
columnIndex: col + 1,
|
|
1751
|
+
},
|
|
1752
|
+
offsetXPixels: Math.round(colOff / 9525),
|
|
1753
|
+
offsetYPixels: Math.round(rowOff / 9525),
|
|
1754
|
+
widthPixels: width,
|
|
1755
|
+
heightPixels: height,
|
|
1756
|
+
},
|
|
1757
|
+
};
|
|
1758
|
+
}
|
|
1759
|
+
// Handle twoCellAnchor
|
|
1760
|
+
var fromCell = (_c = getWithFallback(anchor, ["xdr:from", "from"])) !== null && _c !== void 0 ? _c : undefined;
|
|
1761
|
+
var toCell = (_d = getWithFallback(anchor, ["xdr:to", "to"])) !== null && _d !== void 0 ? _d : undefined;
|
|
1762
|
+
if (fromCell && toCell) {
|
|
1763
|
+
var col = toInt(getWithFallback(fromCell, ["xdr:col", "col"]));
|
|
1764
|
+
var row = toInt(getWithFallback(fromCell, ["xdr:row", "row"]));
|
|
1765
|
+
var colOff = toInt(getWithFallback(fromCell, ["xdr:colOff", "colOff"]));
|
|
1766
|
+
var rowOff = toInt(getWithFallback(fromCell, ["xdr:rowOff", "rowOff"]));
|
|
1767
|
+
var toCol = toInt(getWithFallback(toCell, ["xdr:col", "col"]));
|
|
1768
|
+
var toRow = toInt(getWithFallback(toCell, ["xdr:row", "row"]));
|
|
1769
|
+
var toColOff = toInt(getWithFallback(toCell, ["xdr:colOff", "colOff"]));
|
|
1770
|
+
var toRowOff = toInt(getWithFallback(toCell, ["xdr:rowOff", "rowOff"]));
|
|
1771
|
+
// Default cell dimensions in pixels
|
|
1772
|
+
var DEFAULT_COL_WIDTH_PX_1 = (_e = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.defaultColumnWidth) !== null && _e !== void 0 ? _e : 64;
|
|
1773
|
+
var DEFAULT_ROW_HEIGHT_PX_1 = (_f = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.defaultRowHeight) !== null && _f !== void 0 ? _f : 20;
|
|
1774
|
+
// Helper to get column width in pixels
|
|
1775
|
+
var getColWidth = function (colIndex) {
|
|
1776
|
+
var _a, _b;
|
|
1777
|
+
return ((_b = (_a = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.columnWidths) === null || _a === void 0 ? void 0 : _a.get(colIndex + 1)) !== null && _b !== void 0 ? _b : DEFAULT_COL_WIDTH_PX_1);
|
|
1778
|
+
};
|
|
1779
|
+
// Helper to get row height in pixels
|
|
1780
|
+
var getRowHeight = function (rowIndex) {
|
|
1781
|
+
var _a, _b;
|
|
1782
|
+
return ((_b = (_a = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.rowHeights) === null || _a === void 0 ? void 0 : _a.get(rowIndex + 1)) !== null && _b !== void 0 ? _b : DEFAULT_ROW_HEIGHT_PX_1);
|
|
1783
|
+
};
|
|
1784
|
+
// Calculate width by summing actual column widths
|
|
1785
|
+
var widthPx = 0;
|
|
1786
|
+
for (var c = col; c < toCol; c++) {
|
|
1787
|
+
widthPx += getColWidth(c);
|
|
1788
|
+
}
|
|
1789
|
+
// Subtract offset into first cell, add offset into last cell
|
|
1790
|
+
// Offsets are in EMUs, convert to pixels
|
|
1791
|
+
widthPx -= Math.round(colOff / 9525);
|
|
1792
|
+
widthPx += Math.round(toColOff / 9525);
|
|
1793
|
+
// Calculate height by summing actual row heights
|
|
1794
|
+
var heightPx = 0;
|
|
1795
|
+
for (var r = row; r < toRow; r++) {
|
|
1796
|
+
heightPx += getRowHeight(r);
|
|
1797
|
+
}
|
|
1798
|
+
// Subtract offset into first cell, add offset into last cell
|
|
1799
|
+
heightPx -= Math.round(rowOff / 9525);
|
|
1800
|
+
heightPx += Math.round(toRowOff / 9525);
|
|
1801
|
+
var width = Math.max(widthPx, 100);
|
|
1802
|
+
var height = Math.max(heightPx, 100);
|
|
1803
|
+
return {
|
|
1804
|
+
sheetId: sheetId,
|
|
1805
|
+
overlayPosition: {
|
|
1806
|
+
anchorCell: {
|
|
1807
|
+
rowIndex: row + 1,
|
|
1808
|
+
columnIndex: col + 1,
|
|
1809
|
+
},
|
|
1810
|
+
offsetXPixels: Math.round(colOff / 9525),
|
|
1811
|
+
offsetYPixels: Math.round(rowOff / 9525),
|
|
1812
|
+
widthPixels: width,
|
|
1813
|
+
heightPixels: height,
|
|
1814
|
+
},
|
|
1815
|
+
};
|
|
1816
|
+
}
|
|
1817
|
+
return null;
|
|
1818
|
+
}
|
|
1819
|
+
catch (err) {
|
|
1820
|
+
console.log("Error extracting chart position:", err);
|
|
1821
|
+
return null;
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
// -------------------------- Phase 5 helpers --------------------------
|
|
1825
|
+
// Read OOXML legend (<c:legend>), data labels (<c:dLbls>), and axis
|
|
1826
|
+
// formatting (<c:valAx>, <c:catAx>) elements into the engine's ChartSpec
|
|
1827
|
+
// shape. All helpers return `undefined` when nothing meaningful is set,
|
|
1828
|
+
// so callers can spread the result without polluting the spec.
|
|
1829
|
+
var readBoolean = function (val) {
|
|
1830
|
+
if (val === undefined || val === null)
|
|
1831
|
+
return undefined;
|
|
1832
|
+
return val === "1" || val === "true" || val === true;
|
|
1833
|
+
};
|
|
1834
|
+
var readNumber = function (val) {
|
|
1835
|
+
if (val === undefined || val === null)
|
|
1836
|
+
return undefined;
|
|
1837
|
+
var n = typeof val === "number" ? val : parseFloat(String(val));
|
|
1838
|
+
return Number.isFinite(n) ? n : undefined;
|
|
1839
|
+
};
|
|
1840
|
+
var mapLegendPosition = function (val) {
|
|
1841
|
+
switch (val) {
|
|
1842
|
+
case "t":
|
|
1843
|
+
return "top";
|
|
1844
|
+
case "b":
|
|
1845
|
+
return "bottom";
|
|
1846
|
+
case "l":
|
|
1847
|
+
return "left";
|
|
1848
|
+
case "r":
|
|
1849
|
+
return "right";
|
|
1850
|
+
case "tr":
|
|
1851
|
+
return "topRight";
|
|
1852
|
+
default:
|
|
1853
|
+
return undefined;
|
|
1854
|
+
}
|
|
1855
|
+
};
|
|
1856
|
+
function extractLegendOptions(chart) {
|
|
1857
|
+
var _a, _b, _c;
|
|
1858
|
+
// OOXML omits <c:legend> when the chart hides the legend, but
|
|
1859
|
+
// includes it (possibly empty) when the legend is shown. Some
|
|
1860
|
+
// writers add a child <c:delete val="1"/> instead — handle that too.
|
|
1861
|
+
var legend = getWithFallback(chart, ["c:legend", "legend"]);
|
|
1862
|
+
if (legend === undefined) {
|
|
1863
|
+
// Excel's default is "show". We only emit a `legend` field when the
|
|
1864
|
+
// source explicitly suppressed it, otherwise renderers fall back.
|
|
1865
|
+
return undefined;
|
|
1866
|
+
}
|
|
1867
|
+
var deleted = readBoolean((_a = get(legend, "c:delete.a$.val")) !== null && _a !== void 0 ? _a : get(legend, "delete.a$.val"));
|
|
1868
|
+
if (deleted) {
|
|
1869
|
+
return { position: "none" };
|
|
1870
|
+
}
|
|
1871
|
+
var posVal = (_b = get(legend, "c:legendPos.a$.val")) !== null && _b !== void 0 ? _b : get(legend, "legendPos.a$.val");
|
|
1872
|
+
var position = mapLegendPosition(posVal);
|
|
1873
|
+
var textFormat = extractTextProperties((_c = get(legend, "c:txPr")) !== null && _c !== void 0 ? _c : get(legend, "txPr"));
|
|
1874
|
+
if (!position && !textFormat)
|
|
1875
|
+
return undefined;
|
|
1876
|
+
return __assign(__assign({}, (position ? { position: position } : {})), (textFormat ? { textFormat: textFormat } : {}));
|
|
1877
|
+
}
|
|
1878
|
+
var mapDataLabelPosition = function (val) {
|
|
1879
|
+
switch (val) {
|
|
1880
|
+
case "ctr":
|
|
1881
|
+
return "center";
|
|
1882
|
+
case "inEnd":
|
|
1883
|
+
return "insideEnd";
|
|
1884
|
+
case "inBase":
|
|
1885
|
+
return "inside";
|
|
1886
|
+
case "outEnd":
|
|
1887
|
+
return "outsideEnd";
|
|
1888
|
+
case "bestFit":
|
|
1889
|
+
return "bestFit";
|
|
1890
|
+
default:
|
|
1891
|
+
return undefined;
|
|
1892
|
+
}
|
|
1893
|
+
};
|
|
1894
|
+
function extractDataLabelsOptions(plotArea, chartType) {
|
|
1895
|
+
var e_22, _a;
|
|
1896
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
1897
|
+
// Look for <c:dLbls> inside the chartType-specific container. We pick
|
|
1898
|
+
// the first one we find — chart-level labels apply to all series.
|
|
1899
|
+
var containerKeys = {
|
|
1900
|
+
bar: ["c:barChart", "barChart"],
|
|
1901
|
+
column: ["c:barChart", "barChart"],
|
|
1902
|
+
line: ["c:lineChart", "lineChart"],
|
|
1903
|
+
pie: ["c:pieChart", "pieChart", "c:ofPieChart", "ofPieChart"],
|
|
1904
|
+
doughnut: ["c:doughnutChart", "doughnutChart"],
|
|
1905
|
+
area: ["c:areaChart", "areaChart"],
|
|
1906
|
+
};
|
|
1907
|
+
var keys = (_b = containerKeys[chartType]) !== null && _b !== void 0 ? _b : [];
|
|
1908
|
+
var container;
|
|
1909
|
+
try {
|
|
1910
|
+
for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
|
|
1911
|
+
var key = keys_1_1.value;
|
|
1912
|
+
container = container !== null && container !== void 0 ? container : get(plotArea, key);
|
|
1913
|
+
}
|
|
1914
|
+
}
|
|
1915
|
+
catch (e_22_1) { e_22 = { error: e_22_1 }; }
|
|
1916
|
+
finally {
|
|
1917
|
+
try {
|
|
1918
|
+
if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
|
|
1919
|
+
}
|
|
1920
|
+
finally { if (e_22) throw e_22.error; }
|
|
1921
|
+
}
|
|
1922
|
+
var dLbls = (_e = (_d = (_c = get(container, "c:dLbls")) !== null && _c !== void 0 ? _c : get(container, "dLbls")) !== null && _d !== void 0 ? _d : get(plotArea, "c:dLbls")) !== null && _e !== void 0 ? _e : get(plotArea, "dLbls");
|
|
1923
|
+
if (!dLbls)
|
|
1924
|
+
return undefined;
|
|
1925
|
+
var result = {};
|
|
1926
|
+
var pos = (_f = get(dLbls, "c:dLblPos.a$.val")) !== null && _f !== void 0 ? _f : get(dLbls, "dLblPos.a$.val");
|
|
1927
|
+
var position = mapDataLabelPosition(pos);
|
|
1928
|
+
if (position)
|
|
1929
|
+
result.position = position;
|
|
1930
|
+
var showVal = readBoolean((_g = get(dLbls, "c:showVal.a$.val")) !== null && _g !== void 0 ? _g : get(dLbls, "showVal.a$.val"));
|
|
1931
|
+
if (showVal) {
|
|
1932
|
+
result.show = true;
|
|
1933
|
+
result.showValue = true;
|
|
1934
|
+
}
|
|
1935
|
+
var showCat = readBoolean((_h = get(dLbls, "c:showCatName.a$.val")) !== null && _h !== void 0 ? _h : get(dLbls, "showCatName.a$.val"));
|
|
1936
|
+
if (showCat) {
|
|
1937
|
+
result.show = true;
|
|
1938
|
+
result.showCategoryName = true;
|
|
1939
|
+
}
|
|
1940
|
+
var showPct = readBoolean((_j = get(dLbls, "c:showPercent.a$.val")) !== null && _j !== void 0 ? _j : get(dLbls, "showPercent.a$.val"));
|
|
1941
|
+
if (showPct) {
|
|
1942
|
+
result.show = true;
|
|
1943
|
+
result.showPercent = true;
|
|
1944
|
+
}
|
|
1945
|
+
var showSer = readBoolean((_k = get(dLbls, "c:showSerName.a$.val")) !== null && _k !== void 0 ? _k : get(dLbls, "showSerName.a$.val"));
|
|
1946
|
+
if (showSer) {
|
|
1947
|
+
result.show = true;
|
|
1948
|
+
result.showSeriesName = true;
|
|
1949
|
+
}
|
|
1950
|
+
// If only `position` was set with no `show*` flags, treat as "show".
|
|
1951
|
+
if (position && result.show === undefined)
|
|
1952
|
+
result.show = true;
|
|
1953
|
+
// <c:txPr> on the dLbls block — affects every label in the chart.
|
|
1954
|
+
var textFormat = extractTextProperties((_l = get(dLbls, "c:txPr")) !== null && _l !== void 0 ? _l : get(dLbls, "txPr"));
|
|
1955
|
+
if (textFormat)
|
|
1956
|
+
result.textFormat = textFormat;
|
|
1957
|
+
// <c:numFmt formatCode="…"/> — Excel uses this to render labels as
|
|
1958
|
+
// currency / percent / etc. (`"$"#,##0`, `0.00%`). Without parsing
|
|
1959
|
+
// this, the renderer falls back to raw numbers (e.g. `1831` instead
|
|
1960
|
+
// of `$1,831`).
|
|
1961
|
+
var numFmt = (_p = (_o = (_m = get(dLbls, "c:numFmt.a$.formatCode")) !== null && _m !== void 0 ? _m : get(dLbls, "numFmt.a$.formatCode")) !== null && _o !== void 0 ? _o : get(dLbls, "c:numFmt.a$.t$")) !== null && _p !== void 0 ? _p : get(dLbls, "numFmt.a$.t$");
|
|
1962
|
+
if (typeof numFmt === "string" && numFmt) {
|
|
1963
|
+
result.numberFormatPattern = numFmt;
|
|
1964
|
+
}
|
|
1965
|
+
return Object.keys(result).length ? result : undefined;
|
|
1966
|
+
}
|
|
1967
|
+
function readAxis(axis) {
|
|
1968
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
1969
|
+
if (!axis)
|
|
1970
|
+
return undefined;
|
|
1971
|
+
var result = {};
|
|
1972
|
+
// <c:scaling><c:logBase val="…"/> + <c:orientation val="minMax|maxMin"/>
|
|
1973
|
+
var logBase = readNumber((_a = get(axis, "c:scaling.c:logBase.a$.val")) !== null && _a !== void 0 ? _a : get(axis, "scaling.logBase.a$.val"));
|
|
1974
|
+
if (typeof logBase === "number" && logBase > 0)
|
|
1975
|
+
result.logarithmic = true;
|
|
1976
|
+
var orientation = (_b = get(axis, "c:scaling.c:orientation.a$.val")) !== null && _b !== void 0 ? _b : get(axis, "scaling.orientation.a$.val");
|
|
1977
|
+
if (orientation === "maxMin")
|
|
1978
|
+
result.reverse = true;
|
|
1979
|
+
var min = readNumber((_c = get(axis, "c:scaling.c:min.a$.val")) !== null && _c !== void 0 ? _c : get(axis, "scaling.min.a$.val"));
|
|
1980
|
+
if (typeof min === "number")
|
|
1981
|
+
result.min = min;
|
|
1982
|
+
var max = readNumber((_d = get(axis, "c:scaling.c:max.a$.val")) !== null && _d !== void 0 ? _d : get(axis, "scaling.max.a$.val"));
|
|
1983
|
+
if (typeof max === "number")
|
|
1984
|
+
result.max = max;
|
|
1985
|
+
// <c:delete val="1"/> hides the axis entirely.
|
|
1986
|
+
var deleted = readBoolean((_e = get(axis, "c:delete.a$.val")) !== null && _e !== void 0 ? _e : get(axis, "delete.a$.val"));
|
|
1987
|
+
if (deleted)
|
|
1988
|
+
result.visible = false;
|
|
1989
|
+
// <c:majorGridlines/> presence == show. Empty element is sufficient.
|
|
1990
|
+
var majorGridlines = (_f = get(axis, "c:majorGridlines")) !== null && _f !== void 0 ? _f : get(axis, "majorGridlines");
|
|
1991
|
+
if (majorGridlines !== undefined)
|
|
1992
|
+
result.showMajorGridlines = true;
|
|
1993
|
+
// <c:txPr> — axis tick-label font/color. Without this we'd inherit
|
|
1994
|
+
// the renderer's theme default (near-black) and lose the authored
|
|
1995
|
+
// color (e.g. BEP.xlsx X axis = #14325A, Y axis = #F0621C).
|
|
1996
|
+
var textFormat = extractTextProperties((_g = get(axis, "c:txPr")) !== null && _g !== void 0 ? _g : get(axis, "txPr"));
|
|
1997
|
+
if (textFormat)
|
|
1998
|
+
result.textFormat = textFormat;
|
|
1999
|
+
return Object.keys(result).length ? result : undefined;
|
|
2000
|
+
}
|
|
2001
|
+
export function extractAxisOptions(plotArea) {
|
|
2002
|
+
var _a, _b, _c, _d;
|
|
2003
|
+
var valAx = (_a = get(plotArea, "c:valAx")) !== null && _a !== void 0 ? _a : get(plotArea, "valAx");
|
|
2004
|
+
var catAx = (_b = get(plotArea, "c:catAx")) !== null && _b !== void 0 ? _b : get(plotArea, "catAx");
|
|
2005
|
+
// Some chart types use <c:dateAx>; treat as category for our purposes.
|
|
2006
|
+
var dateAx = (_c = get(plotArea, "c:dateAx")) !== null && _c !== void 0 ? _c : get(plotArea, "dateAx");
|
|
2007
|
+
var valAxes = Array.isArray(valAx) ? valAx : valAx ? [valAx] : [];
|
|
2008
|
+
return {
|
|
2009
|
+
valueAxisOptions: readAxis(valAxes[0]),
|
|
2010
|
+
secondaryValueAxisOptions: valAxes.length > 1 ? readAxis(valAxes[1]) : undefined,
|
|
2011
|
+
categoryAxisOptions: readAxis((_d = (Array.isArray(catAx) ? catAx[0] : catAx)) !== null && _d !== void 0 ? _d : (Array.isArray(dateAx) ? dateAx[0] : dateAx)),
|
|
2012
|
+
};
|
|
2013
|
+
}
|
|
2014
|
+
/**
|
|
2015
|
+
* Pie-of-pie / bar-of-pie — extract the of-pie layout fields from
|
|
2016
|
+
* `<c:ofPieChart>`. Returns undefined for plain pies. `splitType`
|
|
2017
|
+
* maps the OOXML tokens (`pos`/`val`/`percent`) to the spec vocabulary;
|
|
2018
|
+
* `auto` and `cust` (custom point assignment, carried in `<c:custSplit>`
|
|
2019
|
+
* which the spec cannot represent) are omitted so the renderer applies
|
|
2020
|
+
* Excel's default rule (position, last 3 values).
|
|
2021
|
+
*/
|
|
2022
|
+
export function extractOfPieOptions(plotArea) {
|
|
2023
|
+
var _a, _b, _c, _d;
|
|
2024
|
+
var ofPie = getWithFallback(plotArea, ["c:ofPieChart", "ofPieChart"]);
|
|
2025
|
+
if (!ofPie)
|
|
2026
|
+
return undefined;
|
|
2027
|
+
var typeRaw = (_a = get(ofPie, "c:ofPieType.a$.val")) !== null && _a !== void 0 ? _a : get(ofPie, "ofPieType.a$.val");
|
|
2028
|
+
var ofPieType = typeRaw === "bar" ? "bar" : "pie";
|
|
2029
|
+
var splitRaw = (_b = get(ofPie, "c:splitType.a$.val")) !== null && _b !== void 0 ? _b : get(ofPie, "splitType.a$.val");
|
|
2030
|
+
var splitType = splitRaw === "pos"
|
|
2031
|
+
? "position"
|
|
2032
|
+
: splitRaw === "val"
|
|
2033
|
+
? "value"
|
|
2034
|
+
: splitRaw === "percent"
|
|
2035
|
+
? "percent"
|
|
2036
|
+
: undefined;
|
|
2037
|
+
var splitPos = readNumber((_c = get(ofPie, "c:splitPos.a$.val")) !== null && _c !== void 0 ? _c : get(ofPie, "splitPos.a$.val"));
|
|
2038
|
+
var secondPieSize = readNumber((_d = get(ofPie, "c:secondPieSize.a$.val")) !== null && _d !== void 0 ? _d : get(ofPie, "secondPieSize.a$.val"));
|
|
2039
|
+
return __assign(__assign(__assign({ ofPieType: ofPieType }, (splitType ? { splitType: splitType } : {})), (typeof splitPos === "number" ? { splitPos: splitPos } : {})), (typeof secondPieSize === "number" ? { secondPieSize: secondPieSize } : {}));
|
|
2040
|
+
}
|
|
2041
|
+
function extractDoughnutHoleSize(plotArea) {
|
|
2042
|
+
var _a;
|
|
2043
|
+
// <c:doughnutChart><c:holeSize val="50"/> — value is the inner radius
|
|
2044
|
+
// as a percentage of the chart radius (0-90). We normalize to a 0-1
|
|
2045
|
+
// fraction so renderers can use it without knowing the spec.
|
|
2046
|
+
var holeSize = readNumber((_a = get(plotArea, "c:doughnutChart.c:holeSize.a$.val")) !== null && _a !== void 0 ? _a : get(plotArea, "doughnutChart.holeSize.a$.val"));
|
|
2047
|
+
if (typeof holeSize !== "number")
|
|
2048
|
+
return undefined;
|
|
2049
|
+
return Math.min(0.9, Math.max(0, holeSize / 100));
|
|
2050
|
+
}
|
|
2051
|
+
// -------------------------- Phase 5.2 helpers --------------------------
|
|
2052
|
+
var mapTrendlineType = function (val) {
|
|
2053
|
+
switch (val) {
|
|
2054
|
+
case "exp":
|
|
2055
|
+
return "exp";
|
|
2056
|
+
case "log":
|
|
2057
|
+
return "log";
|
|
2058
|
+
case "poly":
|
|
2059
|
+
return "poly";
|
|
2060
|
+
case "power":
|
|
2061
|
+
return "power";
|
|
2062
|
+
case "movingAvg":
|
|
2063
|
+
return "movingAvg";
|
|
2064
|
+
case "linear":
|
|
2065
|
+
default:
|
|
2066
|
+
return "linear";
|
|
2067
|
+
}
|
|
2068
|
+
};
|
|
2069
|
+
function extractTrendlines(ser) {
|
|
2070
|
+
var e_23, _a;
|
|
2071
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
2072
|
+
// <c:trendline> can appear multiple times under a single series; the
|
|
2073
|
+
// parser may surface either an array or a single object.
|
|
2074
|
+
var raw = (_b = get(ser, "c:trendline")) !== null && _b !== void 0 ? _b : get(ser, "trendline");
|
|
2075
|
+
if (!raw)
|
|
2076
|
+
return undefined;
|
|
2077
|
+
var list = Array.isArray(raw) ? raw : [raw];
|
|
2078
|
+
var results = [];
|
|
2079
|
+
try {
|
|
2080
|
+
for (var list_2 = __values(list), list_2_1 = list_2.next(); !list_2_1.done; list_2_1 = list_2.next()) {
|
|
2081
|
+
var t = list_2_1.value;
|
|
2082
|
+
var type = mapTrendlineType((_c = get(t, "c:trendlineType.a$.val")) !== null && _c !== void 0 ? _c : get(t, "trendlineType.a$.val"));
|
|
2083
|
+
var order = readNumber((_d = get(t, "c:order.a$.val")) !== null && _d !== void 0 ? _d : get(t, "order.a$.val"));
|
|
2084
|
+
var period = readNumber((_e = get(t, "c:period.a$.val")) !== null && _e !== void 0 ? _e : get(t, "period.a$.val"));
|
|
2085
|
+
var name_1 = (_h = (_g = (_f = get(t, "c:name.t$")) !== null && _f !== void 0 ? _f : get(t, "name.t$")) !== null && _g !== void 0 ? _g : get(t, "c:name")) !== null && _h !== void 0 ? _h : get(t, "name");
|
|
2086
|
+
var showEquation = readBoolean((_j = get(t, "c:dispEq.a$.val")) !== null && _j !== void 0 ? _j : get(t, "dispEq.a$.val"));
|
|
2087
|
+
var showRSquared = readBoolean((_k = get(t, "c:dispRSqr.a$.val")) !== null && _k !== void 0 ? _k : get(t, "dispRSqr.a$.val"));
|
|
2088
|
+
var forecastForward = readNumber((_l = get(t, "c:forward.a$.val")) !== null && _l !== void 0 ? _l : get(t, "forward.a$.val"));
|
|
2089
|
+
var forecastBackward = readNumber((_m = get(t, "c:backward.a$.val")) !== null && _m !== void 0 ? _m : get(t, "backward.a$.val"));
|
|
2090
|
+
var entry = { type: type };
|
|
2091
|
+
if (typeof order === "number")
|
|
2092
|
+
entry.order = order;
|
|
2093
|
+
if (typeof period === "number")
|
|
2094
|
+
entry.period = period;
|
|
2095
|
+
if (typeof name_1 === "string" && name_1)
|
|
2096
|
+
entry.name = name_1;
|
|
2097
|
+
if (showEquation)
|
|
2098
|
+
entry.showEquation = true;
|
|
2099
|
+
if (showRSquared)
|
|
2100
|
+
entry.showRSquared = true;
|
|
2101
|
+
if (typeof forecastForward === "number")
|
|
2102
|
+
entry.forecastForward = forecastForward;
|
|
2103
|
+
if (typeof forecastBackward === "number")
|
|
2104
|
+
entry.forecastBackward = forecastBackward;
|
|
2105
|
+
results.push(entry);
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
catch (e_23_1) { e_23 = { error: e_23_1 }; }
|
|
2109
|
+
finally {
|
|
2110
|
+
try {
|
|
2111
|
+
if (list_2_1 && !list_2_1.done && (_a = list_2.return)) _a.call(list_2);
|
|
2112
|
+
}
|
|
2113
|
+
finally { if (e_23) throw e_23.error; }
|
|
2114
|
+
}
|
|
2115
|
+
return results;
|
|
2116
|
+
}
|
|
2117
|
+
function extractErrorBars(ser, hostSheetId, resolveSheetId) {
|
|
2118
|
+
var _a, _b, _c, _d, _e, _f;
|
|
2119
|
+
var raw = (_a = get(ser, "c:errBars")) !== null && _a !== void 0 ? _a : get(ser, "errBars");
|
|
2120
|
+
if (!raw)
|
|
2121
|
+
return undefined;
|
|
2122
|
+
var direction = (_b = get(raw, "c:errDir.a$.val")) !== null && _b !== void 0 ? _b : get(raw, "errDir.a$.val");
|
|
2123
|
+
var barType = (_c = get(raw, "c:errBarType.a$.val")) !== null && _c !== void 0 ? _c : get(raw, "errBarType.a$.val");
|
|
2124
|
+
var valTypeVal = (_d = get(raw, "c:errValType.a$.val")) !== null && _d !== void 0 ? _d : get(raw, "errValType.a$.val");
|
|
2125
|
+
var value = readNumber((_e = get(raw, "c:val.a$.val")) !== null && _e !== void 0 ? _e : get(raw, "val.a$.val"));
|
|
2126
|
+
var noEndCap = readBoolean((_f = get(raw, "c:noEndCap.a$.val")) !== null && _f !== void 0 ? _f : get(raw, "noEndCap.a$.val"));
|
|
2127
|
+
var result = {};
|
|
2128
|
+
if (direction === "x" || direction === "y")
|
|
2129
|
+
result.direction = direction;
|
|
2130
|
+
if (barType === "both" || barType === "plus" || barType === "minus") {
|
|
2131
|
+
result.barType = barType;
|
|
2132
|
+
}
|
|
2133
|
+
if (valTypeVal === "fixedVal" ||
|
|
2134
|
+
valTypeVal === "percentage" ||
|
|
2135
|
+
valTypeVal === "stdDev" ||
|
|
2136
|
+
valTypeVal === "stdErr" ||
|
|
2137
|
+
valTypeVal === "cust") {
|
|
2138
|
+
result.valueType = valTypeVal === "cust" ? "custom" : valTypeVal;
|
|
2139
|
+
}
|
|
2140
|
+
if (typeof value === "number")
|
|
2141
|
+
result.value = value;
|
|
2142
|
+
if (noEndCap)
|
|
2143
|
+
result.noEndCap = true;
|
|
2144
|
+
// Custom error bars carry per-point magnitudes in worksheet ranges —
|
|
2145
|
+
// `<c:plus>/<c:minus>` each hold a `<c:numRef><c:f>` reference.
|
|
2146
|
+
if (result.valueType === "custom") {
|
|
2147
|
+
var plusRef = getWithFallback(raw, [
|
|
2148
|
+
"c:plus.c:numRef.c:f",
|
|
2149
|
+
"c:plus.c:numRef.c:f.t$",
|
|
2150
|
+
"plus.numRef.f",
|
|
2151
|
+
"plus.numRef.f.t$",
|
|
2152
|
+
]);
|
|
2153
|
+
var minusRef = getWithFallback(raw, [
|
|
2154
|
+
"c:minus.c:numRef.c:f",
|
|
2155
|
+
"c:minus.c:numRef.c:f.t$",
|
|
2156
|
+
"minus.numRef.f",
|
|
2157
|
+
"minus.numRef.f.t$",
|
|
2158
|
+
]);
|
|
2159
|
+
if (plusRef) {
|
|
2160
|
+
var plusSources = resolveSourcesFromRef(plusRef, hostSheetId, resolveSheetId);
|
|
2161
|
+
if (plusSources.length)
|
|
2162
|
+
result.plusRange = plusSources[0];
|
|
2163
|
+
}
|
|
2164
|
+
if (minusRef) {
|
|
2165
|
+
var minusSources = resolveSourcesFromRef(minusRef, hostSheetId, resolveSheetId);
|
|
2166
|
+
if (minusSources.length)
|
|
2167
|
+
result.minusRange = minusSources[0];
|
|
2168
|
+
}
|
|
2169
|
+
}
|
|
2170
|
+
return Object.keys(result).length ? result : undefined;
|
|
2171
|
+
}
|
|
2172
|
+
function extractRadarStyle(plotArea) {
|
|
2173
|
+
var _a;
|
|
2174
|
+
var val = (_a = get(plotArea, "c:radarChart.c:radarStyle.a$.val")) !== null && _a !== void 0 ? _a : get(plotArea, "radarChart.radarStyle.a$.val");
|
|
2175
|
+
if (val === "standard" || val === "marker" || val === "filled")
|
|
2176
|
+
return val;
|
|
2177
|
+
return undefined;
|
|
2178
|
+
}
|