@cj-tech-master/excelts 1.6.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -24
- package/README_zh.md +140 -26
- package/dist/browser/excelts.esm.js +18468 -0
- package/dist/browser/excelts.esm.js.map +1 -0
- package/dist/browser/excelts.esm.min.js +125 -0
- package/dist/browser/excelts.iife.js +13107 -47146
- package/dist/browser/excelts.iife.js.map +1 -1
- package/dist/browser/excelts.iife.min.js +24 -106
- 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 +648 -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 +10 -10
- 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 +10 -11
- 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 +639 -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-table-xform.js +2 -3
- 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 +207 -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 +4 -4
- package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
- package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
- 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 +85 -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 };
|
|
@@ -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,7 @@ 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()}}`;
|
|
61
60
|
xmlStream.openXml(XmlStream.StdDocAttributes);
|
|
62
61
|
xmlStream.openNode(this.tag, {
|
|
63
62
|
...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,
|
|
@@ -138,7 +137,7 @@ class PivotTableXform extends BaseXform {
|
|
|
138
137
|
* Render loaded pivot table (preserving original structure)
|
|
139
138
|
*/
|
|
140
139
|
renderLoaded(xmlStream, model) {
|
|
141
|
-
const uniqueUid = model.uid || `{${
|
|
140
|
+
const uniqueUid = model.uid || `{${crypto.randomUUID().toUpperCase()}}`;
|
|
142
141
|
xmlStream.openXml(XmlStream.StdDocAttributes);
|
|
143
142
|
xmlStream.openNode(this.tag, {
|
|
144
143
|
...PivotTableXform.PIVOT_TABLE_ATTRIBUTES,
|
|
@@ -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;
|
|
@@ -1,31 +1,29 @@
|
|
|
1
1
|
import { PageBreaksXform } from "./page-breaks-xform.js";
|
|
2
2
|
import { ListXform } from "../list-xform.js";
|
|
3
|
+
/**
|
|
4
|
+
* Xform for row page breaks (rowBreaks element in worksheet XML)
|
|
5
|
+
* Used to define manual page breaks between rows when printing.
|
|
6
|
+
*/
|
|
3
7
|
class RowBreaksXform extends ListXform {
|
|
4
8
|
constructor() {
|
|
5
|
-
|
|
9
|
+
super({
|
|
6
10
|
tag: "rowBreaks",
|
|
7
11
|
count: true,
|
|
8
12
|
childXform: new PageBreaksXform()
|
|
9
|
-
};
|
|
10
|
-
super(options);
|
|
13
|
+
});
|
|
11
14
|
}
|
|
12
|
-
//
|
|
15
|
+
// Override to add manualBreakCount attribute required by Excel
|
|
13
16
|
render(xmlStream, model) {
|
|
14
17
|
if (model && model.length) {
|
|
15
18
|
xmlStream.openNode(this.tag, this.$);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
xmlStream.addAttribute("manualBreakCount", model.length);
|
|
19
|
-
}
|
|
19
|
+
xmlStream.addAttribute(this.$count, model.length);
|
|
20
|
+
xmlStream.addAttribute("manualBreakCount", model.length);
|
|
20
21
|
const { childXform } = this;
|
|
21
|
-
|
|
22
|
+
for (const childModel of model) {
|
|
22
23
|
childXform.render(xmlStream, childModel);
|
|
23
|
-
}
|
|
24
|
+
}
|
|
24
25
|
xmlStream.closeNode();
|
|
25
26
|
}
|
|
26
|
-
else if (this.empty) {
|
|
27
|
-
xmlStream.leafNode(this.tag);
|
|
28
|
-
}
|
|
29
27
|
}
|
|
30
28
|
}
|
|
31
29
|
export { RowBreaksXform };
|
|
@@ -22,6 +22,7 @@ import { PictureXform } from "./picture-xform.js";
|
|
|
22
22
|
import { DrawingXform } from "./drawing-xform.js";
|
|
23
23
|
import { TablePartXform } from "./table-part-xform.js";
|
|
24
24
|
import { RowBreaksXform } from "./row-breaks-xform.js";
|
|
25
|
+
import { ColBreaksXform } from "./col-breaks-xform.js";
|
|
25
26
|
import { HeaderFooterXform } from "./header-footer-xform.js";
|
|
26
27
|
import { ConditionalFormattingsXform } from "./cf/conditional-formattings-xform.js";
|
|
27
28
|
import { ExtLstXform } from "./ext-lst-xform.js";
|
|
@@ -108,6 +109,7 @@ class WorkSheetXform extends BaseXform {
|
|
|
108
109
|
childXform: new MergeCellXform()
|
|
109
110
|
}),
|
|
110
111
|
rowBreaks: new RowBreaksXform(),
|
|
112
|
+
colBreaks: new ColBreaksXform(),
|
|
111
113
|
hyperlinks: new ListXform({
|
|
112
114
|
tag: "hyperlinks",
|
|
113
115
|
count: false,
|
|
@@ -324,7 +326,8 @@ class WorkSheetXform extends BaseXform {
|
|
|
324
326
|
this.map.pageSetup.render(xmlStream, model.pageSetup);
|
|
325
327
|
this.map.headerFooter.render(xmlStream, model.headerFooter);
|
|
326
328
|
this.map.rowBreaks.render(xmlStream, model.rowBreaks);
|
|
327
|
-
this.map.
|
|
329
|
+
this.map.colBreaks.render(xmlStream, model.colBreaks);
|
|
330
|
+
this.map.drawing.render(xmlStream, model.drawing); // Note: must be after rowBreaks/colBreaks
|
|
328
331
|
this.map.picture.render(xmlStream, model.background); // Note: must be after drawing
|
|
329
332
|
this.map.tableParts.render(xmlStream, model.tables);
|
|
330
333
|
this.map.extLst.render(xmlStream, model);
|
|
@@ -399,7 +402,9 @@ class WorkSheetXform extends BaseXform {
|
|
|
399
402
|
background: this.map.picture.model,
|
|
400
403
|
drawing: this.map.drawing.model,
|
|
401
404
|
tables: this.map.tableParts.model,
|
|
402
|
-
conditionalFormattings
|
|
405
|
+
conditionalFormattings,
|
|
406
|
+
rowBreaks: this.map.rowBreaks.model || [],
|
|
407
|
+
colBreaks: this.map.colBreaks.model || []
|
|
403
408
|
};
|
|
404
409
|
if (this.map.autoFilter.model) {
|
|
405
410
|
this.model.autoFilter = this.map.autoFilter.model;
|