@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,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV Base class - Shared functionality for Node.js and Browser
|
|
3
|
+
*
|
|
4
|
+
* Uses native CSV parser (RFC 4180 compliant) with zero external dependencies.
|
|
5
|
+
* Date parsing uses native high-performance datetime utilities.
|
|
6
|
+
*/
|
|
7
|
+
import { DateParser, DateFormatter } from "../utils/datetime.js";
|
|
8
|
+
import { parseCsv, formatCsv } from "./csv-core.js";
|
|
9
|
+
// Special Excel values mapping
|
|
10
|
+
const SpecialValues = {
|
|
11
|
+
true: true,
|
|
12
|
+
false: false,
|
|
13
|
+
"#N/A": { error: "#N/A" },
|
|
14
|
+
"#REF!": { error: "#REF!" },
|
|
15
|
+
"#NAME?": { error: "#NAME?" },
|
|
16
|
+
"#DIV/0!": { error: "#DIV/0!" },
|
|
17
|
+
"#NULL!": { error: "#NULL!" },
|
|
18
|
+
"#VALUE!": { error: "#VALUE!" },
|
|
19
|
+
"#NUM!": { error: "#NUM!" }
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Create the default value mapper for CSV parsing
|
|
23
|
+
*/
|
|
24
|
+
export function createDefaultValueMapper(dateFormats) {
|
|
25
|
+
const dateParser = DateParser.create(dateFormats);
|
|
26
|
+
return function mapValue(datum) {
|
|
27
|
+
if (datum === "") {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
// Try to parse as number
|
|
31
|
+
const datumNumber = Number(datum);
|
|
32
|
+
if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {
|
|
33
|
+
return datumNumber;
|
|
34
|
+
}
|
|
35
|
+
// Try to parse as date
|
|
36
|
+
const date = dateParser.parse(datum);
|
|
37
|
+
if (date) {
|
|
38
|
+
return date;
|
|
39
|
+
}
|
|
40
|
+
// Check for special values
|
|
41
|
+
const special = SpecialValues[datum];
|
|
42
|
+
if (special !== undefined) {
|
|
43
|
+
return special;
|
|
44
|
+
}
|
|
45
|
+
return datum;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create the default value mapper for CSV writing
|
|
50
|
+
*/
|
|
51
|
+
export function createDefaultWriteMapper(dateFormat, dateUTC) {
|
|
52
|
+
const formatter = dateFormat
|
|
53
|
+
? DateFormatter.create(dateFormat, { utc: dateUTC })
|
|
54
|
+
: DateFormatter.iso(dateUTC);
|
|
55
|
+
return function mapValue(value) {
|
|
56
|
+
if (value) {
|
|
57
|
+
// Handle hyperlinks
|
|
58
|
+
if (value.text || value.hyperlink) {
|
|
59
|
+
return value.hyperlink || value.text || "";
|
|
60
|
+
}
|
|
61
|
+
// Handle formulas
|
|
62
|
+
if (value.formula || value.result) {
|
|
63
|
+
return value.result || "";
|
|
64
|
+
}
|
|
65
|
+
// Handle dates
|
|
66
|
+
if (value instanceof Date) {
|
|
67
|
+
return formatter.format(value);
|
|
68
|
+
}
|
|
69
|
+
// Handle errors
|
|
70
|
+
if (value.error) {
|
|
71
|
+
return value.error;
|
|
72
|
+
}
|
|
73
|
+
// Handle other objects
|
|
74
|
+
if (typeof value === "object") {
|
|
75
|
+
return JSON.stringify(value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return value;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parse CSV content into a worksheet
|
|
83
|
+
*/
|
|
84
|
+
export function parseCsvToWorksheet(content, workbook, options = {}) {
|
|
85
|
+
const worksheet = workbook.addWorksheet(options.sheetName);
|
|
86
|
+
const dateFormats = options.dateFormats || [
|
|
87
|
+
"YYYY-MM-DD[T]HH:mm:ssZ",
|
|
88
|
+
"YYYY-MM-DD[T]HH:mm:ss",
|
|
89
|
+
"YYYY-MM-DD"
|
|
90
|
+
];
|
|
91
|
+
const map = options.map || createDefaultValueMapper(dateFormats);
|
|
92
|
+
// Parse CSV
|
|
93
|
+
const rows = parseCsv(content, options.parserOptions);
|
|
94
|
+
// Add rows to worksheet
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
worksheet.addRow(row.map(map));
|
|
97
|
+
}
|
|
98
|
+
return worksheet;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Format worksheet as CSV string
|
|
102
|
+
*/
|
|
103
|
+
export function formatWorksheetToCsv(worksheet, options = {}) {
|
|
104
|
+
if (!worksheet) {
|
|
105
|
+
return "";
|
|
106
|
+
}
|
|
107
|
+
const { dateFormat, dateUTC } = options;
|
|
108
|
+
const map = options.map || createDefaultWriteMapper(dateFormat, dateUTC);
|
|
109
|
+
const includeEmptyRows = options.includeEmptyRows !== false;
|
|
110
|
+
const rows = [];
|
|
111
|
+
let lastRow = 1;
|
|
112
|
+
worksheet.eachRow((row, rowNumber) => {
|
|
113
|
+
// Add empty rows if needed
|
|
114
|
+
if (includeEmptyRows) {
|
|
115
|
+
while (lastRow++ < rowNumber - 1) {
|
|
116
|
+
rows.push([]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const { values } = row;
|
|
120
|
+
values.shift(); // Remove first empty element (1-indexed)
|
|
121
|
+
rows.push(values.map(map));
|
|
122
|
+
lastRow = rowNumber;
|
|
123
|
+
});
|
|
124
|
+
return formatCsv(rows, options.formatterOptions);
|
|
125
|
+
}
|
|
126
|
+
// Re-export core types
|
|
127
|
+
export { parseCsv, formatCsv, parseCsvStream } from "./csv-core.js";
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV class for Browser - No file system dependencies
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - load: Load from string or ArrayBuffer
|
|
6
|
+
* - writeString: Write to string
|
|
7
|
+
* - writeBuffer: Write to Uint8Array
|
|
8
|
+
*/
|
|
9
|
+
import { parseCsvToWorksheet, formatWorksheetToCsv } from "./csv.base.js";
|
|
10
|
+
class CSV {
|
|
11
|
+
constructor(workbook) {
|
|
12
|
+
this.workbook = workbook;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load CSV from string or ArrayBuffer
|
|
16
|
+
*/
|
|
17
|
+
load(data, options) {
|
|
18
|
+
let content;
|
|
19
|
+
if (typeof data === "string") {
|
|
20
|
+
content = data;
|
|
21
|
+
}
|
|
22
|
+
else if (data instanceof ArrayBuffer) {
|
|
23
|
+
content = new TextDecoder("utf-8").decode(data);
|
|
24
|
+
}
|
|
25
|
+
else if (data instanceof Uint8Array) {
|
|
26
|
+
content = new TextDecoder("utf-8").decode(data);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
throw new Error("Invalid data type. Expected string, ArrayBuffer, or Uint8Array.");
|
|
30
|
+
}
|
|
31
|
+
return parseCsvToWorksheet(content, this.workbook, options);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Write CSV to string
|
|
35
|
+
*/
|
|
36
|
+
writeString(options) {
|
|
37
|
+
const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);
|
|
38
|
+
return formatWorksheetToCsv(worksheet, options);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Write CSV to Uint8Array buffer
|
|
42
|
+
*/
|
|
43
|
+
writeBuffer(options) {
|
|
44
|
+
const content = this.writeString(options);
|
|
45
|
+
return new TextEncoder().encode(content);
|
|
46
|
+
}
|
|
47
|
+
// Stubs for unsupported methods - throw helpful errors
|
|
48
|
+
async readFile(_filename, _options) {
|
|
49
|
+
throw new Error("CSV.readFile() is not available in browser. " +
|
|
50
|
+
"Use CSV.load() with string or ArrayBuffer instead.");
|
|
51
|
+
}
|
|
52
|
+
async read(_stream, _options) {
|
|
53
|
+
throw new Error("CSV.read() stream is not available in browser. " +
|
|
54
|
+
"Use CSV.load() with string or ArrayBuffer instead.");
|
|
55
|
+
}
|
|
56
|
+
async writeFile(_filename, _options) {
|
|
57
|
+
throw new Error("CSV.writeFile() is not available in browser. " +
|
|
58
|
+
"Use CSV.writeString() or CSV.writeBuffer() and handle download manually.");
|
|
59
|
+
}
|
|
60
|
+
write(_stream, _options) {
|
|
61
|
+
throw new Error("CSV.write() stream is not available in browser. " +
|
|
62
|
+
"Use CSV.writeString() or CSV.writeBuffer() instead.");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export { CSV };
|
package/dist/esm/csv/csv.js
CHANGED
|
@@ -1,187 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSV class for Node.js - Full streaming and file system support
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - readFile: Read from file path (streaming)
|
|
6
|
+
* - writeFile: Write to file path (streaming)
|
|
7
|
+
* - read: Read from Node.js stream
|
|
8
|
+
* - write: Write to Node.js stream
|
|
9
|
+
* - createReadStream: Create a readable stream from worksheet
|
|
10
|
+
* - createWriteStream: Create a writable stream that writes to worksheet
|
|
11
|
+
*/
|
|
1
12
|
import fs from "fs";
|
|
2
|
-
import {
|
|
3
|
-
import { format, parse } from "fast-csv";
|
|
4
|
-
import customParseFormat from "dayjs/plugin/customParseFormat.js";
|
|
5
|
-
import utc from "dayjs/plugin/utc.js";
|
|
6
|
-
import dayjs from "dayjs";
|
|
13
|
+
import {} from "stream";
|
|
7
14
|
import { fileExists } from "../utils/utils.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
false: false,
|
|
11
|
-
"#N/A": { error: "#N/A" },
|
|
12
|
-
"#REF!": { error: "#REF!" },
|
|
13
|
-
"#NAME?": { error: "#NAME?" },
|
|
14
|
-
"#DIV/0!": { error: "#DIV/0!" },
|
|
15
|
-
"#NULL!": { error: "#NULL!" },
|
|
16
|
-
"#VALUE!": { error: "#VALUE!" },
|
|
17
|
-
"#NUM!": { error: "#NUM!" }
|
|
18
|
-
};
|
|
19
|
-
dayjs.extend(customParseFormat);
|
|
20
|
-
dayjs.extend(utc);
|
|
15
|
+
import { createDefaultValueMapper, createDefaultWriteMapper } from "./csv.base.js";
|
|
16
|
+
import { CsvParserStream, CsvFormatterStream } from "./csv-stream.js";
|
|
21
17
|
class CSV {
|
|
22
18
|
constructor(workbook) {
|
|
23
19
|
this.workbook = workbook;
|
|
24
|
-
this.worksheet = null;
|
|
25
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Read CSV from file using streaming
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* const worksheet = await workbook.csv.readFile('data.csv');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
26
29
|
async readFile(filename, options) {
|
|
27
|
-
options = options || {};
|
|
28
30
|
if (!(await fileExists(filename))) {
|
|
29
31
|
throw new Error(`File not found: ${filename}`);
|
|
30
32
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
stream.close();
|
|
39
|
-
throw error;
|
|
40
|
-
}
|
|
33
|
+
const readStream = fs.createReadStream(filename, {
|
|
34
|
+
encoding: "utf8",
|
|
35
|
+
highWaterMark: options?.highWaterMark ?? 64 * 1024
|
|
36
|
+
});
|
|
37
|
+
return this.read(readStream, options);
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Read CSV from Node.js readable stream
|
|
41
|
+
*
|
|
42
|
+
* Uses true streaming - processes data row by row without loading entire file into memory.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const stream = fs.createReadStream('data.csv');
|
|
47
|
+
* const worksheet = await workbook.csv.read(stream);
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
async read(stream, options) {
|
|
51
|
+
const worksheet = this.workbook.addWorksheet(options?.sheetName);
|
|
52
|
+
const dateFormats = options?.dateFormats ??
|
|
53
|
+
["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"];
|
|
54
|
+
const map = options?.map || createDefaultValueMapper(dateFormats);
|
|
55
|
+
const parser = new CsvParserStream(options?.parserOptions);
|
|
44
56
|
return new Promise((resolve, reject) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (datum === "") {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
const datumNumber = Number(datum);
|
|
58
|
-
if (!Number.isNaN(datumNumber) && datumNumber !== Infinity) {
|
|
59
|
-
return datumNumber;
|
|
60
|
-
}
|
|
61
|
-
const dt = dateFormats.reduce((matchingDate, currentDateFormat) => {
|
|
62
|
-
if (matchingDate) {
|
|
63
|
-
return matchingDate;
|
|
64
|
-
}
|
|
65
|
-
const dayjsObj = dayjs(datum, currentDateFormat, true);
|
|
66
|
-
if (dayjsObj.isValid()) {
|
|
67
|
-
return dayjsObj;
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
}, null);
|
|
71
|
-
if (dt) {
|
|
72
|
-
return new Date(dt.valueOf());
|
|
73
|
-
}
|
|
74
|
-
const special = SpecialValues[datum];
|
|
75
|
-
if (special !== undefined) {
|
|
76
|
-
return special;
|
|
77
|
-
}
|
|
78
|
-
return datum;
|
|
79
|
-
};
|
|
80
|
-
const onData = (data) => {
|
|
81
|
-
worksheet.addRow(data.map(map));
|
|
82
|
-
};
|
|
83
|
-
const onEnd = () => {
|
|
84
|
-
csvStream.emit("worksheet", worksheet);
|
|
85
|
-
};
|
|
86
|
-
const cleanup = () => {
|
|
87
|
-
csvStream.removeListener("data", onData);
|
|
88
|
-
csvStream.removeListener("end", onEnd);
|
|
89
|
-
csvStream.removeListener("worksheet", onWorksheet);
|
|
90
|
-
csvStream.removeListener("error", onError);
|
|
91
|
-
};
|
|
92
|
-
const onWorksheet = (ws) => {
|
|
93
|
-
cleanup();
|
|
94
|
-
resolve(ws);
|
|
95
|
-
};
|
|
96
|
-
const onError = (err) => {
|
|
97
|
-
cleanup();
|
|
98
|
-
reject(err);
|
|
99
|
-
};
|
|
100
|
-
const csvStream = parse(options.parserOptions).on("data", onData).on("end", onEnd);
|
|
101
|
-
csvStream.once("worksheet", onWorksheet).on("error", onError);
|
|
102
|
-
stream.pipe(csvStream);
|
|
57
|
+
stream.pipe(parser);
|
|
58
|
+
parser.on("data", (row) => {
|
|
59
|
+
worksheet.addRow(row.map(map));
|
|
60
|
+
});
|
|
61
|
+
parser.on("end", () => {
|
|
62
|
+
resolve(worksheet);
|
|
63
|
+
});
|
|
64
|
+
parser.on("error", reject);
|
|
65
|
+
stream.on("error", reject);
|
|
103
66
|
});
|
|
104
67
|
}
|
|
105
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Write CSV to file using streaming
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* await workbook.csv.writeFile('output.csv');
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
async writeFile(filename, options) {
|
|
77
|
+
const writeStream = fs.createWriteStream(filename, {
|
|
78
|
+
encoding: (options?.encoding || "utf8"),
|
|
79
|
+
highWaterMark: options?.highWaterMark ?? 64 * 1024
|
|
80
|
+
});
|
|
81
|
+
return this.write(writeStream, options);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Write CSV to Node.js writable stream
|
|
85
|
+
*
|
|
86
|
+
* Uses true streaming - writes data row by row.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* const stream = fs.createWriteStream('output.csv');
|
|
91
|
+
* await workbook.csv.write(stream);
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
async write(stream, options) {
|
|
95
|
+
const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);
|
|
96
|
+
if (!worksheet) {
|
|
97
|
+
stream.end();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const { dateFormat, dateUTC } = options || {};
|
|
101
|
+
const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);
|
|
102
|
+
const includeEmptyRows = options?.includeEmptyRows !== false;
|
|
103
|
+
const formatterOptions = {
|
|
104
|
+
...options?.formatterOptions
|
|
105
|
+
};
|
|
106
|
+
const formatter = new CsvFormatterStream(formatterOptions);
|
|
107
|
+
formatter.pipe(stream);
|
|
108
|
+
let lastRow = 1;
|
|
109
|
+
worksheet.eachRow((row, rowNumber) => {
|
|
110
|
+
// Add empty rows if needed
|
|
111
|
+
if (includeEmptyRows) {
|
|
112
|
+
while (lastRow++ < rowNumber - 1) {
|
|
113
|
+
formatter.write([]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const { values } = row;
|
|
117
|
+
values.shift(); // Remove first empty element (1-indexed)
|
|
118
|
+
formatter.write(values.map(map));
|
|
119
|
+
lastRow = rowNumber;
|
|
120
|
+
});
|
|
106
121
|
return new Promise((resolve, reject) => {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
return value;
|
|
154
|
-
});
|
|
155
|
-
const includeEmptyRows = options.includeEmptyRows === undefined || options.includeEmptyRows;
|
|
156
|
-
let lastRow = 1;
|
|
157
|
-
if (worksheet) {
|
|
122
|
+
formatter.on("error", reject);
|
|
123
|
+
stream.on("error", reject);
|
|
124
|
+
stream.on("finish", () => resolve());
|
|
125
|
+
formatter.end();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Write CSV to buffer
|
|
130
|
+
*
|
|
131
|
+
* Note: This loads the entire CSV into memory. For large files, use write() with a stream.
|
|
132
|
+
*/
|
|
133
|
+
async writeBuffer(options) {
|
|
134
|
+
const chunks = [];
|
|
135
|
+
const { Writable } = await import("stream");
|
|
136
|
+
const bufferStream = new Writable({
|
|
137
|
+
write(chunk, encoding, callback) {
|
|
138
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding));
|
|
139
|
+
callback();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
await this.write(bufferStream, options);
|
|
143
|
+
return Buffer.concat(chunks);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Create a readable stream that outputs CSV rows from the worksheet
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* const csvStream = workbook.csv.createReadStream();
|
|
151
|
+
* csvStream.pipe(fs.createWriteStream('output.csv'));
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
createReadStream(options) {
|
|
155
|
+
const worksheet = this.workbook.getWorksheet(options?.sheetName || options?.sheetId);
|
|
156
|
+
const { dateFormat, dateUTC } = options || {};
|
|
157
|
+
const map = options?.map || createDefaultWriteMapper(dateFormat, dateUTC);
|
|
158
|
+
const includeEmptyRows = options?.includeEmptyRows !== false;
|
|
159
|
+
const formatterOptions = {
|
|
160
|
+
...options?.formatterOptions
|
|
161
|
+
};
|
|
162
|
+
const formatter = new CsvFormatterStream(formatterOptions);
|
|
163
|
+
if (worksheet) {
|
|
164
|
+
// Use setImmediate to allow piping before data flows
|
|
165
|
+
setImmediate(() => {
|
|
166
|
+
let lastRow = 1;
|
|
158
167
|
worksheet.eachRow((row, rowNumber) => {
|
|
159
168
|
if (includeEmptyRows) {
|
|
160
169
|
while (lastRow++ < rowNumber - 1) {
|
|
161
|
-
|
|
170
|
+
formatter.write([]);
|
|
162
171
|
}
|
|
163
172
|
}
|
|
164
173
|
const { values } = row;
|
|
165
174
|
values.shift();
|
|
166
|
-
|
|
175
|
+
formatter.write(values.map(map));
|
|
167
176
|
lastRow = rowNumber;
|
|
168
177
|
});
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
encoding: (options.encoding || "utf8")
|
|
177
|
-
};
|
|
178
|
-
const stream = fs.createWriteStream(filename, streamOptions);
|
|
179
|
-
return this.write(stream, options);
|
|
178
|
+
formatter.end();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
setImmediate(() => formatter.end());
|
|
183
|
+
}
|
|
184
|
+
return formatter;
|
|
180
185
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
186
|
+
/**
|
|
187
|
+
* Create a writable stream that parses CSV and adds rows to a worksheet
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```ts
|
|
191
|
+
* const csvWriter = workbook.csv.createWriteStream({ sheetName: 'Data' });
|
|
192
|
+
* fs.createReadStream('input.csv').pipe(csvWriter);
|
|
193
|
+
* await new Promise(resolve => csvWriter.on('finish', resolve));
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
createWriteStream(options) {
|
|
197
|
+
const worksheet = this.workbook.addWorksheet(options?.sheetName);
|
|
198
|
+
const dateFormats = options?.dateFormats ??
|
|
199
|
+
["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"];
|
|
200
|
+
const map = options?.map || createDefaultValueMapper(dateFormats);
|
|
201
|
+
const parser = new CsvParserStream(options?.parserOptions);
|
|
202
|
+
parser.on("data", (row) => {
|
|
203
|
+
worksheet.addRow(row.map(map));
|
|
204
|
+
});
|
|
205
|
+
return parser;
|
|
185
206
|
}
|
|
186
207
|
}
|
|
187
208
|
export { CSV };
|
|
209
|
+
export { CsvParserStream, CsvFormatterStream } from "./csv-stream.js";
|
package/dist/esm/doc/column.js
CHANGED
|
@@ -215,6 +215,27 @@ class Column {
|
|
|
215
215
|
});
|
|
216
216
|
}
|
|
217
217
|
// =========================================================================
|
|
218
|
+
// Page Breaks
|
|
219
|
+
/**
|
|
220
|
+
* Add a page break after this column.
|
|
221
|
+
* @param top - Optional top row limit for the page break (1-indexed)
|
|
222
|
+
* @param bottom - Optional bottom row limit for the page break (1-indexed)
|
|
223
|
+
*/
|
|
224
|
+
addPageBreak(top, bottom) {
|
|
225
|
+
const ws = this._worksheet;
|
|
226
|
+
const topRow = Math.max(0, (top || 0) - 1) || 0;
|
|
227
|
+
const bottomRow = Math.max(0, (bottom || 0) - 1) || 1048575;
|
|
228
|
+
const pb = {
|
|
229
|
+
id: this._number,
|
|
230
|
+
max: bottomRow,
|
|
231
|
+
man: 1
|
|
232
|
+
};
|
|
233
|
+
if (topRow) {
|
|
234
|
+
pb.min = topRow;
|
|
235
|
+
}
|
|
236
|
+
ws.colBreaks.push(pb);
|
|
237
|
+
}
|
|
238
|
+
// =========================================================================
|
|
218
239
|
// styles
|
|
219
240
|
get numFmt() {
|
|
220
241
|
return this.style.numFmt;
|