@cj-tech-master/excelts 0.1.0-canary.20251025023400.dff1908
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +232 -0
- package/README_zh.md +233 -0
- package/dist/LICENSE +22 -0
- package/dist/browser/excelts.iife.js +44568 -0
- package/dist/browser/excelts.iife.js.map +1 -0
- package/dist/browser/excelts.iife.min.js +112 -0
- package/dist/cjs/csv/csv.js +193 -0
- package/dist/cjs/doc/anchor.js +86 -0
- package/dist/cjs/doc/cell.js +917 -0
- package/dist/cjs/doc/column.js +277 -0
- package/dist/cjs/doc/data-validations.js +18 -0
- package/dist/cjs/doc/defined-names.js +171 -0
- package/dist/cjs/doc/enums.js +61 -0
- package/dist/cjs/doc/image.js +60 -0
- package/dist/cjs/doc/modelcontainer.js +16 -0
- package/dist/cjs/doc/note.js +64 -0
- package/dist/cjs/doc/pivot-table.js +110 -0
- package/dist/cjs/doc/range.js +247 -0
- package/dist/cjs/doc/row.js +375 -0
- package/dist/cjs/doc/table.js +410 -0
- package/dist/cjs/doc/workbook.js +181 -0
- package/dist/cjs/doc/worksheet.js +820 -0
- package/dist/cjs/index.js +51 -0
- package/dist/cjs/local.js +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/stream/xlsx/hyperlink-reader.js +82 -0
- package/dist/cjs/stream/xlsx/sheet-comments-writer.js +103 -0
- package/dist/cjs/stream/xlsx/sheet-rels-writer.js +93 -0
- package/dist/cjs/stream/xlsx/workbook-reader.js +356 -0
- package/dist/cjs/stream/xlsx/workbook-writer.js +368 -0
- package/dist/cjs/stream/xlsx/worksheet-reader.js +347 -0
- package/dist/cjs/stream/xlsx/worksheet-writer.js +593 -0
- package/dist/cjs/types.js +25 -0
- package/dist/cjs/utils/browser-buffer-decode.js +13 -0
- package/dist/cjs/utils/browser-buffer-encode.js +13 -0
- package/dist/cjs/utils/browser.js +6 -0
- package/dist/cjs/utils/cell-matrix.js +148 -0
- package/dist/cjs/utils/col-cache.js +281 -0
- package/dist/cjs/utils/copy-style.js +46 -0
- package/dist/cjs/utils/encryptor.js +55 -0
- package/dist/cjs/utils/iterate-stream.js +57 -0
- package/dist/cjs/utils/parse-sax.js +31 -0
- package/dist/cjs/utils/shared-formula.js +38 -0
- package/dist/cjs/utils/shared-strings.js +32 -0
- package/dist/cjs/utils/stream-buf.js +336 -0
- package/dist/cjs/utils/string-buf.js +68 -0
- package/dist/cjs/utils/under-dash.js +180 -0
- package/dist/cjs/utils/utils.js +234 -0
- package/dist/cjs/utils/xml-stream.js +149 -0
- package/dist/cjs/utils/zip-stream.js +122 -0
- package/dist/cjs/xlsx/defaultnumformats.js +152 -0
- package/dist/cjs/xlsx/rel-type.js +22 -0
- package/dist/cjs/xlsx/xform/base-xform.js +126 -0
- package/dist/cjs/xlsx/xform/book/defined-name-xform.js +93 -0
- package/dist/cjs/xlsx/xform/book/sheet-xform.js +32 -0
- package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +24 -0
- package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +27 -0
- package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +27 -0
- package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +49 -0
- package/dist/cjs/xlsx/xform/book/workbook-xform.js +234 -0
- package/dist/cjs/xlsx/xform/comment/comment-xform.js +79 -0
- package/dist/cjs/xlsx/xform/comment/comments-xform.js +75 -0
- package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +37 -0
- package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +33 -0
- package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +58 -0
- package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +85 -0
- package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +99 -0
- package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +86 -0
- package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +63 -0
- package/dist/cjs/xlsx/xform/composite-xform.js +51 -0
- package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +27 -0
- package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +24 -0
- package/dist/cjs/xlsx/xform/core/app-xform.js +86 -0
- package/dist/cjs/xlsx/xform/core/content-types-xform.js +120 -0
- package/dist/cjs/xlsx/xform/core/core-xform.js +127 -0
- package/dist/cjs/xlsx/xform/core/relationship-xform.js +23 -0
- package/dist/cjs/xlsx/xform/core/relationships-xform.js +65 -0
- package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +47 -0
- package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +60 -0
- package/dist/cjs/xlsx/xform/drawing/blip-xform.js +43 -0
- package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +35 -0
- package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +62 -0
- package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +71 -0
- package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +99 -0
- package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +40 -0
- package/dist/cjs/xlsx/xform/drawing/ext-xform.js +37 -0
- package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +42 -0
- package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +59 -0
- package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +55 -0
- package/dist/cjs/xlsx/xform/drawing/pic-xform.js +67 -0
- package/dist/cjs/xlsx/xform/drawing/sp-pr.js +20 -0
- package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +54 -0
- package/dist/cjs/xlsx/xform/list-xform.js +86 -0
- package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +42 -0
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +67 -0
- package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +89 -0
- package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +171 -0
- package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +37 -0
- package/dist/cjs/xlsx/xform/sheet/cell-xform.js +452 -0
- package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +262 -0
- package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +25 -0
- package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +40 -0
- package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +77 -0
- package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +42 -0
- package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +70 -0
- package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +22 -0
- package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +40 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +25 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +83 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +38 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +51 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +43 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +72 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +22 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +63 -0
- package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +22 -0
- package/dist/cjs/xlsx/xform/sheet/col-xform.js +78 -0
- package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +246 -0
- package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +26 -0
- package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +30 -0
- package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +69 -0
- package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +127 -0
- package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +50 -0
- package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +24 -0
- package/dist/cjs/xlsx/xform/sheet/merges.js +53 -0
- package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +39 -0
- package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +24 -0
- package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +45 -0
- package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +32 -0
- package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +98 -0
- package/dist/cjs/xlsx/xform/sheet/picture-xform.js +30 -0
- package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +44 -0
- package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +34 -0
- package/dist/cjs/xlsx/xform/sheet/row-xform.js +133 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +49 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +85 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +83 -0
- package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +192 -0
- package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +30 -0
- package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +504 -0
- package/dist/cjs/xlsx/xform/simple/boolean-xform.js +27 -0
- package/dist/cjs/xlsx/xform/simple/date-xform.js +68 -0
- package/dist/cjs/xlsx/xform/simple/float-xform.js +50 -0
- package/dist/cjs/xlsx/xform/simple/integer-xform.js +55 -0
- package/dist/cjs/xlsx/xform/simple/string-xform.js +50 -0
- package/dist/cjs/xlsx/xform/static-xform.js +58 -0
- package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +89 -0
- package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +80 -0
- package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +93 -0
- package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +112 -0
- package/dist/cjs/xlsx/xform/strings/text-xform.js +39 -0
- package/dist/cjs/xlsx/xform/style/alignment-xform.js +155 -0
- package/dist/cjs/xlsx/xform/style/border-xform.js +191 -0
- package/dist/cjs/xlsx/xform/style/color-xform.js +64 -0
- package/dist/cjs/xlsx/xform/style/dxf-xform.js +95 -0
- package/dist/cjs/xlsx/xform/style/fill-xform.js +315 -0
- package/dist/cjs/xlsx/xform/style/font-xform.js +90 -0
- package/dist/cjs/xlsx/xform/style/numfmt-xform.js +53 -0
- package/dist/cjs/xlsx/xform/style/protection-xform.js +52 -0
- package/dist/cjs/xlsx/xform/style/style-xform.js +111 -0
- package/dist/cjs/xlsx/xform/style/styles-xform.js +487 -0
- package/dist/cjs/xlsx/xform/style/underline-xform.js +41 -0
- package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +71 -0
- package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +34 -0
- package/dist/cjs/xlsx/xform/table/filter-column-xform.js +87 -0
- package/dist/cjs/xlsx/xform/table/filter-xform.js +32 -0
- package/dist/cjs/xlsx/xform/table/table-column-xform.js +43 -0
- package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +47 -0
- package/dist/cjs/xlsx/xform/table/table-xform.js +133 -0
- package/dist/cjs/xlsx/xlsx.js +772 -0
- package/dist/cjs/xlsx/xml/theme1.js +4 -0
- package/dist/esm/csv/csv.js +187 -0
- package/dist/esm/doc/anchor.js +83 -0
- package/dist/esm/doc/cell.js +914 -0
- package/dist/esm/doc/column.js +274 -0
- package/dist/esm/doc/data-validations.js +15 -0
- package/dist/esm/doc/defined-names.js +168 -0
- package/dist/esm/doc/enums.js +58 -0
- package/dist/esm/doc/image.js +57 -0
- package/dist/esm/doc/modelcontainer.js +13 -0
- package/dist/esm/doc/note.js +61 -0
- package/dist/esm/doc/pivot-table.js +108 -0
- package/dist/esm/doc/range.js +244 -0
- package/dist/esm/doc/row.js +372 -0
- package/dist/esm/doc/table.js +407 -0
- package/dist/esm/doc/workbook.js +178 -0
- package/dist/esm/doc/worksheet.js +817 -0
- package/dist/esm/index.browser.js +3 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/local.js +1 -0
- package/dist/esm/stream/xlsx/hyperlink-reader.js +79 -0
- package/dist/esm/stream/xlsx/sheet-comments-writer.js +100 -0
- package/dist/esm/stream/xlsx/sheet-rels-writer.js +90 -0
- package/dist/esm/stream/xlsx/workbook-reader.js +349 -0
- package/dist/esm/stream/xlsx/workbook-writer.js +362 -0
- package/dist/esm/stream/xlsx/worksheet-reader.js +344 -0
- package/dist/esm/stream/xlsx/worksheet-writer.js +590 -0
- package/dist/esm/types.js +22 -0
- package/dist/esm/utils/browser-buffer-decode.js +11 -0
- package/dist/esm/utils/browser-buffer-encode.js +11 -0
- package/dist/esm/utils/browser.js +3 -0
- package/dist/esm/utils/cell-matrix.js +145 -0
- package/dist/esm/utils/col-cache.js +278 -0
- package/dist/esm/utils/copy-style.js +43 -0
- package/dist/esm/utils/encryptor.js +49 -0
- package/dist/esm/utils/iterate-stream.js +55 -0
- package/dist/esm/utils/parse-sax.js +29 -0
- package/dist/esm/utils/shared-formula.js +36 -0
- package/dist/esm/utils/shared-strings.js +29 -0
- package/dist/esm/utils/stream-buf.js +333 -0
- package/dist/esm/utils/string-buf.js +65 -0
- package/dist/esm/utils/under-dash.js +171 -0
- package/dist/esm/utils/utils.js +210 -0
- package/dist/esm/utils/xml-stream.js +146 -0
- package/dist/esm/utils/zip-stream.js +117 -0
- package/dist/esm/xlsx/defaultnumformats.js +149 -0
- package/dist/esm/xlsx/rel-type.js +19 -0
- package/dist/esm/xlsx/xform/base-xform.js +123 -0
- package/dist/esm/xlsx/xform/book/defined-name-xform.js +90 -0
- package/dist/esm/xlsx/xform/book/sheet-xform.js +29 -0
- package/dist/esm/xlsx/xform/book/workbook-calc-properties-xform.js +21 -0
- package/dist/esm/xlsx/xform/book/workbook-pivot-cache-xform.js +24 -0
- package/dist/esm/xlsx/xform/book/workbook-properties-xform.js +24 -0
- package/dist/esm/xlsx/xform/book/workbook-view-xform.js +46 -0
- package/dist/esm/xlsx/xform/book/workbook-xform.js +231 -0
- package/dist/esm/xlsx/xform/comment/comment-xform.js +76 -0
- package/dist/esm/xlsx/xform/comment/comments-xform.js +72 -0
- package/dist/esm/xlsx/xform/comment/style/vml-position-xform.js +34 -0
- package/dist/esm/xlsx/xform/comment/style/vml-protection-xform.js +30 -0
- package/dist/esm/xlsx/xform/comment/vml-anchor-xform.js +55 -0
- package/dist/esm/xlsx/xform/comment/vml-client-data-xform.js +82 -0
- package/dist/esm/xlsx/xform/comment/vml-notes-xform.js +96 -0
- package/dist/esm/xlsx/xform/comment/vml-shape-xform.js +83 -0
- package/dist/esm/xlsx/xform/comment/vml-textbox-xform.js +60 -0
- package/dist/esm/xlsx/xform/composite-xform.js +48 -0
- package/dist/esm/xlsx/xform/core/app-heading-pairs-xform.js +24 -0
- package/dist/esm/xlsx/xform/core/app-titles-of-parts-xform.js +21 -0
- package/dist/esm/xlsx/xform/core/app-xform.js +83 -0
- package/dist/esm/xlsx/xform/core/content-types-xform.js +117 -0
- package/dist/esm/xlsx/xform/core/core-xform.js +124 -0
- package/dist/esm/xlsx/xform/core/relationship-xform.js +20 -0
- package/dist/esm/xlsx/xform/core/relationships-xform.js +62 -0
- package/dist/esm/xlsx/xform/drawing/base-cell-anchor-xform.js +44 -0
- package/dist/esm/xlsx/xform/drawing/blip-fill-xform.js +57 -0
- package/dist/esm/xlsx/xform/drawing/blip-xform.js +40 -0
- package/dist/esm/xlsx/xform/drawing/c-nv-pic-pr-xform.js +32 -0
- package/dist/esm/xlsx/xform/drawing/c-nv-pr-xform.js +59 -0
- package/dist/esm/xlsx/xform/drawing/cell-position-xform.js +68 -0
- package/dist/esm/xlsx/xform/drawing/drawing-xform.js +96 -0
- package/dist/esm/xlsx/xform/drawing/ext-lst-xform.js +37 -0
- package/dist/esm/xlsx/xform/drawing/ext-xform.js +34 -0
- package/dist/esm/xlsx/xform/drawing/hlink-click-xform.js +39 -0
- package/dist/esm/xlsx/xform/drawing/nv-pic-pr-xform.js +56 -0
- package/dist/esm/xlsx/xform/drawing/one-cell-anchor-xform.js +52 -0
- package/dist/esm/xlsx/xform/drawing/pic-xform.js +64 -0
- package/dist/esm/xlsx/xform/drawing/sp-pr.js +17 -0
- package/dist/esm/xlsx/xform/drawing/two-cell-anchor-xform.js +51 -0
- package/dist/esm/xlsx/xform/list-xform.js +83 -0
- package/dist/esm/xlsx/xform/pivot-table/cache-field.js +39 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +64 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-cache-records-xform.js +86 -0
- package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +168 -0
- package/dist/esm/xlsx/xform/sheet/auto-filter-xform.js +34 -0
- package/dist/esm/xlsx/xform/sheet/cell-xform.js +449 -0
- package/dist/esm/xlsx/xform/sheet/cf/cf-rule-xform.js +259 -0
- package/dist/esm/xlsx/xform/sheet/cf/cfvo-xform.js +22 -0
- package/dist/esm/xlsx/xform/sheet/cf/color-scale-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/cf/conditional-formatting-xform.js +37 -0
- package/dist/esm/xlsx/xform/sheet/cf/conditional-formattings-xform.js +74 -0
- package/dist/esm/xlsx/xform/sheet/cf/databar-xform.js +39 -0
- package/dist/esm/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +67 -0
- package/dist/esm/xlsx/xform/sheet/cf/formula-xform.js +19 -0
- package/dist/esm/xlsx/xform/sheet/cf/icon-set-xform.js +37 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +22 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +80 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +35 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +48 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +40 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +69 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/f-ext-xform.js +19 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +60 -0
- package/dist/esm/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +19 -0
- package/dist/esm/xlsx/xform/sheet/col-xform.js +75 -0
- package/dist/esm/xlsx/xform/sheet/data-validations-xform.js +243 -0
- package/dist/esm/xlsx/xform/sheet/dimension-xform.js +23 -0
- package/dist/esm/xlsx/xform/sheet/drawing-xform.js +27 -0
- package/dist/esm/xlsx/xform/sheet/ext-lst-xform.js +66 -0
- package/dist/esm/xlsx/xform/sheet/header-footer-xform.js +124 -0
- package/dist/esm/xlsx/xform/sheet/hyperlink-xform.js +47 -0
- package/dist/esm/xlsx/xform/sheet/merge-cell-xform.js +21 -0
- package/dist/esm/xlsx/xform/sheet/merges.js +50 -0
- package/dist/esm/xlsx/xform/sheet/outline-properties-xform.js +36 -0
- package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +21 -0
- package/dist/esm/xlsx/xform/sheet/page-margins-xform.js +42 -0
- package/dist/esm/xlsx/xform/sheet/page-setup-properties-xform.js +29 -0
- package/dist/esm/xlsx/xform/sheet/page-setup-xform.js +95 -0
- package/dist/esm/xlsx/xform/sheet/picture-xform.js +27 -0
- package/dist/esm/xlsx/xform/sheet/print-options-xform.js +41 -0
- package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +31 -0
- package/dist/esm/xlsx/xform/sheet/row-xform.js +130 -0
- package/dist/esm/xlsx/xform/sheet/sheet-format-properties-xform.js +46 -0
- package/dist/esm/xlsx/xform/sheet/sheet-properties-xform.js +82 -0
- package/dist/esm/xlsx/xform/sheet/sheet-protection-xform.js +80 -0
- package/dist/esm/xlsx/xform/sheet/sheet-view-xform.js +189 -0
- package/dist/esm/xlsx/xform/sheet/table-part-xform.js +27 -0
- package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +501 -0
- package/dist/esm/xlsx/xform/simple/boolean-xform.js +24 -0
- package/dist/esm/xlsx/xform/simple/date-xform.js +65 -0
- package/dist/esm/xlsx/xform/simple/float-xform.js +47 -0
- package/dist/esm/xlsx/xform/simple/integer-xform.js +52 -0
- package/dist/esm/xlsx/xform/simple/string-xform.js +47 -0
- package/dist/esm/xlsx/xform/static-xform.js +55 -0
- package/dist/esm/xlsx/xform/strings/phonetic-text-xform.js +86 -0
- package/dist/esm/xlsx/xform/strings/rich-text-xform.js +77 -0
- package/dist/esm/xlsx/xform/strings/shared-string-xform.js +90 -0
- package/dist/esm/xlsx/xform/strings/shared-strings-xform.js +109 -0
- package/dist/esm/xlsx/xform/strings/text-xform.js +36 -0
- package/dist/esm/xlsx/xform/style/alignment-xform.js +152 -0
- package/dist/esm/xlsx/xform/style/border-xform.js +188 -0
- package/dist/esm/xlsx/xform/style/color-xform.js +61 -0
- package/dist/esm/xlsx/xform/style/dxf-xform.js +92 -0
- package/dist/esm/xlsx/xform/style/fill-xform.js +312 -0
- package/dist/esm/xlsx/xform/style/font-xform.js +87 -0
- package/dist/esm/xlsx/xform/style/numfmt-xform.js +50 -0
- package/dist/esm/xlsx/xform/style/protection-xform.js +49 -0
- package/dist/esm/xlsx/xform/style/style-xform.js +108 -0
- package/dist/esm/xlsx/xform/style/styles-xform.js +484 -0
- package/dist/esm/xlsx/xform/style/underline-xform.js +38 -0
- package/dist/esm/xlsx/xform/table/auto-filter-xform.js +68 -0
- package/dist/esm/xlsx/xform/table/custom-filter-xform.js +31 -0
- package/dist/esm/xlsx/xform/table/filter-column-xform.js +84 -0
- package/dist/esm/xlsx/xform/table/filter-xform.js +29 -0
- package/dist/esm/xlsx/xform/table/table-column-xform.js +40 -0
- package/dist/esm/xlsx/xform/table/table-style-info-xform.js +44 -0
- package/dist/esm/xlsx/xform/table/table-xform.js +130 -0
- package/dist/esm/xlsx/xlsx.js +766 -0
- package/dist/esm/xlsx/xml/theme1.js +1 -0
- package/dist/types/csv/csv.d.ts +79 -0
- package/dist/types/doc/anchor.d.ts +26 -0
- package/dist/types/doc/cell.d.ts +94 -0
- package/dist/types/doc/column.d.ts +68 -0
- package/dist/types/doc/data-validations.d.ts +11 -0
- package/dist/types/doc/defined-names.d.ts +34 -0
- package/dist/types/doc/enums.d.ts +62 -0
- package/dist/types/doc/image.d.ts +47 -0
- package/dist/types/doc/modelcontainer.d.ts +8 -0
- package/dist/types/doc/note.d.ts +29 -0
- package/dist/types/doc/pivot-table.d.ts +22 -0
- package/dist/types/doc/range.d.ts +51 -0
- package/dist/types/doc/row.d.ts +75 -0
- package/dist/types/doc/table.d.ts +96 -0
- package/dist/types/doc/workbook.d.ts +87 -0
- package/dist/types/doc/worksheet.d.ts +180 -0
- package/dist/types/index.browser.d.ts +4 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/local.d.ts +0 -0
- package/dist/types/stream/xlsx/hyperlink-reader.d.ts +27 -0
- package/dist/types/stream/xlsx/sheet-comments-writer.d.ts +26 -0
- package/dist/types/stream/xlsx/sheet-rels-writer.d.ts +45 -0
- package/dist/types/stream/xlsx/workbook-reader.d.ts +50 -0
- package/dist/types/stream/xlsx/workbook-writer.d.ts +55 -0
- package/dist/types/stream/xlsx/worksheet-reader.d.ts +39 -0
- package/dist/types/stream/xlsx/worksheet-writer.d.ts +103 -0
- package/dist/types/types.d.ts +464 -0
- package/dist/types/utils/browser-buffer-decode.d.ts +2 -0
- package/dist/types/utils/browser-buffer-encode.d.ts +2 -0
- package/dist/types/utils/browser.d.ts +1 -0
- package/dist/types/utils/cell-matrix.d.ts +37 -0
- package/dist/types/utils/col-cache.d.ts +33 -0
- package/dist/types/utils/copy-style.d.ts +5 -0
- package/dist/types/utils/encryptor.d.ts +23 -0
- package/dist/types/utils/iterate-stream.d.ts +10 -0
- package/dist/types/utils/parse-sax.d.ts +6 -0
- package/dist/types/utils/shared-formula.d.ts +2 -0
- package/dist/types/utils/shared-strings.d.ts +12 -0
- package/dist/types/utils/stream-buf.d.ts +2 -0
- package/dist/types/utils/string-buf.d.ts +20 -0
- package/dist/types/utils/under-dash.d.ts +7 -0
- package/dist/types/utils/utils.d.ts +45 -0
- package/dist/types/utils/xml-stream.d.ts +32 -0
- package/dist/types/utils/zip-stream.d.ts +35 -0
- package/dist/types/xlsx/defaultnumformats.d.ts +12 -0
- package/dist/types/xlsx/rel-type.d.ts +19 -0
- package/dist/types/xlsx/xform/base-xform.d.ts +33 -0
- package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/book/sheet-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/book/workbook-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/comment/comment-xform.d.ts +28 -0
- package/dist/types/xlsx/xform/comment/comments-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +27 -0
- package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +35 -0
- package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +25 -0
- package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/composite-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/core/app-xform.d.ts +26 -0
- package/dist/types/xlsx/xform/core/content-types-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/core/core-xform.d.ts +42 -0
- package/dist/types/xlsx/xform/core/relationship-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/core/relationships-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +22 -0
- package/dist/types/xlsx/xform/drawing/sp-pr.d.ts +32 -0
- package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/list-xform.d.ts +31 -0
- package/dist/types/xlsx/xform/pivot-table/cache-field.d.ts +11 -0
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +26 -0
- package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +26 -0
- package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +29 -0
- package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +41 -0
- package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +8 -0
- package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +11 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +29 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/col-xform.d.ts +22 -0
- package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +9 -0
- package/dist/types/xlsx/xform/sheet/merges.d.ts +14 -0
- package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +27 -0
- package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +6 -0
- package/dist/types/xlsx/xform/sheet/row-xform.d.ts +35 -0
- package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +16 -0
- package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +19 -0
- package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +31 -0
- package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +32 -0
- package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +12 -0
- package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/simple/date-xform.d.ts +22 -0
- package/dist/types/xlsx/xform/simple/float-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/simple/integer-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/simple/string-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/static-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +20 -0
- package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +25 -0
- package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +27 -0
- package/dist/types/xlsx/xform/strings/text-xform.d.ts +10 -0
- package/dist/types/xlsx/xform/style/alignment-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/style/border-xform.d.ts +49 -0
- package/dist/types/xlsx/xform/style/color-xform.d.ts +17 -0
- package/dist/types/xlsx/xform/style/dxf-xform.d.ts +23 -0
- package/dist/types/xlsx/xform/style/fill-xform.d.ts +85 -0
- package/dist/types/xlsx/xform/style/font-xform.d.ts +34 -0
- package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/style/protection-xform.d.ts +13 -0
- package/dist/types/xlsx/xform/style/style-xform.d.ts +30 -0
- package/dist/types/xlsx/xform/style/styles-xform.d.ts +46 -0
- package/dist/types/xlsx/xform/style/underline-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +15 -0
- package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +24 -0
- package/dist/types/xlsx/xform/table/filter-xform.d.ts +14 -0
- package/dist/types/xlsx/xform/table/table-column-xform.d.ts +21 -0
- package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +18 -0
- package/dist/types/xlsx/xform/table/table-xform.d.ts +37 -0
- package/dist/types/xlsx/xlsx.d.ts +59 -0
- package/dist/types/xlsx/xml/theme1.d.ts +1 -0
- package/package.json +159 -0
|
@@ -0,0 +1,772 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.XLSX = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const fflate_1 = require("fflate");
|
|
9
|
+
const stream_1 = require("stream");
|
|
10
|
+
const zip_stream_js_1 = require("../utils/zip-stream");
|
|
11
|
+
const stream_buf_js_1 = require("../utils/stream-buf");
|
|
12
|
+
const utils_js_1 = require("../utils/utils");
|
|
13
|
+
const xml_stream_js_1 = require("../utils/xml-stream");
|
|
14
|
+
const browser_buffer_decode_js_1 = require("../utils/browser-buffer-decode");
|
|
15
|
+
const styles_xform_js_1 = require("./xform/style/styles-xform");
|
|
16
|
+
const core_xform_js_1 = require("./xform/core/core-xform");
|
|
17
|
+
const shared_strings_xform_js_1 = require("./xform/strings/shared-strings-xform");
|
|
18
|
+
const relationships_xform_js_1 = require("./xform/core/relationships-xform");
|
|
19
|
+
const content_types_xform_js_1 = require("./xform/core/content-types-xform");
|
|
20
|
+
const app_xform_js_1 = require("./xform/core/app-xform");
|
|
21
|
+
const workbook_xform_js_1 = require("./xform/book/workbook-xform");
|
|
22
|
+
const worksheet_xform_js_1 = require("./xform/sheet/worksheet-xform");
|
|
23
|
+
const drawing_xform_js_1 = require("./xform/drawing/drawing-xform");
|
|
24
|
+
const table_xform_js_1 = require("./xform/table/table-xform");
|
|
25
|
+
const pivot_cache_records_xform_js_1 = require("./xform/pivot-table/pivot-cache-records-xform");
|
|
26
|
+
const pivot_cache_definition_xform_js_1 = require("./xform/pivot-table/pivot-cache-definition-xform");
|
|
27
|
+
const pivot_table_xform_js_1 = require("./xform/pivot-table/pivot-table-xform");
|
|
28
|
+
const comments_xform_js_1 = require("./xform/comment/comments-xform");
|
|
29
|
+
const vml_notes_xform_js_1 = require("./xform/comment/vml-notes-xform");
|
|
30
|
+
const theme1_js_1 = require("./xml/theme1");
|
|
31
|
+
const rel_type_js_1 = require("./rel-type");
|
|
32
|
+
function fsReadFileAsync(filename, options) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
fs_1.default.readFile(filename, options, (error, data) => {
|
|
35
|
+
if (error) {
|
|
36
|
+
reject(error);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
resolve(data);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
class XLSX {
|
|
45
|
+
constructor(workbook) {
|
|
46
|
+
this.workbook = workbook;
|
|
47
|
+
}
|
|
48
|
+
// ===============================================================================
|
|
49
|
+
// Workbook
|
|
50
|
+
// =========================================================================
|
|
51
|
+
// Read
|
|
52
|
+
async readFile(filename, options) {
|
|
53
|
+
if (!(await (0, utils_js_1.fileExists)(filename))) {
|
|
54
|
+
throw new Error(`File not found: ${filename}`);
|
|
55
|
+
}
|
|
56
|
+
const stream = fs_1.default.createReadStream(filename);
|
|
57
|
+
try {
|
|
58
|
+
const workbook = await this.read(stream, options);
|
|
59
|
+
stream.close();
|
|
60
|
+
return workbook;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
stream.close();
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
parseRels(stream) {
|
|
68
|
+
const xform = new relationships_xform_js_1.RelationshipsXform();
|
|
69
|
+
return xform.parseStream(stream);
|
|
70
|
+
}
|
|
71
|
+
parseWorkbook(stream) {
|
|
72
|
+
const xform = new workbook_xform_js_1.WorkbookXform();
|
|
73
|
+
return xform.parseStream(stream);
|
|
74
|
+
}
|
|
75
|
+
parseSharedStrings(stream) {
|
|
76
|
+
const xform = new shared_strings_xform_js_1.SharedStringsXform();
|
|
77
|
+
return xform.parseStream(stream);
|
|
78
|
+
}
|
|
79
|
+
reconcile(model, options) {
|
|
80
|
+
const workbookXform = new workbook_xform_js_1.WorkbookXform();
|
|
81
|
+
const worksheetXform = new worksheet_xform_js_1.WorkSheetXform(options);
|
|
82
|
+
const drawingXform = new drawing_xform_js_1.DrawingXform();
|
|
83
|
+
const tableXform = new table_xform_js_1.TableXform();
|
|
84
|
+
workbookXform.reconcile(model);
|
|
85
|
+
// reconcile drawings with their rels
|
|
86
|
+
const drawingOptions = {
|
|
87
|
+
media: model.media,
|
|
88
|
+
mediaIndex: model.mediaIndex
|
|
89
|
+
};
|
|
90
|
+
Object.keys(model.drawings).forEach(name => {
|
|
91
|
+
const drawing = model.drawings[name];
|
|
92
|
+
const drawingRel = model.drawingRels[name];
|
|
93
|
+
if (drawingRel) {
|
|
94
|
+
drawingOptions.rels = drawingRel.reduce((o, rel) => {
|
|
95
|
+
o[rel.Id] = rel;
|
|
96
|
+
return o;
|
|
97
|
+
}, {});
|
|
98
|
+
(drawing.anchors || []).forEach((anchor) => {
|
|
99
|
+
const hyperlinks = anchor.picture && anchor.picture.hyperlinks;
|
|
100
|
+
if (hyperlinks && drawingOptions.rels[hyperlinks.rId]) {
|
|
101
|
+
hyperlinks.hyperlink = drawingOptions.rels[hyperlinks.rId].Target;
|
|
102
|
+
delete hyperlinks.rId;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
drawingXform.reconcile(drawing, drawingOptions);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// reconcile tables with the default styles
|
|
109
|
+
const tableOptions = {
|
|
110
|
+
styles: model.styles
|
|
111
|
+
};
|
|
112
|
+
Object.values(model.tables).forEach((table) => {
|
|
113
|
+
tableXform.reconcile(table, tableOptions);
|
|
114
|
+
});
|
|
115
|
+
const sheetOptions = {
|
|
116
|
+
styles: model.styles,
|
|
117
|
+
sharedStrings: model.sharedStrings,
|
|
118
|
+
media: model.media,
|
|
119
|
+
mediaIndex: model.mediaIndex,
|
|
120
|
+
date1904: model.properties && model.properties.date1904,
|
|
121
|
+
drawings: model.drawings,
|
|
122
|
+
comments: model.comments,
|
|
123
|
+
tables: model.tables,
|
|
124
|
+
vmlDrawings: model.vmlDrawings
|
|
125
|
+
};
|
|
126
|
+
model.worksheets.forEach((worksheet) => {
|
|
127
|
+
worksheet.relationships = model.worksheetRels[worksheet.sheetNo];
|
|
128
|
+
worksheetXform.reconcile(worksheet, sheetOptions);
|
|
129
|
+
});
|
|
130
|
+
// delete unnecessary parts
|
|
131
|
+
delete model.worksheetHash;
|
|
132
|
+
delete model.worksheetRels;
|
|
133
|
+
delete model.globalRels;
|
|
134
|
+
delete model.sharedStrings;
|
|
135
|
+
delete model.workbookRels;
|
|
136
|
+
delete model.sheetDefs;
|
|
137
|
+
delete model.styles;
|
|
138
|
+
delete model.mediaIndex;
|
|
139
|
+
delete model.drawings;
|
|
140
|
+
delete model.drawingRels;
|
|
141
|
+
delete model.vmlDrawings;
|
|
142
|
+
}
|
|
143
|
+
async _processWorksheetEntry(stream, model, sheetNo, options, path) {
|
|
144
|
+
const xform = new worksheet_xform_js_1.WorkSheetXform(options);
|
|
145
|
+
const worksheet = await xform.parseStream(stream);
|
|
146
|
+
if (!worksheet) {
|
|
147
|
+
throw new Error(`Failed to parse worksheet ${path}`);
|
|
148
|
+
}
|
|
149
|
+
worksheet.sheetNo = sheetNo;
|
|
150
|
+
model.worksheetHash[path] = worksheet;
|
|
151
|
+
model.worksheets.push(worksheet);
|
|
152
|
+
}
|
|
153
|
+
async _processCommentEntry(stream, model, name) {
|
|
154
|
+
const xform = new comments_xform_js_1.CommentsXform();
|
|
155
|
+
const comments = await xform.parseStream(stream);
|
|
156
|
+
model.comments[`../${name}.xml`] = comments;
|
|
157
|
+
}
|
|
158
|
+
async _processTableEntry(stream, model, name) {
|
|
159
|
+
const xform = new table_xform_js_1.TableXform();
|
|
160
|
+
const table = await xform.parseStream(stream);
|
|
161
|
+
model.tables[`../tables/${name}.xml`] = table;
|
|
162
|
+
}
|
|
163
|
+
async _processWorksheetRelsEntry(stream, model, sheetNo) {
|
|
164
|
+
const xform = new relationships_xform_js_1.RelationshipsXform();
|
|
165
|
+
const relationships = await xform.parseStream(stream);
|
|
166
|
+
model.worksheetRels[sheetNo] = relationships;
|
|
167
|
+
}
|
|
168
|
+
async _processMediaEntry(stream, model, filename) {
|
|
169
|
+
const lastDot = filename.lastIndexOf(".");
|
|
170
|
+
// if we can't determine extension, ignore it
|
|
171
|
+
if (lastDot >= 1) {
|
|
172
|
+
const extension = filename.substr(lastDot + 1);
|
|
173
|
+
const name = filename.substr(0, lastDot);
|
|
174
|
+
await new Promise((resolve, reject) => {
|
|
175
|
+
const streamBuf = new stream_buf_js_1.StreamBuf();
|
|
176
|
+
const cleanup = () => {
|
|
177
|
+
stream.removeListener("error", onError);
|
|
178
|
+
streamBuf.removeListener("error", onError);
|
|
179
|
+
streamBuf.removeListener("finish", onFinish);
|
|
180
|
+
};
|
|
181
|
+
const onFinish = () => {
|
|
182
|
+
cleanup();
|
|
183
|
+
model.mediaIndex[filename] = model.media.length;
|
|
184
|
+
model.mediaIndex[name] = model.media.length;
|
|
185
|
+
const medium = {
|
|
186
|
+
type: "image",
|
|
187
|
+
name,
|
|
188
|
+
extension,
|
|
189
|
+
buffer: streamBuf.toBuffer()
|
|
190
|
+
};
|
|
191
|
+
model.media.push(medium);
|
|
192
|
+
resolve();
|
|
193
|
+
};
|
|
194
|
+
const onError = (error) => {
|
|
195
|
+
cleanup();
|
|
196
|
+
reject(error);
|
|
197
|
+
};
|
|
198
|
+
streamBuf.once("finish", onFinish);
|
|
199
|
+
stream.on("error", onError);
|
|
200
|
+
streamBuf.on("error", onError);
|
|
201
|
+
stream.pipe(streamBuf);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async _processDrawingEntry(entry, model, name) {
|
|
206
|
+
const xform = new drawing_xform_js_1.DrawingXform();
|
|
207
|
+
const drawing = await xform.parseStream(entry);
|
|
208
|
+
model.drawings[name] = drawing;
|
|
209
|
+
}
|
|
210
|
+
async _processDrawingRelsEntry(entry, model, name) {
|
|
211
|
+
const xform = new relationships_xform_js_1.RelationshipsXform();
|
|
212
|
+
const relationships = await xform.parseStream(entry);
|
|
213
|
+
model.drawingRels[name] = relationships;
|
|
214
|
+
}
|
|
215
|
+
async _processVmlDrawingEntry(entry, model, name) {
|
|
216
|
+
const xform = new vml_notes_xform_js_1.VmlNotesXform();
|
|
217
|
+
const vmlDrawing = await xform.parseStream(entry);
|
|
218
|
+
model.vmlDrawings[`../drawings/${name}.vml`] = vmlDrawing;
|
|
219
|
+
}
|
|
220
|
+
async _processThemeEntry(stream, model, name) {
|
|
221
|
+
await new Promise((resolve, reject) => {
|
|
222
|
+
// TODO: stream entry into buffer and store the xml in the model.themes[]
|
|
223
|
+
const streamBuf = new stream_buf_js_1.StreamBuf();
|
|
224
|
+
const cleanup = () => {
|
|
225
|
+
stream.removeListener("error", onError);
|
|
226
|
+
streamBuf.removeListener("error", onError);
|
|
227
|
+
streamBuf.removeListener("finish", onFinish);
|
|
228
|
+
};
|
|
229
|
+
const onFinish = () => {
|
|
230
|
+
cleanup();
|
|
231
|
+
model.themes[name] = streamBuf.read().toString();
|
|
232
|
+
resolve();
|
|
233
|
+
};
|
|
234
|
+
const onError = (err) => {
|
|
235
|
+
cleanup();
|
|
236
|
+
reject(err);
|
|
237
|
+
};
|
|
238
|
+
streamBuf.once("finish", onFinish);
|
|
239
|
+
stream.on("error", onError);
|
|
240
|
+
streamBuf.on("error", onError);
|
|
241
|
+
stream.pipe(streamBuf);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async read(stream, options) {
|
|
245
|
+
// Use streaming unzip with fflate
|
|
246
|
+
const allFiles = {};
|
|
247
|
+
await new Promise((resolve, reject) => {
|
|
248
|
+
let filesProcessed = 0;
|
|
249
|
+
let zipEnded = false;
|
|
250
|
+
let filesStarted = 0;
|
|
251
|
+
const cleanup = () => {
|
|
252
|
+
stream.removeListener("data", onData);
|
|
253
|
+
stream.removeListener("end", onEnd);
|
|
254
|
+
stream.removeListener("error", onError);
|
|
255
|
+
};
|
|
256
|
+
const checkCompletion = () => {
|
|
257
|
+
if (zipEnded && filesProcessed === filesStarted) {
|
|
258
|
+
cleanup();
|
|
259
|
+
resolve();
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
const unzipper = new fflate_1.Unzip((file) => {
|
|
263
|
+
filesStarted++;
|
|
264
|
+
const fileChunks = [];
|
|
265
|
+
let totalLength = 0;
|
|
266
|
+
file.ondata = (err, data, final) => {
|
|
267
|
+
if (err) {
|
|
268
|
+
cleanup();
|
|
269
|
+
reject(err);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (data) {
|
|
273
|
+
fileChunks.push(data);
|
|
274
|
+
totalLength += data.length;
|
|
275
|
+
}
|
|
276
|
+
if (final) {
|
|
277
|
+
// Optimize for single chunk case
|
|
278
|
+
if (fileChunks.length === 1) {
|
|
279
|
+
allFiles[file.name] = fileChunks[0];
|
|
280
|
+
}
|
|
281
|
+
else if (fileChunks.length > 1) {
|
|
282
|
+
const fullData = new Uint8Array(totalLength);
|
|
283
|
+
let offset = 0;
|
|
284
|
+
for (const chunk of fileChunks) {
|
|
285
|
+
fullData.set(chunk, offset);
|
|
286
|
+
offset += chunk.length;
|
|
287
|
+
}
|
|
288
|
+
allFiles[file.name] = fullData;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
allFiles[file.name] = new Uint8Array(0);
|
|
292
|
+
}
|
|
293
|
+
filesProcessed++;
|
|
294
|
+
fileChunks.length = 0;
|
|
295
|
+
checkCompletion();
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
file.start();
|
|
299
|
+
});
|
|
300
|
+
unzipper.register(fflate_1.UnzipInflate);
|
|
301
|
+
const onData = (chunk) => {
|
|
302
|
+
unzipper.push(chunk);
|
|
303
|
+
};
|
|
304
|
+
const onEnd = () => {
|
|
305
|
+
unzipper.push(new Uint8Array(0), true);
|
|
306
|
+
zipEnded = true;
|
|
307
|
+
checkCompletion();
|
|
308
|
+
};
|
|
309
|
+
const onError = (err) => {
|
|
310
|
+
cleanup();
|
|
311
|
+
reject(err);
|
|
312
|
+
};
|
|
313
|
+
stream.on("data", onData);
|
|
314
|
+
stream.on("end", onEnd);
|
|
315
|
+
stream.on("error", onError);
|
|
316
|
+
});
|
|
317
|
+
return this.loadFromFiles(allFiles, options);
|
|
318
|
+
}
|
|
319
|
+
async load(data, options) {
|
|
320
|
+
let buffer;
|
|
321
|
+
// Validate input type
|
|
322
|
+
if (!data ||
|
|
323
|
+
(typeof data === "object" &&
|
|
324
|
+
!Buffer.isBuffer(data) &&
|
|
325
|
+
!(data instanceof Uint8Array) &&
|
|
326
|
+
!(data instanceof ArrayBuffer))) {
|
|
327
|
+
throw new Error("Can't read the data of 'the loaded zip file'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?");
|
|
328
|
+
}
|
|
329
|
+
if (options && options.base64) {
|
|
330
|
+
buffer = Buffer.from(data.toString(), "base64");
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
buffer = data;
|
|
334
|
+
}
|
|
335
|
+
// Create a fake stream from buffer for consistency
|
|
336
|
+
const PassThroughStream = stream_1.PassThrough;
|
|
337
|
+
const stream = new PassThroughStream();
|
|
338
|
+
stream.end(buffer);
|
|
339
|
+
return this.read(stream, options);
|
|
340
|
+
}
|
|
341
|
+
async loadFromFiles(zipData, options) {
|
|
342
|
+
const model = {
|
|
343
|
+
worksheets: [],
|
|
344
|
+
worksheetHash: {},
|
|
345
|
+
worksheetRels: [],
|
|
346
|
+
themes: {},
|
|
347
|
+
media: [],
|
|
348
|
+
mediaIndex: {},
|
|
349
|
+
drawings: {},
|
|
350
|
+
drawingRels: {},
|
|
351
|
+
comments: {},
|
|
352
|
+
tables: {},
|
|
353
|
+
vmlDrawings: {}
|
|
354
|
+
};
|
|
355
|
+
// Convert fflate format to JSZip-like structure for compatibility
|
|
356
|
+
const entries = Object.keys(zipData).map(name => ({
|
|
357
|
+
name,
|
|
358
|
+
dir: name.endsWith("/"),
|
|
359
|
+
data: zipData[name]
|
|
360
|
+
}));
|
|
361
|
+
for (const entry of entries) {
|
|
362
|
+
if (!entry.dir) {
|
|
363
|
+
let entryName = entry.name;
|
|
364
|
+
if (entryName[0] === "/") {
|
|
365
|
+
entryName = entryName.substr(1);
|
|
366
|
+
}
|
|
367
|
+
let stream;
|
|
368
|
+
if (entryName.match(/xl\/media\//) ||
|
|
369
|
+
// themes are not parsed as stream
|
|
370
|
+
entryName.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/)) {
|
|
371
|
+
stream = new stream_1.PassThrough();
|
|
372
|
+
stream.end(Buffer.from(entry.data));
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
// use object mode to avoid buffer-string convention
|
|
376
|
+
stream = new stream_1.PassThrough({
|
|
377
|
+
readableObjectMode: true,
|
|
378
|
+
writableObjectMode: true
|
|
379
|
+
});
|
|
380
|
+
const content = (0, browser_buffer_decode_js_1.bufferToString)(Buffer.from(entry.data));
|
|
381
|
+
stream.end(content);
|
|
382
|
+
}
|
|
383
|
+
let match;
|
|
384
|
+
match = entryName.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
|
|
385
|
+
if (match) {
|
|
386
|
+
const sheetNo = parseInt(match[1], 10);
|
|
387
|
+
await this._processWorksheetEntry(stream, model, sheetNo, options, entryName);
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
switch (entryName) {
|
|
391
|
+
case "_rels/.rels":
|
|
392
|
+
model.globalRels = await this.parseRels(stream);
|
|
393
|
+
break;
|
|
394
|
+
case "xl/workbook.xml": {
|
|
395
|
+
const workbook = await this.parseWorkbook(stream);
|
|
396
|
+
model.sheets = workbook.sheets;
|
|
397
|
+
model.definedNames = workbook.definedNames;
|
|
398
|
+
model.views = workbook.views;
|
|
399
|
+
model.properties = workbook.properties;
|
|
400
|
+
model.calcProperties = workbook.calcProperties;
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
case "xl/sharedStrings.xml":
|
|
404
|
+
model.sharedStrings = new shared_strings_xform_js_1.SharedStringsXform();
|
|
405
|
+
await model.sharedStrings.parseStream(stream);
|
|
406
|
+
break;
|
|
407
|
+
case "xl/_rels/workbook.xml.rels":
|
|
408
|
+
model.workbookRels = await this.parseRels(stream);
|
|
409
|
+
break;
|
|
410
|
+
case "docProps/app.xml": {
|
|
411
|
+
const appXform = new app_xform_js_1.AppXform();
|
|
412
|
+
const appProperties = await appXform.parseStream(stream);
|
|
413
|
+
model.company = appProperties.company;
|
|
414
|
+
model.manager = appProperties.manager;
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
case "docProps/core.xml": {
|
|
418
|
+
const coreXform = new core_xform_js_1.CoreXform();
|
|
419
|
+
const coreProperties = await coreXform.parseStream(stream);
|
|
420
|
+
Object.assign(model, coreProperties);
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
case "xl/styles.xml":
|
|
424
|
+
model.styles = new styles_xform_js_1.StylesXform();
|
|
425
|
+
await model.styles.parseStream(stream);
|
|
426
|
+
break;
|
|
427
|
+
default: {
|
|
428
|
+
match = entryName.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml[.]rels/);
|
|
429
|
+
if (match) {
|
|
430
|
+
const sheetNo = parseInt(match[1], 10);
|
|
431
|
+
await this._processWorksheetRelsEntry(stream, model, sheetNo);
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
match = entryName.match(/xl\/media\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/);
|
|
435
|
+
if (match) {
|
|
436
|
+
await this._processMediaEntry(stream, model, match[1]);
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
match = entryName.match(/xl\/drawings\/(drawing\d+)[.]xml/);
|
|
440
|
+
if (match) {
|
|
441
|
+
await this._processDrawingEntry(stream, model, match[1]);
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
match = entryName.match(/xl\/drawings\/_rels\/(drawing\d+)[.]xml[.]rels/);
|
|
445
|
+
if (match) {
|
|
446
|
+
await this._processDrawingRelsEntry(stream, model, match[1]);
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
match = entryName.match(/xl\/drawings\/(vmlDrawing\d+)[.]vml/);
|
|
450
|
+
if (match) {
|
|
451
|
+
await this._processVmlDrawingEntry(stream, model, match[1]);
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
match = entryName.match(/xl\/comments(\d+)[.]xml/);
|
|
455
|
+
if (match) {
|
|
456
|
+
await this._processCommentEntry(stream, model, `comments${match[1]}`);
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
match = entryName.match(/xl\/tables\/(table\d+)[.]xml/);
|
|
460
|
+
if (match) {
|
|
461
|
+
await this._processTableEntry(stream, model, match[1]);
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
match = entryName.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/);
|
|
465
|
+
if (match) {
|
|
466
|
+
await this._processThemeEntry(stream, model, match[1]);
|
|
467
|
+
break;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
this.reconcile(model, options);
|
|
475
|
+
// apply model
|
|
476
|
+
this.workbook.model = model;
|
|
477
|
+
return this.workbook;
|
|
478
|
+
}
|
|
479
|
+
// =========================================================================
|
|
480
|
+
// Write
|
|
481
|
+
async addContentTypes(zip, model) {
|
|
482
|
+
const xform = new content_types_xform_js_1.ContentTypesXform();
|
|
483
|
+
const xml = xform.toXml(model);
|
|
484
|
+
zip.append(xml, { name: "[Content_Types].xml" });
|
|
485
|
+
}
|
|
486
|
+
async addApp(zip, model) {
|
|
487
|
+
const xform = new app_xform_js_1.AppXform();
|
|
488
|
+
const xml = xform.toXml(model);
|
|
489
|
+
zip.append(xml, { name: "docProps/app.xml" });
|
|
490
|
+
}
|
|
491
|
+
async addCore(zip, model) {
|
|
492
|
+
const xform = new core_xform_js_1.CoreXform();
|
|
493
|
+
zip.append(xform.toXml(model), { name: "docProps/core.xml" });
|
|
494
|
+
}
|
|
495
|
+
async addThemes(zip, model) {
|
|
496
|
+
const themes = model.themes || { theme1: theme1_js_1.theme1Xml };
|
|
497
|
+
Object.keys(themes).forEach(name => {
|
|
498
|
+
const xml = themes[name];
|
|
499
|
+
const path = `xl/theme/${name}.xml`;
|
|
500
|
+
zip.append(xml, { name: path });
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
async addOfficeRels(zip, _model) {
|
|
504
|
+
const xform = new relationships_xform_js_1.RelationshipsXform();
|
|
505
|
+
const xml = xform.toXml([
|
|
506
|
+
{ Id: "rId1", Type: XLSX.RelType.OfficeDocument, Target: "xl/workbook.xml" },
|
|
507
|
+
{ Id: "rId2", Type: XLSX.RelType.CoreProperties, Target: "docProps/core.xml" },
|
|
508
|
+
{ Id: "rId3", Type: XLSX.RelType.ExtenderProperties, Target: "docProps/app.xml" }
|
|
509
|
+
]);
|
|
510
|
+
zip.append(xml, { name: "_rels/.rels" });
|
|
511
|
+
}
|
|
512
|
+
async addWorkbookRels(zip, model) {
|
|
513
|
+
let count = 1;
|
|
514
|
+
const relationships = [
|
|
515
|
+
{ Id: `rId${count++}`, Type: XLSX.RelType.Styles, Target: "styles.xml" },
|
|
516
|
+
{ Id: `rId${count++}`, Type: XLSX.RelType.Theme, Target: "theme/theme1.xml" }
|
|
517
|
+
];
|
|
518
|
+
if (model.sharedStrings.count) {
|
|
519
|
+
relationships.push({
|
|
520
|
+
Id: `rId${count++}`,
|
|
521
|
+
Type: XLSX.RelType.SharedStrings,
|
|
522
|
+
Target: "sharedStrings.xml"
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
if ((model.pivotTables || []).length) {
|
|
526
|
+
const pivotTable = model.pivotTables[0];
|
|
527
|
+
pivotTable.rId = `rId${count++}`;
|
|
528
|
+
relationships.push({
|
|
529
|
+
Id: pivotTable.rId,
|
|
530
|
+
Type: XLSX.RelType.PivotCacheDefinition,
|
|
531
|
+
Target: "pivotCache/pivotCacheDefinition1.xml"
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
model.worksheets.forEach((worksheet) => {
|
|
535
|
+
worksheet.rId = `rId${count++}`;
|
|
536
|
+
relationships.push({
|
|
537
|
+
Id: worksheet.rId,
|
|
538
|
+
Type: XLSX.RelType.Worksheet,
|
|
539
|
+
Target: `worksheets/sheet${worksheet.id}.xml`
|
|
540
|
+
});
|
|
541
|
+
});
|
|
542
|
+
const xform = new relationships_xform_js_1.RelationshipsXform();
|
|
543
|
+
const xml = xform.toXml(relationships);
|
|
544
|
+
zip.append(xml, { name: "xl/_rels/workbook.xml.rels" });
|
|
545
|
+
}
|
|
546
|
+
async addSharedStrings(zip, model) {
|
|
547
|
+
if (model.sharedStrings && model.sharedStrings.count) {
|
|
548
|
+
zip.append(model.sharedStrings.xml, { name: "xl/sharedStrings.xml" });
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
async addStyles(zip, model) {
|
|
552
|
+
const { xml } = model.styles;
|
|
553
|
+
if (xml) {
|
|
554
|
+
zip.append(xml, { name: "xl/styles.xml" });
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
async addWorkbook(zip, model) {
|
|
558
|
+
const xform = new workbook_xform_js_1.WorkbookXform();
|
|
559
|
+
zip.append(xform.toXml(model), { name: "xl/workbook.xml" });
|
|
560
|
+
}
|
|
561
|
+
async addWorksheets(zip, model) {
|
|
562
|
+
// preparation phase
|
|
563
|
+
const worksheetXform = new worksheet_xform_js_1.WorkSheetXform();
|
|
564
|
+
const relationshipsXform = new relationships_xform_js_1.RelationshipsXform();
|
|
565
|
+
const commentsXform = new comments_xform_js_1.CommentsXform();
|
|
566
|
+
const vmlNotesXform = new vml_notes_xform_js_1.VmlNotesXform();
|
|
567
|
+
// write sheets
|
|
568
|
+
model.worksheets.forEach((worksheet) => {
|
|
569
|
+
let xmlStream = new xml_stream_js_1.XmlStream();
|
|
570
|
+
worksheetXform.render(xmlStream, worksheet);
|
|
571
|
+
zip.append(xmlStream.xml, { name: `xl/worksheets/sheet${worksheet.id}.xml` });
|
|
572
|
+
if (worksheet.rels && worksheet.rels.length) {
|
|
573
|
+
xmlStream = new xml_stream_js_1.XmlStream();
|
|
574
|
+
relationshipsXform.render(xmlStream, worksheet.rels);
|
|
575
|
+
zip.append(xmlStream.xml, { name: `xl/worksheets/_rels/sheet${worksheet.id}.xml.rels` });
|
|
576
|
+
}
|
|
577
|
+
if (worksheet.comments.length > 0) {
|
|
578
|
+
xmlStream = new xml_stream_js_1.XmlStream();
|
|
579
|
+
commentsXform.render(xmlStream, worksheet);
|
|
580
|
+
zip.append(xmlStream.xml, { name: `xl/comments${worksheet.id}.xml` });
|
|
581
|
+
xmlStream = new xml_stream_js_1.XmlStream();
|
|
582
|
+
vmlNotesXform.render(xmlStream, worksheet);
|
|
583
|
+
zip.append(xmlStream.xml, { name: `xl/drawings/vmlDrawing${worksheet.id}.vml` });
|
|
584
|
+
}
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
async addMedia(zip, model) {
|
|
588
|
+
await Promise.all(model.media.map(async (medium) => {
|
|
589
|
+
if (medium.type === "image") {
|
|
590
|
+
const filename = `xl/media/${medium.name}.${medium.extension}`;
|
|
591
|
+
if (medium.filename) {
|
|
592
|
+
const data = await fsReadFileAsync(medium.filename);
|
|
593
|
+
return zip.append(data, { name: filename });
|
|
594
|
+
}
|
|
595
|
+
if (medium.buffer) {
|
|
596
|
+
return zip.append(medium.buffer, { name: filename });
|
|
597
|
+
}
|
|
598
|
+
if (medium.base64) {
|
|
599
|
+
const dataimg64 = medium.base64;
|
|
600
|
+
const content = dataimg64.substring(dataimg64.indexOf(",") + 1);
|
|
601
|
+
return zip.append(content, { name: filename, base64: true });
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
throw new Error("Unsupported media");
|
|
605
|
+
}));
|
|
606
|
+
}
|
|
607
|
+
addDrawings(zip, model) {
|
|
608
|
+
const drawingXform = new drawing_xform_js_1.DrawingXform();
|
|
609
|
+
const relsXform = new relationships_xform_js_1.RelationshipsXform();
|
|
610
|
+
model.worksheets.forEach((worksheet) => {
|
|
611
|
+
const { drawing } = worksheet;
|
|
612
|
+
if (drawing) {
|
|
613
|
+
drawingXform.prepare(drawing);
|
|
614
|
+
let xml = drawingXform.toXml(drawing);
|
|
615
|
+
zip.append(xml, { name: `xl/drawings/${drawing.name}.xml` });
|
|
616
|
+
xml = relsXform.toXml(drawing.rels);
|
|
617
|
+
zip.append(xml, { name: `xl/drawings/_rels/${drawing.name}.xml.rels` });
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
addTables(zip, model) {
|
|
622
|
+
const tableXform = new table_xform_js_1.TableXform();
|
|
623
|
+
model.worksheets.forEach((worksheet) => {
|
|
624
|
+
const { tables } = worksheet;
|
|
625
|
+
tables.forEach((table) => {
|
|
626
|
+
tableXform.prepare(table, {});
|
|
627
|
+
const tableXml = tableXform.toXml(table);
|
|
628
|
+
zip.append(tableXml, { name: `xl/tables/${table.target}` });
|
|
629
|
+
});
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
addPivotTables(zip, model) {
|
|
633
|
+
if (!model.pivotTables.length) {
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
const pivotTable = model.pivotTables[0];
|
|
637
|
+
const pivotCacheRecordsXform = new pivot_cache_records_xform_js_1.PivotCacheRecordsXform();
|
|
638
|
+
const pivotCacheDefinitionXform = new pivot_cache_definition_xform_js_1.PivotCacheDefinitionXform();
|
|
639
|
+
const pivotTableXform = new pivot_table_xform_js_1.PivotTableXform();
|
|
640
|
+
const relsXform = new relationships_xform_js_1.RelationshipsXform();
|
|
641
|
+
// pivot cache records
|
|
642
|
+
let xml = pivotCacheRecordsXform.toXml(pivotTable);
|
|
643
|
+
zip.append(xml, { name: "xl/pivotCache/pivotCacheRecords1.xml" });
|
|
644
|
+
// pivot cache definition
|
|
645
|
+
xml = pivotCacheDefinitionXform.toXml(pivotTable);
|
|
646
|
+
zip.append(xml, { name: "xl/pivotCache/pivotCacheDefinition1.xml" });
|
|
647
|
+
// pivot cache definition rels
|
|
648
|
+
xml = relsXform.toXml([
|
|
649
|
+
{
|
|
650
|
+
Id: "rId1",
|
|
651
|
+
Type: XLSX.RelType.PivotCacheRecords,
|
|
652
|
+
Target: "pivotCacheRecords1.xml"
|
|
653
|
+
}
|
|
654
|
+
]);
|
|
655
|
+
zip.append(xml, { name: "xl/pivotCache/_rels/pivotCacheDefinition1.xml.rels" });
|
|
656
|
+
// pivot table
|
|
657
|
+
xml = pivotTableXform.toXml(pivotTable);
|
|
658
|
+
zip.append(xml, { name: "xl/pivotTables/pivotTable1.xml" });
|
|
659
|
+
xml = relsXform.toXml([
|
|
660
|
+
{
|
|
661
|
+
Id: "rId1",
|
|
662
|
+
Type: XLSX.RelType.PivotCacheDefinition,
|
|
663
|
+
Target: "../pivotCache/pivotCacheDefinition1.xml"
|
|
664
|
+
}
|
|
665
|
+
]);
|
|
666
|
+
zip.append(xml, { name: "xl/pivotTables/_rels/pivotTable1.xml.rels" });
|
|
667
|
+
}
|
|
668
|
+
_finalize(zip) {
|
|
669
|
+
return new Promise((resolve, reject) => {
|
|
670
|
+
zip.on("finish", () => {
|
|
671
|
+
resolve(this);
|
|
672
|
+
});
|
|
673
|
+
zip.on("error", reject);
|
|
674
|
+
zip.finalize();
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
prepareModel(model, options) {
|
|
678
|
+
// ensure following properties have sane values
|
|
679
|
+
model.creator = model.creator || "ExcelTS";
|
|
680
|
+
model.lastModifiedBy = model.lastModifiedBy || "ExcelTS";
|
|
681
|
+
model.created = model.created || new Date();
|
|
682
|
+
model.modified = model.modified || new Date();
|
|
683
|
+
model.useSharedStrings =
|
|
684
|
+
options.useSharedStrings !== undefined ? options.useSharedStrings : true;
|
|
685
|
+
model.useStyles = options.useStyles !== undefined ? options.useStyles : true;
|
|
686
|
+
// Manage the shared strings
|
|
687
|
+
model.sharedStrings = new shared_strings_xform_js_1.SharedStringsXform();
|
|
688
|
+
// add a style manager to handle cell formats, fonts, etc.
|
|
689
|
+
model.styles = model.useStyles ? new styles_xform_js_1.StylesXform(true) : new styles_xform_js_1.StylesXform.Mock();
|
|
690
|
+
// prepare all of the things before the render
|
|
691
|
+
const workbookXform = new workbook_xform_js_1.WorkbookXform();
|
|
692
|
+
const worksheetXform = new worksheet_xform_js_1.WorkSheetXform();
|
|
693
|
+
workbookXform.prepare(model);
|
|
694
|
+
const worksheetOptions = {
|
|
695
|
+
sharedStrings: model.sharedStrings,
|
|
696
|
+
styles: model.styles,
|
|
697
|
+
date1904: model.properties.date1904,
|
|
698
|
+
drawingsCount: 0,
|
|
699
|
+
media: model.media
|
|
700
|
+
};
|
|
701
|
+
worksheetOptions.drawings = model.drawings = [];
|
|
702
|
+
worksheetOptions.commentRefs = model.commentRefs = [];
|
|
703
|
+
let tableCount = 0;
|
|
704
|
+
model.tables = [];
|
|
705
|
+
model.worksheets.forEach((worksheet) => {
|
|
706
|
+
// assign unique filenames to tables
|
|
707
|
+
worksheet.tables.forEach((table) => {
|
|
708
|
+
tableCount++;
|
|
709
|
+
table.target = `table${tableCount}.xml`;
|
|
710
|
+
table.id = tableCount;
|
|
711
|
+
model.tables.push(table);
|
|
712
|
+
});
|
|
713
|
+
worksheetXform.prepare(worksheet, worksheetOptions);
|
|
714
|
+
});
|
|
715
|
+
// TODO: workbook drawing list
|
|
716
|
+
}
|
|
717
|
+
async write(stream, options) {
|
|
718
|
+
options = options || {};
|
|
719
|
+
const { model } = this.workbook;
|
|
720
|
+
const zip = new zip_stream_js_1.ZipWriter(options.zip);
|
|
721
|
+
zip.pipe(stream);
|
|
722
|
+
this.prepareModel(model, options);
|
|
723
|
+
// render
|
|
724
|
+
await this.addContentTypes(zip, model);
|
|
725
|
+
await this.addOfficeRels(zip, model);
|
|
726
|
+
await this.addWorkbookRels(zip, model);
|
|
727
|
+
await this.addWorksheets(zip, model);
|
|
728
|
+
await this.addSharedStrings(zip, model); // always after worksheets
|
|
729
|
+
this.addDrawings(zip, model);
|
|
730
|
+
this.addTables(zip, model);
|
|
731
|
+
this.addPivotTables(zip, model);
|
|
732
|
+
await Promise.all([this.addThemes(zip, model), this.addStyles(zip, model)]);
|
|
733
|
+
await this.addMedia(zip, model);
|
|
734
|
+
await Promise.all([this.addApp(zip, model), this.addCore(zip, model)]);
|
|
735
|
+
await this.addWorkbook(zip, model);
|
|
736
|
+
return this._finalize(zip);
|
|
737
|
+
}
|
|
738
|
+
writeFile(filename, options) {
|
|
739
|
+
const stream = fs_1.default.createWriteStream(filename);
|
|
740
|
+
return new Promise((resolve, reject) => {
|
|
741
|
+
const cleanup = () => {
|
|
742
|
+
stream.removeListener("finish", onFinish);
|
|
743
|
+
stream.removeListener("error", onError);
|
|
744
|
+
};
|
|
745
|
+
const onFinish = () => {
|
|
746
|
+
cleanup();
|
|
747
|
+
resolve();
|
|
748
|
+
};
|
|
749
|
+
const onError = (error) => {
|
|
750
|
+
cleanup();
|
|
751
|
+
reject(error);
|
|
752
|
+
};
|
|
753
|
+
stream.once("finish", onFinish);
|
|
754
|
+
stream.on("error", onError);
|
|
755
|
+
this.write(stream, options)
|
|
756
|
+
.then(() => {
|
|
757
|
+
stream.end();
|
|
758
|
+
})
|
|
759
|
+
.catch(err => {
|
|
760
|
+
cleanup();
|
|
761
|
+
reject(err);
|
|
762
|
+
});
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
async writeBuffer(options) {
|
|
766
|
+
const stream = new stream_buf_js_1.StreamBuf();
|
|
767
|
+
await this.write(stream, options);
|
|
768
|
+
return stream.read();
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
exports.XLSX = XLSX;
|
|
772
|
+
XLSX.RelType = rel_type_js_1.RelType;
|