@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,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Power Query part re-emission — the export half of the parser's `getPowerQuery()` preservation,
|
|
3
|
+
* and the JS mirror of the Rust engine's `rnc-export` `inject_power_query` pass (same rules, same
|
|
4
|
+
* envelope shape).
|
|
5
|
+
*
|
|
6
|
+
* Runs as a post-pass over the exporter's assembled `files` map (just before zipping):
|
|
7
|
+
*
|
|
8
|
+
* - `customXml/item{N}.xml` (the `<DataMashup>` blob) + `customXml/itemProps{N}.xml` + the item's
|
|
9
|
+
* rels, related from `xl/workbook.xml`.
|
|
10
|
+
* - `xl/connections.xml`, verbatim.
|
|
11
|
+
* - `xl/queryTables/queryTable{N}.xml`, re-attached to the regenerated table part when the exported
|
|
12
|
+
* table still matches the imported one (same `displayName`, same ordered column names): the table
|
|
13
|
+
* part gains `tableType="queryTable"`, its `<tableColumn>`s get their ORIGINAL ids back (the
|
|
14
|
+
* verbatim queryTable part references them) plus their `queryTableFieldId`s, and a
|
|
15
|
+
* table→queryTable rel is written. A table that was renamed or had columns
|
|
16
|
+
* added/removed/reordered degrades to a plain table (its queryTable part is dropped) while the
|
|
17
|
+
* query itself (DataMashup + connection) still round-trips — Excel's own
|
|
18
|
+
* connection-without-load-target state.
|
|
19
|
+
*/
|
|
20
|
+
import { hasPowerQueryParts, } from "../../power-query";
|
|
21
|
+
const CUSTOM_XML_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml";
|
|
22
|
+
const CUSTOM_XML_PROPS_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps";
|
|
23
|
+
const CONNECTIONS_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections";
|
|
24
|
+
const QUERY_TABLE_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/queryTable";
|
|
25
|
+
const CUSTOM_XML_PROPS_CT = "application/vnd.openxmlformats-officedocument.customXmlProperties+xml";
|
|
26
|
+
const CONNECTIONS_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml";
|
|
27
|
+
const QUERY_TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml";
|
|
28
|
+
const XML_DECLARATION = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>`;
|
|
29
|
+
const encoder = new TextEncoder();
|
|
30
|
+
const decoder = new TextDecoder();
|
|
31
|
+
/**
|
|
32
|
+
* Apply the preserved Power Query parts onto the exporter's `files` map (part name → bytes).
|
|
33
|
+
* No-op when the envelope is empty, keeping every other export byte-for-byte unchanged.
|
|
34
|
+
*/
|
|
35
|
+
export const applyPowerQueryParts = (files, powerQuery) => {
|
|
36
|
+
if (!hasPowerQueryParts(powerQuery)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const customXmlParts = powerQuery.customXmlParts ?? [];
|
|
40
|
+
const queryTables = powerQuery.queryTables ?? [];
|
|
41
|
+
// Re-attach queryTable parts to still-matching regenerated table parts.
|
|
42
|
+
const used = new Set();
|
|
43
|
+
let relinkedCount = 0;
|
|
44
|
+
const tableEntries = Object.keys(files)
|
|
45
|
+
.filter((name) => /^xl\/tables\/table\d+\.xml$/.test(name))
|
|
46
|
+
.sort((a, b) => Number(a.replace(/\D/g, "")) - Number(b.replace(/\D/g, "")));
|
|
47
|
+
for (const entryName of tableEntries) {
|
|
48
|
+
const xml = decoder.decode(files[entryName]);
|
|
49
|
+
const displayName = tagAttr(openTag(xml, "<table "), "displayName");
|
|
50
|
+
if (!displayName)
|
|
51
|
+
continue;
|
|
52
|
+
const wanted = unescapeXml(displayName);
|
|
53
|
+
const matchIndex = queryTables.findIndex((qt, i) => !used.has(i) &&
|
|
54
|
+
qt.tableTitle === wanted &&
|
|
55
|
+
columnsMatch(xml, qt) &&
|
|
56
|
+
qt.columns.every((c) => c.queryTableFieldId != null));
|
|
57
|
+
if (matchIndex === -1)
|
|
58
|
+
continue;
|
|
59
|
+
const qt = queryTables[matchIndex];
|
|
60
|
+
const patched = patchTableXml(xml, qt);
|
|
61
|
+
if (!patched)
|
|
62
|
+
continue;
|
|
63
|
+
used.add(matchIndex);
|
|
64
|
+
relinkedCount += 1;
|
|
65
|
+
files[entryName] = encoder.encode(patched);
|
|
66
|
+
files[`xl/queryTables/queryTable${relinkedCount}.xml`] = encoder.encode(qt.partXml);
|
|
67
|
+
// The exporter writes no rels for table parts, so this is always a fresh file.
|
|
68
|
+
const file = entryName.substring(entryName.lastIndexOf("/") + 1);
|
|
69
|
+
files[`xl/tables/_rels/${file}.rels`] = encoder.encode(`${XML_DECLARATION}<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">${relationship("rId1", QUERY_TABLE_REL_TYPE, `../queryTables/queryTable${relinkedCount}.xml`)}</Relationships>`);
|
|
70
|
+
}
|
|
71
|
+
// DataMashup customXml items (+ props + the item's rels).
|
|
72
|
+
customXmlParts.forEach((item, index) => {
|
|
73
|
+
const n = index + 1;
|
|
74
|
+
files[`customXml/item${n}.xml`] = encoder.encode(item.itemXml);
|
|
75
|
+
if (item.propsXml) {
|
|
76
|
+
files[`customXml/itemProps${n}.xml`] = encoder.encode(item.propsXml);
|
|
77
|
+
files[`customXml/_rels/item${n}.xml.rels`] = encoder.encode(`${XML_DECLARATION}<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">${relationship("rId1", CUSTOM_XML_PROPS_REL_TYPE, `itemProps${n}.xml`)}</Relationships>`);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
const writeConnections = Boolean(powerQuery.connectionsXml) && !files["xl/connections.xml"];
|
|
81
|
+
if (writeConnections) {
|
|
82
|
+
files["xl/connections.xml"] = encoder.encode(powerQuery.connectionsXml);
|
|
83
|
+
}
|
|
84
|
+
// Workbook rels: one customXml rel per DataMashup item + the connections rel.
|
|
85
|
+
if (customXmlParts.length || writeConnections) {
|
|
86
|
+
const relsKey = "xl/_rels/workbook.xml.rels";
|
|
87
|
+
const existing = files[relsKey] ? decoder.decode(files[relsKey]) : "";
|
|
88
|
+
const nextRelId = seededRelIdGen(existing);
|
|
89
|
+
let extra = "";
|
|
90
|
+
customXmlParts.forEach((_, index) => {
|
|
91
|
+
extra += relationship(nextRelId(), CUSTOM_XML_REL_TYPE, `../customXml/item${index + 1}.xml`);
|
|
92
|
+
});
|
|
93
|
+
if (writeConnections) {
|
|
94
|
+
extra += relationship(nextRelId(), CONNECTIONS_REL_TYPE, "connections.xml");
|
|
95
|
+
}
|
|
96
|
+
files[relsKey] = encoder.encode(existing.includes("</Relationships>")
|
|
97
|
+
? existing.replace("</Relationships>", `${extra}</Relationships>`)
|
|
98
|
+
: `${XML_DECLARATION}<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">${extra}</Relationships>`);
|
|
99
|
+
}
|
|
100
|
+
// Content types: itemProps / connections / queryTable overrides. `customXml/item{N}.xml` needs
|
|
101
|
+
// no Override — the exporter's `<Default Extension="xml">` covers it.
|
|
102
|
+
let ctExtra = "";
|
|
103
|
+
customXmlParts.forEach((item, index) => {
|
|
104
|
+
if (item.propsXml) {
|
|
105
|
+
ctExtra += `<Override PartName="/customXml/itemProps${index + 1}.xml" ContentType="${CUSTOM_XML_PROPS_CT}"/>`;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
if (writeConnections) {
|
|
109
|
+
ctExtra += `<Override PartName="/xl/connections.xml" ContentType="${CONNECTIONS_CT}"/>`;
|
|
110
|
+
}
|
|
111
|
+
for (let n = 1; n <= relinkedCount; n++) {
|
|
112
|
+
ctExtra += `<Override PartName="/xl/queryTables/queryTable${n}.xml" ContentType="${QUERY_TABLE_CT}"/>`;
|
|
113
|
+
}
|
|
114
|
+
if (ctExtra) {
|
|
115
|
+
const ctKey = "[Content_Types].xml";
|
|
116
|
+
const ct = files[ctKey] ? decoder.decode(files[ctKey]) : "";
|
|
117
|
+
if (ct.includes("</Types>")) {
|
|
118
|
+
files[ctKey] = encoder.encode(ct.replace("</Types>", `${ctExtra}</Types>`));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
/** `rId{N}` generator seeded past the highest id already present in a rels document. */
|
|
123
|
+
const seededRelIdGen = (relsXml) => {
|
|
124
|
+
let max = 0;
|
|
125
|
+
const matches = relsXml.matchAll(/Id="rId(\d+)"/g);
|
|
126
|
+
for (const match of matches) {
|
|
127
|
+
max = Math.max(max, Number(match[1]));
|
|
128
|
+
}
|
|
129
|
+
return () => `rId${++max}`;
|
|
130
|
+
};
|
|
131
|
+
const relationship = (id, type, target) => `<Relationship Id="${id}" Type="${type}" Target="${escapeXmlAttr(target)}"/>`;
|
|
132
|
+
/**
|
|
133
|
+
* Whether the generated table part's ordered `<tableColumn name=…>` list equals the preserved one.
|
|
134
|
+
*/
|
|
135
|
+
const columnsMatch = (tableXml, qt) => {
|
|
136
|
+
if (!qt.columns.length) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
const generated = columnNames(tableXml);
|
|
140
|
+
return (generated.length === qt.columns.length &&
|
|
141
|
+
generated.every((name, index) => name === qt.columns[index].name));
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* The ordered (unescaped) `name` attributes of every `<tableColumn>` open tag. The needle keeps its
|
|
145
|
+
* trailing space so the plural `<tableColumns count=…>` container never matches (a `<tableColumn>`
|
|
146
|
+
* always carries at least its required `id`/`name` attributes).
|
|
147
|
+
*/
|
|
148
|
+
const columnNames = (tableXml) => {
|
|
149
|
+
const names = [];
|
|
150
|
+
let rest = tableXml;
|
|
151
|
+
for (;;) {
|
|
152
|
+
const pos = rest.indexOf("<tableColumn ");
|
|
153
|
+
if (pos === -1)
|
|
154
|
+
break;
|
|
155
|
+
const tail = rest.substring(pos);
|
|
156
|
+
const end = tail.indexOf(">");
|
|
157
|
+
const tag = end === -1 ? tail : tail.substring(0, end);
|
|
158
|
+
const name = tagAttr(tag, "name");
|
|
159
|
+
if (name != null) {
|
|
160
|
+
names.push(unescapeXml(name));
|
|
161
|
+
}
|
|
162
|
+
rest = end === -1 ? "" : tail.substring(end);
|
|
163
|
+
}
|
|
164
|
+
return names;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Patch a matched table part: `tableType="queryTable"` on `<table>`, original ids +
|
|
168
|
+
* `queryTableFieldId`s on each `<tableColumn>` (the verbatim queryTable part references the
|
|
169
|
+
* original column ids). `undefined` when the XML doesn't have the expected shape (caller degrades
|
|
170
|
+
* to the plain table).
|
|
171
|
+
*/
|
|
172
|
+
const patchTableXml = (xml, qt) => {
|
|
173
|
+
const tableStart = xml.indexOf("<table ");
|
|
174
|
+
if (tableStart === -1)
|
|
175
|
+
return undefined;
|
|
176
|
+
const openEndRel = xml.substring(tableStart).indexOf(">");
|
|
177
|
+
if (openEndRel === -1)
|
|
178
|
+
return undefined;
|
|
179
|
+
const openTagText = xml.substring(tableStart, tableStart + openEndRel);
|
|
180
|
+
if (openTagText.includes("tableType="))
|
|
181
|
+
return undefined;
|
|
182
|
+
let out = `${xml.substring(0, tableStart + openEndRel)} tableType="queryTable"`;
|
|
183
|
+
let rest = xml.substring(tableStart + openEndRel);
|
|
184
|
+
for (const col of qt.columns) {
|
|
185
|
+
// Trailing space in the needle — see `columnNames`.
|
|
186
|
+
const pos = rest.indexOf("<tableColumn ");
|
|
187
|
+
if (pos === -1)
|
|
188
|
+
return undefined;
|
|
189
|
+
const before = rest.substring(0, pos);
|
|
190
|
+
const tail = rest.substring(pos);
|
|
191
|
+
const tagEndRel = tail.indexOf(">");
|
|
192
|
+
if (tagEndRel === -1)
|
|
193
|
+
return undefined;
|
|
194
|
+
let tag = tail.substring(0, tagEndRel);
|
|
195
|
+
const after = tail.substring(tagEndRel);
|
|
196
|
+
out += before;
|
|
197
|
+
if (unescapeXml(tagAttr(tag, "name") ?? "") !== col.name)
|
|
198
|
+
return undefined;
|
|
199
|
+
const fieldId = col.queryTableFieldId;
|
|
200
|
+
if (fieldId == null)
|
|
201
|
+
return undefined;
|
|
202
|
+
// The tag slice runs up to (not including) `>`, so a self-closing column ends with `/` — the
|
|
203
|
+
// new attribute must land BEFORE that slash.
|
|
204
|
+
const selfClose = tag.endsWith("/");
|
|
205
|
+
if (selfClose) {
|
|
206
|
+
tag = tag.substring(0, tag.length - 1);
|
|
207
|
+
}
|
|
208
|
+
const idStart = tag.indexOf(' id="');
|
|
209
|
+
if (idStart === -1)
|
|
210
|
+
return undefined;
|
|
211
|
+
const idValueStart = idStart + ' id="'.length;
|
|
212
|
+
const idValueEndRel = tag.substring(idValueStart).indexOf('"');
|
|
213
|
+
if (idValueEndRel === -1)
|
|
214
|
+
return undefined;
|
|
215
|
+
out +=
|
|
216
|
+
tag.substring(0, idValueStart) +
|
|
217
|
+
escapeXmlAttr(col.id) +
|
|
218
|
+
tag.substring(idValueStart + idValueEndRel) +
|
|
219
|
+
` queryTableFieldId="${escapeXmlAttr(fieldId)}"` +
|
|
220
|
+
(selfClose ? "/" : "");
|
|
221
|
+
rest = after;
|
|
222
|
+
}
|
|
223
|
+
out += rest;
|
|
224
|
+
return out;
|
|
225
|
+
};
|
|
226
|
+
/** The `<tag …` open-tag slice starting at the first occurrence of `prefix` (through its `>`). */
|
|
227
|
+
const openTag = (xml, prefix) => {
|
|
228
|
+
const start = xml.indexOf(prefix);
|
|
229
|
+
if (start === -1)
|
|
230
|
+
return "";
|
|
231
|
+
const rest = xml.substring(start);
|
|
232
|
+
const end = rest.indexOf(">");
|
|
233
|
+
return end === -1 ? rest : rest.substring(0, end);
|
|
234
|
+
};
|
|
235
|
+
/** Extract an attribute's raw (still-escaped) value from an open-tag slice. */
|
|
236
|
+
const tagAttr = (tag, name) => {
|
|
237
|
+
const needle = ` ${name}="`;
|
|
238
|
+
const start = tag.indexOf(needle);
|
|
239
|
+
if (start === -1)
|
|
240
|
+
return undefined;
|
|
241
|
+
const valueStart = start + needle.length;
|
|
242
|
+
const end = tag.substring(valueStart).indexOf('"');
|
|
243
|
+
return end === -1 ? undefined : tag.substring(valueStart, valueStart + end);
|
|
244
|
+
};
|
|
245
|
+
const escapeXmlAttr = (value) => value
|
|
246
|
+
.replace(/&/g, "&")
|
|
247
|
+
.replace(/</g, "<")
|
|
248
|
+
.replace(/>/g, ">")
|
|
249
|
+
.replace(/"/g, """)
|
|
250
|
+
.replace(/'/g, "'");
|
|
251
|
+
/** Reverse of {@link escapeXmlAttr} — `&` last so it can't re-expand entities. */
|
|
252
|
+
const unescapeXml = (value) => value
|
|
253
|
+
.replace(/</g, "<")
|
|
254
|
+
.replace(/>/g, ">")
|
|
255
|
+
.replace(/"/g, '"')
|
|
256
|
+
.replace(/'/g, "'")
|
|
257
|
+
.replace(/&/g, "&");
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Slicer, TableView } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
/**
|
|
3
|
+
* Build slicer cache XML for a table slicer
|
|
4
|
+
* Returns null for pivot slicers (not yet supported)
|
|
5
|
+
*/
|
|
6
|
+
export declare const buildSlicerCacheXml: (slicer: Slicer, tables: TableView[], cacheName: string) => string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Build slicer XML (visual definition)
|
|
9
|
+
*/
|
|
10
|
+
export declare const buildSlicerXml: (slicer: Slicer, cacheName: string) => string;
|
|
11
|
+
//# sourceMappingURL=slicer-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slicer-builder.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/slicer-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAanE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,MAAM,EACd,QAAQ,SAAS,EAAE,EACnB,WAAW,MAAM,KAChB,MAAM,GAAG,IAoDX,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,QAAQ,MAAM,EACd,WAAW,MAAM,KAChB,MA0BF,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { XMLBuilder } from "fast-xml-parser";
|
|
2
|
+
const XML_DECLARATION = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>`;
|
|
3
|
+
const slicerBuilder = new XMLBuilder({
|
|
4
|
+
ignoreAttributes: false,
|
|
5
|
+
attributesGroupName: "a$",
|
|
6
|
+
textNodeName: "t$",
|
|
7
|
+
suppressEmptyNode: true,
|
|
8
|
+
format: false,
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Build slicer cache XML for a table slicer
|
|
12
|
+
* Returns null for pivot slicers (not yet supported)
|
|
13
|
+
*/
|
|
14
|
+
export const buildSlicerCacheXml = (slicer, tables, cacheName) => {
|
|
15
|
+
if (slicer.spec.type !== "table") {
|
|
16
|
+
// Pivot table slicers not yet supported
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const { tableIds, columnIndex } = slicer.spec;
|
|
20
|
+
// Find the first related table
|
|
21
|
+
// Note: tableIds from slicer might be strings, but prepared tables have numeric ids
|
|
22
|
+
const relatedTable = tables.find((t) => tableIds.some((tid) => String(tid) === String(t.id)));
|
|
23
|
+
if (!relatedTable)
|
|
24
|
+
return null;
|
|
25
|
+
// Get column name from table
|
|
26
|
+
const columnName = relatedTable.columns?.[columnIndex]?.name || `Column${columnIndex + 1}`;
|
|
27
|
+
// Build the slicer cache definition
|
|
28
|
+
const cacheDefinition = {
|
|
29
|
+
"slicerCacheDefinition": {
|
|
30
|
+
"a$": {
|
|
31
|
+
"xmlns": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main",
|
|
32
|
+
"xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
|
33
|
+
"mc:Ignorable": "x xr10",
|
|
34
|
+
"xmlns:x": "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
|
|
35
|
+
"xmlns:xr10": "http://schemas.microsoft.com/office/spreadsheetml/2016/revision10",
|
|
36
|
+
"name": cacheName,
|
|
37
|
+
"sourceName": columnName,
|
|
38
|
+
},
|
|
39
|
+
"extLst": {
|
|
40
|
+
"x:ext": {
|
|
41
|
+
"a$": {
|
|
42
|
+
"uri": "{2F2917AC-EB37-4324-AD4E-5DD8C200BD13}",
|
|
43
|
+
"xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main",
|
|
44
|
+
},
|
|
45
|
+
"x15:tableSlicerCache": {
|
|
46
|
+
"a$": {
|
|
47
|
+
"tableId": relatedTable.id,
|
|
48
|
+
"column": columnIndex + 1, // 1-based
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const xml = slicerBuilder.build(cacheDefinition);
|
|
56
|
+
return `${XML_DECLARATION}\n${xml}`;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Build slicer XML (visual definition)
|
|
60
|
+
*/
|
|
61
|
+
export const buildSlicerXml = (slicer, cacheName) => {
|
|
62
|
+
const displayName = slicer.spec.title || "Slicer";
|
|
63
|
+
const slicerDefinition = {
|
|
64
|
+
"slicers": {
|
|
65
|
+
"a$": {
|
|
66
|
+
"xmlns": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main",
|
|
67
|
+
"xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
|
68
|
+
"mc:Ignorable": "x xr10",
|
|
69
|
+
"xmlns:x": "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
|
|
70
|
+
"xmlns:xr10": "http://schemas.microsoft.com/office/spreadsheetml/2016/revision10",
|
|
71
|
+
},
|
|
72
|
+
"slicer": {
|
|
73
|
+
"a$": {
|
|
74
|
+
"name": displayName,
|
|
75
|
+
"cache": cacheName,
|
|
76
|
+
"caption": displayName,
|
|
77
|
+
"rowHeight": "251883",
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const xml = slicerBuilder.build(slicerDefinition);
|
|
83
|
+
return `${XML_DECLARATION}\n${xml}`;
|
|
84
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { CellData, Sheet } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
export type SparklineAxisOptions = {
|
|
3
|
+
emptyCellsAs?: "gap" | "zero" | "span";
|
|
4
|
+
dateAxis?: boolean;
|
|
5
|
+
markers?: boolean;
|
|
6
|
+
high?: boolean;
|
|
7
|
+
low?: boolean;
|
|
8
|
+
first?: boolean;
|
|
9
|
+
last?: boolean;
|
|
10
|
+
negative?: boolean;
|
|
11
|
+
displayXAxis?: boolean;
|
|
12
|
+
displayHidden?: boolean;
|
|
13
|
+
rightToLeft?: boolean;
|
|
14
|
+
lineWeight?: number;
|
|
15
|
+
manualMax?: number;
|
|
16
|
+
manualMin?: number;
|
|
17
|
+
minAxisType?: "individual" | "group" | "custom";
|
|
18
|
+
maxAxisType?: "individual" | "group" | "custom";
|
|
19
|
+
colorHigh?: string;
|
|
20
|
+
colorLow?: string;
|
|
21
|
+
colorFirst?: string;
|
|
22
|
+
colorLast?: string;
|
|
23
|
+
colorMarkers?: string;
|
|
24
|
+
colorNegative?: string;
|
|
25
|
+
};
|
|
26
|
+
export type DetectedSparkline = {
|
|
27
|
+
targetCell: string;
|
|
28
|
+
dataRange: string;
|
|
29
|
+
type: "line" | "column" | "stacked";
|
|
30
|
+
color?: string;
|
|
31
|
+
rowIndex: number;
|
|
32
|
+
columnIndex: number;
|
|
33
|
+
} & SparklineAxisOptions;
|
|
34
|
+
/**
|
|
35
|
+
* Parse a SPARKLINE formula to extract data range and options
|
|
36
|
+
* Formula format: =SPARKLINE(A1:E1,{"charttype","column","color","#FF0000"})
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseSparklineFormula(formula: string, sheetName: string): ({
|
|
39
|
+
dataRange: string;
|
|
40
|
+
chartType: "line" | "column" | "stacked";
|
|
41
|
+
color?: string;
|
|
42
|
+
} & SparklineAxisOptions) | null;
|
|
43
|
+
/**
|
|
44
|
+
* Detect SPARKLINE formulas in a sheet and extract sparkline info
|
|
45
|
+
*/
|
|
46
|
+
export declare function detectSparklines(sheet: Sheet, rowData: Record<number, Record<number, CellData>>): DetectedSparkline[];
|
|
47
|
+
/**
|
|
48
|
+
* Build sparkline groups XML for worksheet extLst
|
|
49
|
+
* Returns null if no sparklines detected
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildSparklineGroupsXml(sheet: Sheet, rowData: Record<number, Record<number, CellData>>): string | null;
|
|
52
|
+
/**
|
|
53
|
+
* Build combined extLst for worksheet (sparklines + slicers)
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildWorksheetExtLst(sparklineExtXml: string | null, slicerExtXml: string | null): string;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a cell has a SPARKLINE formula and should NOT be exported as a formula
|
|
58
|
+
* (the formula will be converted to native Excel sparkline instead)
|
|
59
|
+
*/
|
|
60
|
+
export declare function isSparklineCell(cell: CellData | null | undefined): boolean;
|
|
61
|
+
//# sourceMappingURL=sparkline-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparkline-builder.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/sparkline-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAMjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,WAAW,CAAC,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAIhD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG;IAE9B,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEpC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,oBAAoB,CAAC;AAWzB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,oBAAoB,CAAC,GAAG,IAAI,CA+K/B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAChD,iBAAiB,EAAE,CAqCrB;AA6FD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAChD,MAAM,GAAG,IAAI,CAuGf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAM1E"}
|