@cj-tech-master/excelts 1.6.3 → 2.0.0-canary.20251228024848.8822305
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -24
- package/README_zh.md +140 -26
- package/dist/browser/excelts.esm.js +18529 -0
- package/dist/browser/excelts.esm.js.map +1 -0
- package/dist/browser/excelts.esm.min.js +128 -0
- package/dist/browser/excelts.iife.js +12966 -46944
- package/dist/browser/excelts.iife.js.map +1 -1
- package/dist/browser/excelts.iife.min.js +36 -115
- package/dist/cjs/csv/csv-core.js +701 -0
- package/dist/cjs/csv/csv-stream.js +646 -0
- package/dist/cjs/csv/csv.base.js +137 -0
- package/dist/cjs/csv/csv.browser.js +68 -0
- package/dist/cjs/csv/csv.js +218 -162
- package/dist/cjs/doc/anchor.js +2 -2
- package/dist/cjs/doc/cell.js +22 -22
- package/dist/cjs/doc/column.js +28 -7
- package/dist/cjs/doc/data-validations.js +3 -3
- package/dist/cjs/doc/defined-names.js +13 -13
- package/dist/cjs/doc/image.js +7 -7
- package/dist/cjs/doc/modelcontainer.js +2 -2
- package/dist/cjs/doc/note.js +2 -2
- package/dist/cjs/doc/pivot-table.js +5 -5
- package/dist/cjs/doc/range.js +11 -11
- package/dist/cjs/doc/row.js +16 -16
- package/dist/cjs/doc/table.js +5 -5
- package/dist/cjs/doc/workbook.base.js +211 -0
- package/dist/cjs/doc/workbook.browser.js +62 -0
- package/dist/cjs/doc/workbook.js +68 -179
- package/dist/cjs/doc/worksheet.js +45 -41
- package/dist/cjs/index.js +49 -32
- package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
- package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
- package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
- package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
- package/dist/cjs/stream/xlsx/workbook-writer.js +38 -38
- package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
- package/dist/cjs/stream/xlsx/worksheet-writer.js +67 -60
- package/dist/cjs/utils/browser-buffer.js +75 -0
- package/dist/cjs/utils/cell-format.js +2 -2
- package/dist/cjs/utils/cell-matrix.js +5 -5
- package/dist/cjs/utils/datetime.js +499 -0
- package/dist/cjs/utils/encryptor.browser.js +240 -0
- package/dist/cjs/utils/parse-sax.js +1191 -13
- package/dist/cjs/utils/shared-formula.js +5 -5
- package/dist/cjs/utils/sheet-utils.js +13 -13
- package/dist/cjs/utils/stream-buf.browser.js +355 -0
- package/dist/cjs/utils/stream-buf.js +5 -5
- package/dist/cjs/utils/unzip/extract.js +11 -11
- package/dist/cjs/utils/unzip/index.js +21 -21
- package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
- package/dist/cjs/utils/unzip/parse.js +16 -16
- package/dist/cjs/utils/unzip/zip-parser.js +14 -3
- package/dist/cjs/utils/utils.base.js +161 -0
- package/dist/cjs/utils/utils.browser.js +89 -0
- package/dist/cjs/utils/utils.js +46 -154
- package/dist/cjs/utils/xml-stream.js +3 -3
- package/dist/cjs/utils/zip/compress.base.js +88 -0
- package/dist/cjs/utils/zip/compress.browser.js +127 -0
- package/dist/cjs/utils/zip/compress.js +18 -198
- package/dist/cjs/utils/zip/crc32.browser.js +88 -0
- package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
- package/dist/cjs/utils/zip/index.js +17 -17
- package/dist/cjs/utils/zip/streaming-zip.js +264 -0
- package/dist/cjs/utils/zip/zip-builder.js +10 -10
- package/dist/cjs/utils/zip-stream.browser.js +135 -0
- package/dist/cjs/utils/zip-stream.js +4 -4
- package/dist/cjs/xlsx/xform/base-xform.js +4 -4
- package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
- package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
- package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
- package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
- package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
- package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
- package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
- package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
- package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
- package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
- package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
- package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
- package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
- package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
- package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
- package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
- package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
- package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
- package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
- package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
- package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
- package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
- package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
- package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
- package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
- package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
- package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
- package/dist/cjs/xlsx/xform/list-xform.js +2 -2
- package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
- package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +13 -11
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
- package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +101 -17
- package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
- package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
- package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
- package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
- package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
- package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
- package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
- package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
- package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
- package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
- package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +15 -3
- package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +15 -17
- package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
- package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
- package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
- package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
- package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +75 -70
- package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
- package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
- package/dist/cjs/xlsx/xform/static-xform.js +4 -4
- package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
- package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
- package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
- package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
- package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
- package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
- package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
- package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
- package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
- package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
- package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
- package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
- package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
- package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
- package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
- package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
- package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
- package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
- package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
- package/dist/cjs/xlsx/xlsx.base.js +742 -0
- package/dist/cjs/xlsx/xlsx.browser.js +162 -0
- package/dist/cjs/xlsx/xlsx.js +118 -892
- package/dist/esm/csv/csv-core.js +694 -0
- package/dist/esm/csv/csv-stream.js +638 -0
- package/dist/esm/csv/csv.base.js +127 -0
- package/dist/esm/csv/csv.browser.js +65 -0
- package/dist/esm/csv/csv.js +181 -159
- package/dist/esm/doc/column.js +21 -0
- package/dist/esm/doc/workbook.base.js +207 -0
- package/dist/esm/doc/workbook.browser.js +59 -0
- package/dist/esm/doc/workbook.js +64 -175
- package/dist/esm/doc/worksheet.js +4 -0
- package/dist/esm/index.browser.js +33 -1
- package/dist/esm/index.js +23 -8
- package/dist/esm/local.js +0 -1
- package/dist/esm/stream/xlsx/workbook-writer.js +1 -1
- package/dist/esm/stream/xlsx/worksheet-writer.js +8 -1
- package/dist/esm/utils/browser-buffer.js +67 -0
- package/dist/esm/utils/datetime.js +493 -0
- package/dist/esm/utils/encryptor.browser.js +237 -0
- package/dist/esm/utils/parse-sax.js +1188 -12
- package/dist/esm/utils/stream-buf.browser.js +352 -0
- package/dist/esm/utils/unzip/zip-parser.js +11 -0
- package/dist/esm/utils/utils.base.js +142 -0
- package/dist/esm/utils/utils.browser.js +68 -0
- package/dist/esm/utils/utils.js +15 -123
- package/dist/esm/utils/zip/compress.base.js +83 -0
- package/dist/esm/utils/zip/compress.browser.js +121 -0
- package/dist/esm/utils/zip/compress.js +16 -164
- package/dist/esm/utils/zip/crc32.browser.js +82 -0
- package/dist/esm/utils/zip/deflate-fallback.js +570 -0
- package/dist/esm/utils/zip/streaming-zip.js +259 -0
- package/dist/esm/utils/zip-stream.browser.js +132 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +3 -1
- package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +93 -9
- package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
- package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
- package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
- package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
- package/dist/esm/xlsx/xlsx.base.js +739 -0
- package/dist/esm/xlsx/xlsx.browser.js +159 -0
- package/dist/esm/xlsx/xlsx.js +114 -888
- package/dist/types/csv/csv-core.d.ts +201 -0
- package/dist/types/csv/csv-stream.d.ts +114 -0
- package/dist/types/csv/csv.base.d.ts +62 -0
- package/dist/types/csv/csv.browser.d.ts +33 -0
- package/dist/types/csv/csv.d.ts +97 -71
- package/dist/types/doc/anchor.d.ts +1 -1
- package/dist/types/doc/cell.d.ts +7 -7
- package/dist/types/doc/column.d.ts +9 -3
- package/dist/types/doc/defined-names.d.ts +4 -4
- package/dist/types/doc/image.d.ts +2 -2
- package/dist/types/doc/modelcontainer.d.ts +1 -1
- package/dist/types/doc/pivot-table.d.ts +1 -1
- package/dist/types/doc/range.d.ts +1 -1
- package/dist/types/doc/row.d.ts +3 -3
- package/dist/types/doc/table.d.ts +2 -2
- package/dist/types/doc/workbook.base.d.ts +111 -0
- package/dist/types/doc/workbook.browser.d.ts +38 -0
- package/dist/types/doc/workbook.d.ts +62 -92
- package/dist/types/doc/worksheet.d.ts +12 -10
- package/dist/types/index.browser.d.ts +19 -5
- package/dist/types/index.d.ts +24 -23
- package/dist/types/local.d.ts +0 -1
- package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
- package/dist/types/stream/xlsx/workbook-reader.d.ts +5 -5
- package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
- package/dist/types/stream/xlsx/worksheet-reader.d.ts +6 -6
- package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
- package/dist/types/types.d.ts +6 -0
- package/dist/types/utils/browser-buffer.d.ts +28 -0
- package/dist/types/utils/col-cache.d.ts +1 -1
- package/dist/types/utils/datetime.d.ts +56 -0
- package/dist/types/utils/encryptor.browser.d.ts +28 -0
- package/dist/types/utils/parse-sax.d.ts +108 -1
- package/dist/types/utils/sheet-utils.d.ts +3 -3
- package/dist/types/utils/stream-buf.browser.d.ts +41 -0
- package/dist/types/utils/unzip/extract.d.ts +6 -6
- package/dist/types/utils/unzip/index.d.ts +8 -8
- package/dist/types/utils/unzip/parse.d.ts +3 -3
- package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
- package/dist/types/utils/utils.base.d.ts +29 -0
- package/dist/types/utils/utils.browser.d.ts +29 -0
- package/dist/types/utils/utils.d.ts +6 -25
- package/dist/types/utils/zip/compress.base.d.ts +45 -0
- package/dist/types/utils/zip/compress.browser.d.ts +63 -0
- package/dist/types/utils/zip/compress.d.ts +13 -45
- package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
- package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
- package/dist/types/utils/zip/index.d.ts +5 -5
- package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
- package/dist/types/utils/zip/zip-builder.d.ts +1 -1
- package/dist/types/utils/zip-stream.browser.d.ts +39 -0
- package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
- package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
- package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
- package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
- package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
- package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
- package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
- package/dist/types/xlsx/xlsx.base.d.ts +134 -0
- package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
- package/dist/types/xlsx/xlsx.d.ts +20 -80
- package/package.json +16 -39
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming ZIP creator - fflate-compatible API
|
|
3
|
+
*
|
|
4
|
+
* This module provides a streaming ZIP API compatible with fflate's Zip/ZipDeflate,
|
|
5
|
+
* but uses native zlib compression for better performance.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```ts
|
|
9
|
+
* const zip = new StreamingZip((err, data, final) => {
|
|
10
|
+
* if (err) handleError(err);
|
|
11
|
+
* else {
|
|
12
|
+
* stream.write(data);
|
|
13
|
+
* if (final) stream.end();
|
|
14
|
+
* }
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* const file = new ZipDeflateFile("path/file.txt", { level: 6 });
|
|
18
|
+
* zip.add(file);
|
|
19
|
+
* file.push(data1);
|
|
20
|
+
* file.push(data2, true); // true = final chunk
|
|
21
|
+
*
|
|
22
|
+
* zip.end();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { crc32 } from "./crc32.js";
|
|
26
|
+
import { compressSync } from "./compress.js";
|
|
27
|
+
// ZIP signature constants
|
|
28
|
+
const LOCAL_FILE_HEADER_SIG = 0x04034b50;
|
|
29
|
+
const CENTRAL_DIR_HEADER_SIG = 0x02014b50;
|
|
30
|
+
const END_OF_CENTRAL_DIR_SIG = 0x06054b50;
|
|
31
|
+
// ZIP version constants
|
|
32
|
+
const VERSION_NEEDED = 20; // 2.0 - supports DEFLATE
|
|
33
|
+
const VERSION_MADE_BY = 20; // 2.0
|
|
34
|
+
// Compression methods
|
|
35
|
+
const COMPRESSION_STORE = 0;
|
|
36
|
+
const COMPRESSION_DEFLATE = 8;
|
|
37
|
+
const encoder = new TextEncoder();
|
|
38
|
+
/**
|
|
39
|
+
* Convert Date to DOS time format
|
|
40
|
+
*/
|
|
41
|
+
function dateToDos(date) {
|
|
42
|
+
const dosTime = ((date.getHours() & 0x1f) << 11) |
|
|
43
|
+
((date.getMinutes() & 0x3f) << 5) |
|
|
44
|
+
((date.getSeconds() >> 1) & 0x1f);
|
|
45
|
+
const dosDate = (((date.getFullYear() - 1980) & 0x7f) << 9) |
|
|
46
|
+
(((date.getMonth() + 1) & 0x0f) << 5) |
|
|
47
|
+
(date.getDate() & 0x1f);
|
|
48
|
+
return [dosTime, dosDate];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ZipDeflate-compatible file stream
|
|
52
|
+
* Collects data chunks, compresses on finalization
|
|
53
|
+
*/
|
|
54
|
+
export class ZipDeflateFile {
|
|
55
|
+
constructor(name, options) {
|
|
56
|
+
this.chunks = [];
|
|
57
|
+
this.totalSize = 0;
|
|
58
|
+
this.finalized = false;
|
|
59
|
+
this._ondata = null;
|
|
60
|
+
this.name = name;
|
|
61
|
+
this.level = options?.level ?? 6;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Set data callback (called by StreamingZip)
|
|
65
|
+
*/
|
|
66
|
+
set ondata(cb) {
|
|
67
|
+
this._ondata = cb;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Push data to the file
|
|
71
|
+
* @param data - Data chunk
|
|
72
|
+
* @param final - Whether this is the final chunk
|
|
73
|
+
*/
|
|
74
|
+
push(data, final = false) {
|
|
75
|
+
if (this.finalized) {
|
|
76
|
+
throw new Error("Cannot push to finalized ZipDeflateFile");
|
|
77
|
+
}
|
|
78
|
+
if (data.length > 0) {
|
|
79
|
+
this.chunks.push(data);
|
|
80
|
+
this.totalSize += data.length;
|
|
81
|
+
}
|
|
82
|
+
if (final) {
|
|
83
|
+
this.finalized = true;
|
|
84
|
+
this._flush();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Flush collected data through compression and emit
|
|
89
|
+
*/
|
|
90
|
+
_flush() {
|
|
91
|
+
if (!this._ondata) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Combine chunks
|
|
95
|
+
let uncompressed;
|
|
96
|
+
if (this.chunks.length === 0) {
|
|
97
|
+
uncompressed = new Uint8Array(0);
|
|
98
|
+
}
|
|
99
|
+
else if (this.chunks.length === 1) {
|
|
100
|
+
uncompressed = this.chunks[0];
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
uncompressed = new Uint8Array(this.totalSize);
|
|
104
|
+
let offset = 0;
|
|
105
|
+
for (const chunk of this.chunks) {
|
|
106
|
+
uncompressed.set(chunk, offset);
|
|
107
|
+
offset += chunk.length;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Compress if level > 0 and data is not empty
|
|
111
|
+
const shouldCompress = this.level > 0 && uncompressed.length > 0;
|
|
112
|
+
const compressed = shouldCompress
|
|
113
|
+
? compressSync(uncompressed, { level: this.level })
|
|
114
|
+
: uncompressed;
|
|
115
|
+
// Build local file header + data
|
|
116
|
+
const nameBytes = encoder.encode(this.name);
|
|
117
|
+
const crcValue = crc32(uncompressed);
|
|
118
|
+
const [dosTime, dosDate] = dateToDos(new Date());
|
|
119
|
+
// Local file header (30 bytes + filename)
|
|
120
|
+
const header = new Uint8Array(30 + nameBytes.length);
|
|
121
|
+
const view = new DataView(header.buffer);
|
|
122
|
+
view.setUint32(0, LOCAL_FILE_HEADER_SIG, true);
|
|
123
|
+
view.setUint16(4, VERSION_NEEDED, true);
|
|
124
|
+
view.setUint16(6, 0x0800, true); // UTF-8 flag
|
|
125
|
+
view.setUint16(8, shouldCompress ? COMPRESSION_DEFLATE : COMPRESSION_STORE, true);
|
|
126
|
+
view.setUint16(10, dosTime, true);
|
|
127
|
+
view.setUint16(12, dosDate, true);
|
|
128
|
+
view.setUint32(14, crcValue, true);
|
|
129
|
+
view.setUint32(18, compressed.length, true);
|
|
130
|
+
view.setUint32(22, uncompressed.length, true);
|
|
131
|
+
view.setUint16(26, nameBytes.length, true);
|
|
132
|
+
view.setUint16(28, 0, true); // Extra field length
|
|
133
|
+
header.set(nameBytes, 30);
|
|
134
|
+
// Store info for central directory BEFORE emitting data
|
|
135
|
+
// (StreamingZip reads this in the final callback)
|
|
136
|
+
this._entryInfo = {
|
|
137
|
+
name: nameBytes,
|
|
138
|
+
crc: crcValue,
|
|
139
|
+
compressedSize: compressed.length,
|
|
140
|
+
uncompressedSize: uncompressed.length,
|
|
141
|
+
compressionMethod: shouldCompress ? COMPRESSION_DEFLATE : COMPRESSION_STORE,
|
|
142
|
+
dosTime,
|
|
143
|
+
dosDate,
|
|
144
|
+
offset: -1 // Will be set by StreamingZip
|
|
145
|
+
};
|
|
146
|
+
// Emit header
|
|
147
|
+
this._ondata(header, false);
|
|
148
|
+
// Emit compressed data (final chunk)
|
|
149
|
+
this._ondata(compressed, true);
|
|
150
|
+
// Clear chunks for GC
|
|
151
|
+
this.chunks.length = 0;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get entry info (called by StreamingZip after finalization)
|
|
155
|
+
*/
|
|
156
|
+
getEntryInfo() {
|
|
157
|
+
return this._entryInfo || null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Streaming ZIP - fflate Zip-compatible API
|
|
162
|
+
* Creates ZIP files in a streaming manner
|
|
163
|
+
*/
|
|
164
|
+
export class StreamingZip {
|
|
165
|
+
/**
|
|
166
|
+
* Create a streaming ZIP
|
|
167
|
+
* @param callback - Called with (err, data, final) as data becomes available
|
|
168
|
+
*/
|
|
169
|
+
constructor(callback) {
|
|
170
|
+
this.entries = [];
|
|
171
|
+
this.currentOffset = 0;
|
|
172
|
+
this.ended = false;
|
|
173
|
+
this.callback = callback;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Add a file to the ZIP
|
|
177
|
+
* @param file - ZipDeflateFile instance
|
|
178
|
+
*/
|
|
179
|
+
add(file) {
|
|
180
|
+
if (this.ended) {
|
|
181
|
+
throw new Error("Cannot add files after calling end()");
|
|
182
|
+
}
|
|
183
|
+
// Capture offset when first data is written, not when add() is called
|
|
184
|
+
// This is important because streaming files may have data pushed later
|
|
185
|
+
let startOffset = -1;
|
|
186
|
+
file.ondata = (data, final) => {
|
|
187
|
+
// Capture offset on first data chunk
|
|
188
|
+
if (startOffset === -1) {
|
|
189
|
+
startOffset = this.currentOffset;
|
|
190
|
+
}
|
|
191
|
+
this.currentOffset += data.length;
|
|
192
|
+
this.callback(null, data, false);
|
|
193
|
+
if (final) {
|
|
194
|
+
// Get entry info and set offset
|
|
195
|
+
const entryInfo = file.getEntryInfo();
|
|
196
|
+
if (entryInfo) {
|
|
197
|
+
entryInfo.offset = startOffset;
|
|
198
|
+
this.entries.push(entryInfo);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Finalize the ZIP
|
|
205
|
+
* Writes central directory and end-of-central-directory record
|
|
206
|
+
*/
|
|
207
|
+
end() {
|
|
208
|
+
if (this.ended) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
this.ended = true;
|
|
212
|
+
const centralDirOffset = this.currentOffset;
|
|
213
|
+
const centralDirChunks = [];
|
|
214
|
+
// Build central directory headers
|
|
215
|
+
for (const entry of this.entries) {
|
|
216
|
+
const header = new Uint8Array(46 + entry.name.length);
|
|
217
|
+
const view = new DataView(header.buffer);
|
|
218
|
+
view.setUint32(0, CENTRAL_DIR_HEADER_SIG, true);
|
|
219
|
+
view.setUint16(4, VERSION_MADE_BY, true);
|
|
220
|
+
view.setUint16(6, VERSION_NEEDED, true);
|
|
221
|
+
view.setUint16(8, 0x0800, true); // UTF-8 flag
|
|
222
|
+
view.setUint16(10, entry.compressionMethod, true);
|
|
223
|
+
view.setUint16(12, entry.dosTime, true);
|
|
224
|
+
view.setUint16(14, entry.dosDate, true);
|
|
225
|
+
view.setUint32(16, entry.crc, true);
|
|
226
|
+
view.setUint32(20, entry.compressedSize, true);
|
|
227
|
+
view.setUint32(24, entry.uncompressedSize, true);
|
|
228
|
+
view.setUint16(28, entry.name.length, true);
|
|
229
|
+
view.setUint16(30, 0, true); // Extra field length
|
|
230
|
+
view.setUint16(32, 0, true); // Comment length
|
|
231
|
+
view.setUint16(34, 0, true); // Disk number start
|
|
232
|
+
view.setUint16(36, 0, true); // Internal file attributes
|
|
233
|
+
view.setUint32(38, 0, true); // External file attributes
|
|
234
|
+
view.setUint32(42, entry.offset, true);
|
|
235
|
+
header.set(entry.name, 46);
|
|
236
|
+
centralDirChunks.push(header);
|
|
237
|
+
}
|
|
238
|
+
// Emit central directory
|
|
239
|
+
for (const chunk of centralDirChunks) {
|
|
240
|
+
this.callback(null, chunk, false);
|
|
241
|
+
}
|
|
242
|
+
const centralDirSize = centralDirChunks.reduce((sum, c) => sum + c.length, 0);
|
|
243
|
+
// Build end of central directory
|
|
244
|
+
const eocd = new Uint8Array(22);
|
|
245
|
+
const eocdView = new DataView(eocd.buffer);
|
|
246
|
+
eocdView.setUint32(0, END_OF_CENTRAL_DIR_SIG, true);
|
|
247
|
+
eocdView.setUint16(4, 0, true); // Disk number
|
|
248
|
+
eocdView.setUint16(6, 0, true); // Disk with central dir
|
|
249
|
+
eocdView.setUint16(8, this.entries.length, true);
|
|
250
|
+
eocdView.setUint16(10, this.entries.length, true);
|
|
251
|
+
eocdView.setUint32(12, centralDirSize, true);
|
|
252
|
+
eocdView.setUint32(16, centralDirOffset, true);
|
|
253
|
+
eocdView.setUint16(20, 0, true); // Comment length
|
|
254
|
+
// Emit end of central directory (final chunk)
|
|
255
|
+
this.callback(null, eocd, true);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Export aliases for fflate compatibility
|
|
259
|
+
export { StreamingZip as Zip, ZipDeflateFile as ZipDeflate };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ZipBuilder } from "./zip/zip-builder.js";
|
|
2
|
+
import { StreamBuf } from "./stream-buf.browser.js";
|
|
3
|
+
// Helper function for base64 decoding in browser
|
|
4
|
+
function base64ToUint8Array(base64) {
|
|
5
|
+
const binaryString = atob(base64);
|
|
6
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
7
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
8
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
9
|
+
}
|
|
10
|
+
return bytes;
|
|
11
|
+
}
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// The ZipWriter class - Browser version without Node.js events dependency
|
|
14
|
+
// Packs streamed data into an output zip stream
|
|
15
|
+
class ZipWriter {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
this.finalized = false;
|
|
18
|
+
this.pendingWrites = [];
|
|
19
|
+
this.events = new Map();
|
|
20
|
+
const level = options?.compression === "STORE"
|
|
21
|
+
? 0
|
|
22
|
+
: Math.max(0, Math.min(9, options?.compressionOptions?.level ?? 1));
|
|
23
|
+
this.stream = new StreamBuf();
|
|
24
|
+
this.zipBuilder = new ZipBuilder({ level });
|
|
25
|
+
}
|
|
26
|
+
// Event emitter methods
|
|
27
|
+
on(event, callback) {
|
|
28
|
+
const callbacks = this.events.get(event) || [];
|
|
29
|
+
callbacks.push(callback);
|
|
30
|
+
this.events.set(event, callbacks);
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
once(event, callback) {
|
|
34
|
+
const onceCallback = (...args) => {
|
|
35
|
+
this.off(event, onceCallback);
|
|
36
|
+
callback(...args);
|
|
37
|
+
};
|
|
38
|
+
return this.on(event, onceCallback);
|
|
39
|
+
}
|
|
40
|
+
off(event, callback) {
|
|
41
|
+
const callbacks = this.events.get(event) || [];
|
|
42
|
+
const index = callbacks.indexOf(callback);
|
|
43
|
+
if (index !== -1) {
|
|
44
|
+
callbacks.splice(index, 1);
|
|
45
|
+
}
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
emit(event, ...args) {
|
|
49
|
+
const callbacks = this.events.get(event) || [];
|
|
50
|
+
callbacks.forEach(cb => cb(...args));
|
|
51
|
+
return callbacks.length > 0;
|
|
52
|
+
}
|
|
53
|
+
removeListener(event, callback) {
|
|
54
|
+
return this.off(event, callback);
|
|
55
|
+
}
|
|
56
|
+
append(data, options) {
|
|
57
|
+
let buffer;
|
|
58
|
+
if (Object.prototype.hasOwnProperty.call(options, "base64") && options.base64) {
|
|
59
|
+
const base64Data = typeof data === "string" ? data : String(data);
|
|
60
|
+
buffer = base64ToUint8Array(base64Data);
|
|
61
|
+
}
|
|
62
|
+
else if (typeof data === "string") {
|
|
63
|
+
buffer = new TextEncoder().encode(data);
|
|
64
|
+
}
|
|
65
|
+
else if (data instanceof Uint8Array) {
|
|
66
|
+
buffer = data;
|
|
67
|
+
}
|
|
68
|
+
else if (ArrayBuffer.isView(data)) {
|
|
69
|
+
buffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
70
|
+
}
|
|
71
|
+
else if (data instanceof ArrayBuffer) {
|
|
72
|
+
buffer = new Uint8Array(data);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
buffer = data;
|
|
76
|
+
}
|
|
77
|
+
const writePromise = this.zipBuilder
|
|
78
|
+
.addFile({ name: options.name, data: buffer })
|
|
79
|
+
.then(chunks => {
|
|
80
|
+
for (const chunk of chunks) {
|
|
81
|
+
this.stream.write(new Uint8Array(chunk));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
this.pendingWrites.push(writePromise);
|
|
85
|
+
}
|
|
86
|
+
push(chunk) {
|
|
87
|
+
return this.stream.push(chunk);
|
|
88
|
+
}
|
|
89
|
+
async finalize() {
|
|
90
|
+
if (this.finalized) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.finalized = true;
|
|
94
|
+
await Promise.all(this.pendingWrites);
|
|
95
|
+
const finalChunks = this.zipBuilder.finalize();
|
|
96
|
+
for (const chunk of finalChunks) {
|
|
97
|
+
this.stream.write(new Uint8Array(chunk));
|
|
98
|
+
}
|
|
99
|
+
this.stream.end();
|
|
100
|
+
this.emit("finish");
|
|
101
|
+
}
|
|
102
|
+
// ==========================================================================
|
|
103
|
+
// Stream.Readable interface
|
|
104
|
+
read(size) {
|
|
105
|
+
return this.stream.read(size);
|
|
106
|
+
}
|
|
107
|
+
setEncoding(encoding) {
|
|
108
|
+
return this.stream.setEncoding(encoding);
|
|
109
|
+
}
|
|
110
|
+
pause() {
|
|
111
|
+
return this.stream.pause();
|
|
112
|
+
}
|
|
113
|
+
resume() {
|
|
114
|
+
return this.stream.resume();
|
|
115
|
+
}
|
|
116
|
+
isPaused() {
|
|
117
|
+
return this.stream.isPaused();
|
|
118
|
+
}
|
|
119
|
+
pipe(destination) {
|
|
120
|
+
return this.stream.pipe(destination);
|
|
121
|
+
}
|
|
122
|
+
unpipe(destination) {
|
|
123
|
+
return this.stream.unpipe(destination);
|
|
124
|
+
}
|
|
125
|
+
unshift() {
|
|
126
|
+
return this.stream.unshift();
|
|
127
|
+
}
|
|
128
|
+
wrap() {
|
|
129
|
+
return this.stream.wrap();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export { ZipWriter };
|
|
@@ -43,6 +43,8 @@ class PivotCacheDefinitionXform extends BaseXform {
|
|
|
43
43
|
*/
|
|
44
44
|
renderNew(xmlStream, model) {
|
|
45
45
|
const { source, cacheFields } = model;
|
|
46
|
+
// Record count = number of data rows (excluding header row)
|
|
47
|
+
const recordCount = source.getSheetValues().slice(2).length;
|
|
46
48
|
xmlStream.openXml(XmlStream.StdDocAttributes);
|
|
47
49
|
xmlStream.openNode(this.tag, {
|
|
48
50
|
...PivotCacheDefinitionXform.PIVOT_CACHE_DEFINITION_ATTRIBUTES,
|
|
@@ -53,7 +55,7 @@ class PivotCacheDefinitionXform extends BaseXform {
|
|
|
53
55
|
createdVersion: "8",
|
|
54
56
|
refreshedVersion: "8",
|
|
55
57
|
minRefreshableVersion: "3",
|
|
56
|
-
recordCount
|
|
58
|
+
recordCount
|
|
57
59
|
});
|
|
58
60
|
xmlStream.openNode("cacheSource", { type: "worksheet" });
|
|
59
61
|
xmlStream.leafNode("worksheetSource", {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { v4 as uuidv4 } from "uuid";
|
|
2
1
|
import { XmlStream } from "../../../utils/xml-stream.js";
|
|
3
2
|
import { xmlEncode, xmlDecode } from "../../../utils/utils.js";
|
|
4
3
|
import { BaseXform } from "../base-xform.js";
|
|
@@ -57,7 +56,23 @@ class PivotTableXform extends BaseXform {
|
|
|
57
56
|
renderNew(xmlStream, model) {
|
|
58
57
|
const { rows, columns, values, cacheFields, cacheId, applyWidthHeightFormats } = model;
|
|
59
58
|
// Generate unique UID for each pivot table to prevent Excel treating them as identical
|
|
60
|
-
const uniqueUid = `{${
|
|
59
|
+
const uniqueUid = `{${crypto.randomUUID().toUpperCase()}}`;
|
|
60
|
+
// Build rowItems - need one <i> for each unique value in row fields, plus grand total
|
|
61
|
+
const rowItems = buildRowItems(rows, cacheFields);
|
|
62
|
+
// Build colItems - need one <i> for each unique value in col fields, plus grand total
|
|
63
|
+
const colItems = buildColItems(columns, cacheFields, values.length);
|
|
64
|
+
// Calculate pivot table dimensions
|
|
65
|
+
const rowFieldItemCount = rows.length > 0 ? cacheFields[rows[0]]?.sharedItems?.length || 0 : 0;
|
|
66
|
+
const colFieldItemCount = columns.length > 0 ? cacheFields[columns[0]]?.sharedItems?.length || 0 : 0;
|
|
67
|
+
// Location: A3 is where pivot table starts
|
|
68
|
+
// - firstHeaderRow: 1 (column headers are in first row of pivot table)
|
|
69
|
+
// - firstDataRow: 2 (data starts in second row)
|
|
70
|
+
// - firstDataCol: 1 (data starts in second column, after row labels)
|
|
71
|
+
// Calculate ref based on actual data size
|
|
72
|
+
const endRow = 3 + rowFieldItemCount + 1; // start row + data rows + grand total
|
|
73
|
+
const endCol = 1 + colFieldItemCount + 1; // start col + data cols + grand total
|
|
74
|
+
const endColLetter = String.fromCharCode(64 + endCol);
|
|
75
|
+
const locationRef = `A3:${endColLetter}${endRow}`;
|
|
61
76
|
xmlStream.openXml(XmlStream.StdDocAttributes);
|
|
62
77
|
xmlStream.openNode(this.tag, {
|
|
63
78
|
...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,
|
|
@@ -82,23 +97,23 @@ class PivotTableXform extends BaseXform {
|
|
|
82
97
|
multipleFieldFilters: "0"
|
|
83
98
|
});
|
|
84
99
|
xmlStream.writeXml(`
|
|
85
|
-
<location ref="
|
|
100
|
+
<location ref="${locationRef}" firstHeaderRow="1" firstDataRow="2" firstDataCol="1" />
|
|
86
101
|
<pivotFields count="${cacheFields.length}">
|
|
87
102
|
${renderPivotFields(model)}
|
|
88
103
|
</pivotFields>
|
|
89
104
|
<rowFields count="${rows.length}">
|
|
90
105
|
${rows.map(rowIndex => `<field x="${rowIndex}" />`).join("\n ")}
|
|
91
106
|
</rowFields>
|
|
92
|
-
<rowItems count="
|
|
93
|
-
|
|
107
|
+
<rowItems count="${rowItems.count}">
|
|
108
|
+
${rowItems.xml}
|
|
94
109
|
</rowItems>
|
|
95
110
|
<colFields count="${columns.length === 0 ? 1 : columns.length}">
|
|
96
111
|
${columns.length === 0
|
|
97
112
|
? '<field x="-2" />'
|
|
98
113
|
: columns.map(columnIndex => `<field x="${columnIndex}" />`).join("\n ")}
|
|
99
114
|
</colFields>
|
|
100
|
-
<colItems count="
|
|
101
|
-
|
|
115
|
+
<colItems count="${colItems.count}">
|
|
116
|
+
${colItems.xml}
|
|
102
117
|
</colItems>
|
|
103
118
|
<dataFields count="${values.length}">
|
|
104
119
|
${buildDataFields(cacheFields, values, model.metric)}
|
|
@@ -138,7 +153,7 @@ class PivotTableXform extends BaseXform {
|
|
|
138
153
|
* Render loaded pivot table (preserving original structure)
|
|
139
154
|
*/
|
|
140
155
|
renderLoaded(xmlStream, model) {
|
|
141
|
-
const uniqueUid = model.uid || `{${
|
|
156
|
+
const uniqueUid = model.uid || `{${crypto.randomUUID().toUpperCase()}}`;
|
|
142
157
|
xmlStream.openXml(XmlStream.StdDocAttributes);
|
|
143
158
|
xmlStream.openNode(this.tag, {
|
|
144
159
|
...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,
|
|
@@ -461,6 +476,70 @@ PivotTableXform.PIVOT_TABLE_ATTRIBUTES = {
|
|
|
461
476
|
"xmlns:xr": "http://schemas.microsoft.com/office/spreadsheetml/2014/revision"
|
|
462
477
|
};
|
|
463
478
|
// Helpers
|
|
479
|
+
/**
|
|
480
|
+
* Build rowItems XML - one item for each unique value in row fields, plus grand total.
|
|
481
|
+
* Each <i> represents a row in the pivot table.
|
|
482
|
+
* - Regular items: <i><x v="index"/></i> where index is the position in sharedItems
|
|
483
|
+
* - Grand total: <i t="grand"><x/></i>
|
|
484
|
+
*/
|
|
485
|
+
function buildRowItems(rows, cacheFields) {
|
|
486
|
+
if (rows.length === 0) {
|
|
487
|
+
// No row fields - just grand total
|
|
488
|
+
return { count: 1, xml: '<i t="grand"><x /></i>' };
|
|
489
|
+
}
|
|
490
|
+
// Get unique values count from the first row field
|
|
491
|
+
const rowFieldIndex = rows[0];
|
|
492
|
+
const sharedItems = cacheFields[rowFieldIndex]?.sharedItems || [];
|
|
493
|
+
const itemCount = sharedItems.length;
|
|
494
|
+
// Build items: one for each unique value + grand total
|
|
495
|
+
const items = [];
|
|
496
|
+
// Regular items - reference each unique value by index
|
|
497
|
+
for (let i = 0; i < itemCount; i++) {
|
|
498
|
+
items.push(`<i><x v="${i}" /></i>`);
|
|
499
|
+
}
|
|
500
|
+
// Grand total row
|
|
501
|
+
items.push('<i t="grand"><x /></i>');
|
|
502
|
+
return {
|
|
503
|
+
count: items.length,
|
|
504
|
+
xml: items.join("\n ")
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Build colItems XML - one item for each unique value in column fields, plus grand total.
|
|
509
|
+
* When there are multiple data fields (values), each column value may have sub-columns.
|
|
510
|
+
*/
|
|
511
|
+
function buildColItems(columns, cacheFields, valueCount) {
|
|
512
|
+
if (columns.length === 0) {
|
|
513
|
+
// No column fields - columns are based on data fields (values)
|
|
514
|
+
if (valueCount > 1) {
|
|
515
|
+
// Multiple values: one column per value + grand total
|
|
516
|
+
const items = [];
|
|
517
|
+
for (let i = 0; i < valueCount; i++) {
|
|
518
|
+
items.push(`<i><x v="${i}" /></i>`);
|
|
519
|
+
}
|
|
520
|
+
items.push('<i t="grand"><x /></i>');
|
|
521
|
+
return { count: items.length, xml: items.join("\n ") };
|
|
522
|
+
}
|
|
523
|
+
// Single value: just grand total
|
|
524
|
+
return { count: 1, xml: '<i t="grand"><x /></i>' };
|
|
525
|
+
}
|
|
526
|
+
// Get unique values count from the first column field
|
|
527
|
+
const colFieldIndex = columns[0];
|
|
528
|
+
const sharedItems = cacheFields[colFieldIndex]?.sharedItems || [];
|
|
529
|
+
const itemCount = sharedItems.length;
|
|
530
|
+
// Build items: one for each unique value + grand total
|
|
531
|
+
const items = [];
|
|
532
|
+
// Regular items - reference each unique value by index
|
|
533
|
+
for (let i = 0; i < itemCount; i++) {
|
|
534
|
+
items.push(`<i><x v="${i}" /></i>`);
|
|
535
|
+
}
|
|
536
|
+
// Grand total column
|
|
537
|
+
items.push('<i t="grand"><x /></i>');
|
|
538
|
+
return {
|
|
539
|
+
count: items.length,
|
|
540
|
+
xml: items.join("\n ")
|
|
541
|
+
};
|
|
542
|
+
}
|
|
464
543
|
/**
|
|
465
544
|
* Build dataField XML elements for all values in the pivot table.
|
|
466
545
|
* Supports multiple values when columns is empty.
|
|
@@ -501,10 +580,15 @@ function renderPivotField(fieldType, sharedItems) {
|
|
|
501
580
|
const defaultAttributes = 'compact="0" outline="0" showAll="0" defaultSubtotal="0"';
|
|
502
581
|
if (fieldType === "row" || fieldType === "column") {
|
|
503
582
|
const axis = fieldType === "row" ? "axisRow" : "axisCol";
|
|
583
|
+
// items = one for each shared item + one default item
|
|
584
|
+
const itemsXml = [
|
|
585
|
+
...sharedItems.map((_item, index) => `<item x="${index}" />`),
|
|
586
|
+
'<item t="default" />' // Required default item for subtotals/grand totals
|
|
587
|
+
].join("\n ");
|
|
504
588
|
return `
|
|
505
589
|
<pivotField axis="${axis}" ${defaultAttributes}>
|
|
506
590
|
<items count="${sharedItems.length + 1}">
|
|
507
|
-
${
|
|
591
|
+
${itemsXml}
|
|
508
592
|
</items>
|
|
509
593
|
</pivotField>
|
|
510
594
|
`;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { v4 } from "uuid";
|
|
2
1
|
import { BaseXform } from "../../base-xform.js";
|
|
3
2
|
import { CompositeXform } from "../../composite-xform.js";
|
|
4
3
|
import { DatabarExtXform } from "./databar-ext-xform.js";
|
|
@@ -33,7 +32,7 @@ class CfRuleExtXform extends CompositeXform {
|
|
|
33
32
|
}
|
|
34
33
|
prepare(model) {
|
|
35
34
|
if (CfRuleExtXform.isExt(model)) {
|
|
36
|
-
model.x14Id = `{${
|
|
35
|
+
model.x14Id = `{${crypto.randomUUID()}}`.toUpperCase();
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
38
|
render(xmlStream, model) {
|
|
@@ -61,7 +60,7 @@ class CfRuleExtXform extends CompositeXform {
|
|
|
61
60
|
xmlStream.openNode(this.tag, {
|
|
62
61
|
type: "iconSet",
|
|
63
62
|
priority: model.priority,
|
|
64
|
-
id: model.x14Id || `{${
|
|
63
|
+
id: model.x14Id || `{${crypto.randomUUID()}}`
|
|
65
64
|
});
|
|
66
65
|
this.iconSetXform.render(xmlStream, model);
|
|
67
66
|
xmlStream.closeNode();
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { PageBreaksXform } from "./page-breaks-xform.js";
|
|
2
|
+
import { ListXform } from "../list-xform.js";
|
|
3
|
+
/**
|
|
4
|
+
* Xform for column page breaks (colBreaks element in worksheet XML)
|
|
5
|
+
* Used to define manual page breaks between columns when printing.
|
|
6
|
+
*
|
|
7
|
+
* XML structure:
|
|
8
|
+
* <colBreaks count="3" manualBreakCount="3">
|
|
9
|
+
* <brk id="3" max="1048575" man="1"/>
|
|
10
|
+
* <brk id="6" max="1048575" man="1"/>
|
|
11
|
+
* </colBreaks>
|
|
12
|
+
*/
|
|
13
|
+
class ColBreaksXform extends ListXform {
|
|
14
|
+
constructor() {
|
|
15
|
+
super({
|
|
16
|
+
tag: "colBreaks",
|
|
17
|
+
count: true,
|
|
18
|
+
childXform: new PageBreaksXform()
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
// Override to add manualBreakCount attribute required by Excel
|
|
22
|
+
render(xmlStream, model) {
|
|
23
|
+
if (model && model.length) {
|
|
24
|
+
xmlStream.openNode(this.tag, this.$);
|
|
25
|
+
xmlStream.addAttribute(this.$count, model.length);
|
|
26
|
+
xmlStream.addAttribute("manualBreakCount", model.length);
|
|
27
|
+
const { childXform } = this;
|
|
28
|
+
for (const childModel of model) {
|
|
29
|
+
childXform.render(xmlStream, childModel);
|
|
30
|
+
}
|
|
31
|
+
xmlStream.closeNode();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export { ColBreaksXform };
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { BaseXform } from "../base-xform.js";
|
|
2
|
+
/**
|
|
3
|
+
* Xform for individual page break (brk element)
|
|
4
|
+
* Used by both RowBreaksXform and ColBreaksXform
|
|
5
|
+
*/
|
|
2
6
|
class PageBreaksXform extends BaseXform {
|
|
3
7
|
get tag() {
|
|
4
8
|
return "brk";
|
|
@@ -8,7 +12,15 @@ class PageBreaksXform extends BaseXform {
|
|
|
8
12
|
}
|
|
9
13
|
parseOpen(node) {
|
|
10
14
|
if (node.name === "brk") {
|
|
11
|
-
|
|
15
|
+
const { id, max, man, min } = node.attributes;
|
|
16
|
+
this.model = {
|
|
17
|
+
id: +id,
|
|
18
|
+
max: +max,
|
|
19
|
+
man: +man
|
|
20
|
+
};
|
|
21
|
+
if (min !== undefined) {
|
|
22
|
+
this.model.min = +min;
|
|
23
|
+
}
|
|
12
24
|
return true;
|
|
13
25
|
}
|
|
14
26
|
return false;
|