@cj-tech-master/excelts 5.0.6 → 5.1.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/dist/browser/index.browser.d.ts +1 -1
- package/dist/browser/index.d.ts +1 -1
- package/dist/browser/modules/archive/unzip/stream.base.js +19 -19
- package/dist/browser/modules/archive/unzip/stream.browser.js +3 -3
- package/dist/browser/modules/csv/csv-core.js +6 -3
- package/dist/browser/modules/csv/csv.browser.js +2 -2
- package/dist/browser/modules/csv/csv.js +1 -1
- package/dist/browser/modules/excel/anchor.js +4 -4
- package/dist/browser/modules/excel/cell.js +5 -5
- package/dist/browser/modules/excel/column.js +4 -4
- package/dist/browser/modules/excel/defined-names.js +1 -1
- package/dist/browser/modules/excel/form-control.js +1 -1
- package/dist/browser/modules/excel/pivot-table.d.ts +168 -17
- package/dist/browser/modules/excel/pivot-table.js +278 -70
- package/dist/browser/modules/excel/row.js +4 -4
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +4 -4
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +4 -4
- package/dist/browser/modules/excel/stream/worksheet-reader.js +1 -1
- package/dist/browser/modules/excel/stream/worksheet-writer.js +4 -4
- package/dist/browser/modules/excel/table.js +2 -2
- package/dist/browser/modules/excel/types.d.ts +0 -4
- package/dist/browser/modules/excel/utils/cell-format.js +3 -3
- package/dist/browser/modules/excel/utils/shared-formula.js +1 -1
- package/dist/browser/modules/excel/utils/stream-buf.js +2 -2
- package/dist/browser/modules/excel/utils/string-buf.js +1 -1
- package/dist/browser/modules/excel/workbook.d.ts +0 -2
- package/dist/browser/modules/excel/workbook.js +4 -5
- package/dist/browser/modules/excel/worksheet.js +9 -9
- package/dist/browser/modules/excel/xlsx/xform/base-xform.d.ts +5 -5
- package/dist/browser/modules/excel/xlsx/xform/base-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/book/defined-name-xform.js +2 -2
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-view-xform.js +4 -4
- package/dist/browser/modules/excel/xlsx/xform/book/workbook-xform.js +16 -4
- package/dist/browser/modules/excel/xlsx/xform/comment/comment-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/comment/comments-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +3 -4
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-shape-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/composite-xform.d.ts +1 -1
- package/dist/browser/modules/excel/xlsx/xform/core/app-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/core/content-types-xform.js +24 -11
- package/dist/browser/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/ext-xform.js +2 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/drawing/vml-drawing-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/list-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/list-xform.js +3 -3
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +5 -15
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +134 -52
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field.d.ts +14 -15
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/cache-field.js +244 -70
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +13 -29
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +213 -37
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +7 -34
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +143 -41
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +101 -27
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +793 -408
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.d.ts +78 -0
- package/dist/browser/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.js +149 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/cell-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/col-xform.js +3 -3
- package/dist/browser/modules/excel/xlsx/xform/sheet/data-validations-xform.js +3 -3
- package/dist/browser/modules/excel/xlsx/xform/sheet/header-footer-xform.js +6 -6
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.js +11 -11
- package/dist/browser/modules/excel/xlsx/xform/sheet/row-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +3 -3
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +10 -10
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +12 -12
- package/dist/browser/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +2 -2
- package/dist/browser/modules/excel/xlsx/xform/style/color-xform.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/style/style-xform.js +5 -5
- package/dist/browser/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/table/filter-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/table/table-column-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xform/table/table-xform.d.ts +1 -2
- package/dist/browser/modules/excel/xlsx/xlsx.browser.d.ts +5 -2
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +88 -54
- package/dist/browser/utils/env.d.ts +0 -5
- package/dist/browser/utils/env.js +0 -7
- package/dist/browser/utils/utils.base.d.ts +8 -13
- package/dist/browser/utils/utils.base.js +40 -47
- package/dist/browser/utils/utils.browser.d.ts +1 -1
- package/dist/browser/utils/utils.browser.js +1 -1
- package/dist/browser/utils/utils.d.ts +1 -1
- package/dist/browser/utils/utils.js +1 -1
- package/dist/cjs/modules/archive/unzip/stream.base.js +19 -19
- package/dist/cjs/modules/archive/unzip/stream.browser.js +3 -3
- package/dist/cjs/modules/csv/csv-core.js +6 -3
- package/dist/cjs/modules/csv/csv.browser.js +2 -2
- package/dist/cjs/modules/csv/csv.js +1 -1
- package/dist/cjs/modules/excel/anchor.js +4 -4
- package/dist/cjs/modules/excel/cell.js +5 -5
- package/dist/cjs/modules/excel/column.js +4 -4
- package/dist/cjs/modules/excel/defined-names.js +1 -1
- package/dist/cjs/modules/excel/form-control.js +1 -1
- package/dist/cjs/modules/excel/pivot-table.js +280 -70
- package/dist/cjs/modules/excel/row.js +4 -4
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +4 -4
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
- package/dist/cjs/modules/excel/stream/worksheet-reader.js +1 -1
- package/dist/cjs/modules/excel/stream/worksheet-writer.js +4 -4
- package/dist/cjs/modules/excel/table.js +2 -2
- package/dist/cjs/modules/excel/utils/cell-format.js +3 -3
- package/dist/cjs/modules/excel/utils/shared-formula.js +1 -1
- package/dist/cjs/modules/excel/utils/stream-buf.js +2 -2
- package/dist/cjs/modules/excel/utils/string-buf.js +1 -1
- package/dist/cjs/modules/excel/workbook.js +4 -5
- package/dist/cjs/modules/excel/worksheet.js +9 -9
- package/dist/cjs/modules/excel/xlsx/xform/base-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/book/defined-name-xform.js +2 -2
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-view-xform.js +4 -4
- package/dist/cjs/modules/excel/xlsx/xform/book/workbook-xform.js +16 -4
- package/dist/cjs/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-shape-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/core/app-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/core/content-types-xform.js +24 -11
- package/dist/cjs/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/drawing/ext-xform.js +2 -2
- package/dist/cjs/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/list-xform.js +3 -3
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +133 -51
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/cache-field.js +245 -71
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +212 -36
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +142 -40
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +793 -408
- package/dist/cjs/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.js +153 -0
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cell-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/sheet/col-xform.js +3 -3
- package/dist/cjs/modules/excel/xlsx/xform/sheet/data-validations-xform.js +3 -3
- package/dist/cjs/modules/excel/xlsx/xform/sheet/header-footer-xform.js +6 -6
- package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-xform.js +11 -11
- package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +3 -3
- package/dist/cjs/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +10 -10
- package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +12 -12
- package/dist/cjs/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +2 -2
- package/dist/cjs/modules/excel/xlsx/xform/style/color-xform.js +1 -1
- package/dist/cjs/modules/excel/xlsx/xform/style/style-xform.js +5 -5
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +88 -54
- package/dist/cjs/utils/env.js +0 -8
- package/dist/cjs/utils/utils.base.js +41 -54
- package/dist/cjs/utils/utils.browser.js +2 -7
- package/dist/cjs/utils/utils.js +2 -7
- package/dist/esm/modules/archive/unzip/stream.base.js +19 -19
- package/dist/esm/modules/archive/unzip/stream.browser.js +3 -3
- package/dist/esm/modules/csv/csv-core.js +6 -3
- package/dist/esm/modules/csv/csv.browser.js +2 -2
- package/dist/esm/modules/csv/csv.js +1 -1
- package/dist/esm/modules/excel/anchor.js +4 -4
- package/dist/esm/modules/excel/cell.js +5 -5
- package/dist/esm/modules/excel/column.js +4 -4
- package/dist/esm/modules/excel/defined-names.js +1 -1
- package/dist/esm/modules/excel/form-control.js +1 -1
- package/dist/esm/modules/excel/pivot-table.js +278 -70
- package/dist/esm/modules/excel/row.js +4 -4
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +4 -4
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +4 -4
- package/dist/esm/modules/excel/stream/worksheet-reader.js +1 -1
- package/dist/esm/modules/excel/stream/worksheet-writer.js +4 -4
- package/dist/esm/modules/excel/table.js +2 -2
- package/dist/esm/modules/excel/utils/cell-format.js +3 -3
- package/dist/esm/modules/excel/utils/shared-formula.js +1 -1
- package/dist/esm/modules/excel/utils/stream-buf.js +2 -2
- package/dist/esm/modules/excel/utils/string-buf.js +1 -1
- package/dist/esm/modules/excel/workbook.js +4 -5
- package/dist/esm/modules/excel/worksheet.js +9 -9
- package/dist/esm/modules/excel/xlsx/xform/base-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/book/defined-name-xform.js +2 -2
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-view-xform.js +4 -4
- package/dist/esm/modules/excel/xlsx/xform/book/workbook-xform.js +16 -4
- package/dist/esm/modules/excel/xlsx/xform/comment/style/vml-position-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/comment/style/vml-protection-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-shape-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/comment/vml-textbox-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/core/app-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/core/content-types-xform.js +24 -11
- package/dist/esm/modules/excel/xlsx/xform/drawing/base-cell-anchor-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/drawing/ext-xform.js +2 -2
- package/dist/esm/modules/excel/xlsx/xform/drawing/one-cell-anchor-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/list-xform.js +3 -3
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/cache-field-xform.js +134 -52
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/cache-field.js +244 -70
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +213 -37
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.js +143 -41
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.js +793 -408
- package/dist/esm/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.js +149 -0
- package/dist/esm/modules/excel/xlsx/xform/sheet/cell-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/cf-rule-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf/conditional-formattings-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/col-xform.js +3 -3
- package/dist/esm/modules/excel/xlsx/xform/sheet/data-validations-xform.js +3 -3
- package/dist/esm/modules/excel/xlsx/xform/sheet/header-footer-xform.js +6 -6
- package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-xform.js +11 -11
- package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-format-properties-xform.js +3 -3
- package/dist/esm/modules/excel/xlsx/xform/sheet/sheet-view-xform.js +10 -10
- package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +12 -12
- package/dist/esm/modules/excel/xlsx/xform/strings/phonetic-text-xform.js +2 -2
- package/dist/esm/modules/excel/xlsx/xform/style/color-xform.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/style/style-xform.js +5 -5
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +88 -54
- package/dist/esm/utils/env.js +0 -7
- package/dist/esm/utils/utils.base.js +40 -47
- package/dist/esm/utils/utils.browser.js +1 -1
- package/dist/esm/utils/utils.js +1 -1
- package/dist/iife/excelts.iife.js +1553 -718
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +36 -105
- package/dist/types/index.browser.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/modules/excel/pivot-table.d.ts +168 -17
- package/dist/types/modules/excel/types.d.ts +0 -4
- package/dist/types/modules/excel/workbook.d.ts +0 -2
- package/dist/types/modules/excel/xlsx/xform/base-xform.d.ts +5 -5
- package/dist/types/modules/excel/xlsx/xform/comment/comment-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/comment/comments-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/comment/style/vml-position-xform.d.ts +3 -4
- package/dist/types/modules/excel/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/comment/vml-notes-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/composite-xform.d.ts +1 -1
- package/dist/types/modules/excel/xlsx/xform/drawing/blip-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/cell-position-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/drawing-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/ext-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/drawing/vml-drawing-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/list-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/pivot-table/cache-field-xform.d.ts +5 -15
- package/dist/types/modules/excel/xlsx/xform/pivot-table/cache-field.d.ts +14 -15
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +13 -29
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +7 -34
- package/dist/types/modules/excel/xlsx/xform/pivot-table/pivot-table-xform.d.ts +101 -27
- package/dist/types/modules/excel/xlsx/xform/pivot-table/raw-xml-collector.d.ts +78 -0
- package/dist/types/modules/excel/xlsx/xform/sheet/row-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/auto-filter-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/custom-filter-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/filter-column-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/filter-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/table-column-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/table-style-info-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xform/table/table-xform.d.ts +1 -2
- package/dist/types/modules/excel/xlsx/xlsx.browser.d.ts +5 -2
- package/dist/types/utils/env.d.ts +0 -5
- package/dist/types/utils/utils.base.d.ts +8 -13
- package/dist/types/utils/utils.browser.d.ts +1 -1
- package/dist/types/utils/utils.d.ts +1 -1
- package/package.json +1 -1
|
@@ -233,8 +233,8 @@ class Workbook {
|
|
|
233
233
|
// ===========================================================================
|
|
234
234
|
get model() {
|
|
235
235
|
return {
|
|
236
|
-
creator: this.creator
|
|
237
|
-
lastModifiedBy: this.lastModifiedBy
|
|
236
|
+
creator: this.creator ?? "Unknown",
|
|
237
|
+
lastModifiedBy: this.lastModifiedBy ?? "Unknown",
|
|
238
238
|
lastPrinted: this.lastPrinted,
|
|
239
239
|
created: this.created,
|
|
240
240
|
modified: this.modified,
|
|
@@ -296,10 +296,9 @@ class Workbook {
|
|
|
296
296
|
this._definedNames.model = value.definedNames;
|
|
297
297
|
this.views = value.views;
|
|
298
298
|
this._themes = value.themes;
|
|
299
|
-
this.media = value.media
|
|
299
|
+
this.media = value.media ?? [];
|
|
300
300
|
// Handle pivot tables - either newly created or loaded from file
|
|
301
|
-
|
|
302
|
-
this.pivotTables = value.pivotTables || value.loadedPivotTables || [];
|
|
301
|
+
this.pivotTables = value.pivotTables ?? [];
|
|
303
302
|
// Preserve passthrough files (charts, etc.) for round-trip preservation
|
|
304
303
|
this._passthrough = value.passthrough || {};
|
|
305
304
|
// Preserve raw drawing data for drawings with chart references
|
|
@@ -24,12 +24,12 @@ class Worksheet {
|
|
|
24
24
|
options = options || {};
|
|
25
25
|
this._workbook = options.workbook;
|
|
26
26
|
// in a workbook, each sheet will have a number
|
|
27
|
-
this.id = options.id
|
|
28
|
-
this.orderNo = options.orderNo
|
|
27
|
+
this.id = options.id ?? 0;
|
|
28
|
+
this.orderNo = options.orderNo ?? 0;
|
|
29
29
|
// and a name - use the setter to ensure validation and truncation
|
|
30
30
|
this.name = options.name || `sheet${this.id}`;
|
|
31
31
|
// add a state
|
|
32
|
-
this.state = options.state
|
|
32
|
+
this.state = options.state ?? "visible";
|
|
33
33
|
// rows allows access organised by row. Sparse array of arrays indexed by row-1, col
|
|
34
34
|
// Note: _rows is zero based. Must subtract 1 to go from cell.row to index
|
|
35
35
|
this._rows = [];
|
|
@@ -89,8 +89,8 @@ class Worksheet {
|
|
|
89
89
|
}, options.headerFooter);
|
|
90
90
|
this.dataValidations = new data_validations_1.DataValidations();
|
|
91
91
|
// for freezepanes, split, zoom, gridlines, etc
|
|
92
|
-
this.views = options.views
|
|
93
|
-
this.autoFilter = options.autoFilter
|
|
92
|
+
this.views = options.views ?? [];
|
|
93
|
+
this.autoFilter = options.autoFilter ?? null;
|
|
94
94
|
// for images, etc
|
|
95
95
|
this._media = [];
|
|
96
96
|
// worksheet protection
|
|
@@ -253,7 +253,7 @@ class Worksheet {
|
|
|
253
253
|
if (inserts.length > 0) {
|
|
254
254
|
// must iterate over all rows whether they exist yet or not
|
|
255
255
|
for (let i = 0; i < nRows; i++) {
|
|
256
|
-
const insertValues = inserts.map(insert => insert[i]
|
|
256
|
+
const insertValues = inserts.map(insert => insert[i] ?? null);
|
|
257
257
|
const row = this.getRow(i + 1);
|
|
258
258
|
row.splice(start, count, ...insertValues);
|
|
259
259
|
}
|
|
@@ -933,7 +933,7 @@ class Worksheet {
|
|
|
933
933
|
};
|
|
934
934
|
// =================================================
|
|
935
935
|
// columns
|
|
936
|
-
model.cols = column_1.Column.toModel(this.columns
|
|
936
|
+
model.cols = column_1.Column.toModel(this.columns ?? []);
|
|
937
937
|
// ==========================================================
|
|
938
938
|
// Rows
|
|
939
939
|
const rows = (model.rows = []);
|
|
@@ -981,8 +981,8 @@ class Worksheet {
|
|
|
981
981
|
this.properties = value.properties;
|
|
982
982
|
this.pageSetup = value.pageSetup;
|
|
983
983
|
this.headerFooter = value.headerFooter;
|
|
984
|
-
this.rowBreaks = value.rowBreaks
|
|
985
|
-
this.colBreaks = value.colBreaks
|
|
984
|
+
this.rowBreaks = value.rowBreaks ?? [];
|
|
985
|
+
this.colBreaks = value.colBreaks ?? [];
|
|
986
986
|
this.views = value.views;
|
|
987
987
|
this.autoFilter = value.autoFilter;
|
|
988
988
|
this._media = value.media.map(medium => new image_1.Image(this, medium));
|
|
@@ -65,7 +65,7 @@ class BaseXform {
|
|
|
65
65
|
// ============================================================
|
|
66
66
|
reset() {
|
|
67
67
|
// to make sure parses don't bleed to next iteration
|
|
68
|
-
this.model =
|
|
68
|
+
this.model = undefined;
|
|
69
69
|
// if we have a map - reset them too
|
|
70
70
|
if (this.map) {
|
|
71
71
|
Object.values(this.map).forEach(xform => {
|
|
@@ -61,7 +61,7 @@ function isValidRange(range) {
|
|
|
61
61
|
return false;
|
|
62
62
|
}
|
|
63
63
|
// Extract the cell reference part (after the sheet name if present)
|
|
64
|
-
const cellRef = range.split("!").pop()
|
|
64
|
+
const cellRef = range.split("!").pop() ?? "";
|
|
65
65
|
// Must match one of the valid patterns
|
|
66
66
|
if (!cellRangeRegexp.test(cellRef) &&
|
|
67
67
|
!rowRangeRegexp.test(cellRef) &&
|
|
@@ -97,7 +97,7 @@ function extractRanges(parsedText) {
|
|
|
97
97
|
if (!item) {
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
|
-
const quotes = (item.match(/'/g)
|
|
100
|
+
const quotes = (item.match(/'/g) ?? []).length;
|
|
101
101
|
if (!quotes) {
|
|
102
102
|
if (quotesOpened) {
|
|
103
103
|
last += `${item},`;
|
|
@@ -5,10 +5,10 @@ const base_xform_1 = require("../base-xform.js");
|
|
|
5
5
|
class WorkbookViewXform extends base_xform_1.BaseXform {
|
|
6
6
|
render(xmlStream, model) {
|
|
7
7
|
const attributes = {
|
|
8
|
-
xWindow: model.x
|
|
9
|
-
yWindow: model.y
|
|
10
|
-
windowWidth: model.width
|
|
11
|
-
windowHeight: model.height
|
|
8
|
+
xWindow: model.x ?? 0,
|
|
9
|
+
yWindow: model.y ?? 0,
|
|
10
|
+
windowWidth: model.width ?? 12000,
|
|
11
|
+
windowHeight: model.height ?? 24000,
|
|
12
12
|
firstSheet: model.firstSheet,
|
|
13
13
|
activeTab: model.activeTab
|
|
14
14
|
};
|
|
@@ -77,7 +77,7 @@ class WorkbookXform extends base_xform_1.BaseXform {
|
|
|
77
77
|
if (printAreas.length) {
|
|
78
78
|
model.definedNames = model.definedNames.concat(printAreas);
|
|
79
79
|
}
|
|
80
|
-
(model.media
|
|
80
|
+
(model.media ?? []).forEach((medium, i) => {
|
|
81
81
|
// assign name
|
|
82
82
|
medium.name = medium.type + (i + 1);
|
|
83
83
|
});
|
|
@@ -91,7 +91,19 @@ class WorkbookXform extends base_xform_1.BaseXform {
|
|
|
91
91
|
this.map.sheets.render(xmlStream, model.sheets);
|
|
92
92
|
this.map.definedNames.render(xmlStream, model.definedNames);
|
|
93
93
|
this.map.calcPr.render(xmlStream, model.calcProperties);
|
|
94
|
-
|
|
94
|
+
// R9-B6: Deduplicate pivot caches by cacheId before rendering.
|
|
95
|
+
// Multiple pivot tables may share the same cache, but workbook.xml should
|
|
96
|
+
// only list each cache once in <pivotCaches>.
|
|
97
|
+
const pivotTables = model.pivotTables ?? [];
|
|
98
|
+
const seenCacheIds = new Set();
|
|
99
|
+
const uniquePivotCaches = pivotTables.filter((pt) => {
|
|
100
|
+
if (seenCacheIds.has(pt.cacheId)) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
seenCacheIds.add(pt.cacheId);
|
|
104
|
+
return true;
|
|
105
|
+
});
|
|
106
|
+
this.map.pivotCaches.render(xmlStream, uniquePivotCaches);
|
|
95
107
|
xmlStream.closeNode();
|
|
96
108
|
}
|
|
97
109
|
parseOpen(node) {
|
|
@@ -143,7 +155,7 @@ class WorkbookXform extends base_xform_1.BaseXform {
|
|
|
143
155
|
}
|
|
144
156
|
}
|
|
145
157
|
reconcile(model) {
|
|
146
|
-
const rels = (model.workbookRels
|
|
158
|
+
const rels = (model.workbookRels ?? []).reduce((map, rel) => {
|
|
147
159
|
map[rel.Id] = rel;
|
|
148
160
|
return map;
|
|
149
161
|
}, {});
|
|
@@ -151,7 +163,7 @@ class WorkbookXform extends base_xform_1.BaseXform {
|
|
|
151
163
|
const worksheets = [];
|
|
152
164
|
let worksheet;
|
|
153
165
|
let index = 0;
|
|
154
|
-
(model.sheets
|
|
166
|
+
(model.sheets ?? []).forEach((sheet) => {
|
|
155
167
|
const rel = rels[sheet.rId];
|
|
156
168
|
if (!rel) {
|
|
157
169
|
return;
|
|
@@ -16,7 +16,7 @@ class VmlShapeXform extends base_xform_1.BaseXform {
|
|
|
16
16
|
return "v:shape";
|
|
17
17
|
}
|
|
18
18
|
render(xmlStream, model, index) {
|
|
19
|
-
xmlStream.openNode("v:shape", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index
|
|
19
|
+
xmlStream.openNode("v:shape", VmlShapeXform.V_SHAPE_ATTRIBUTES(model, index ?? 0));
|
|
20
20
|
xmlStream.leafNode("v:fill", { color2: "infoBackground [80]" });
|
|
21
21
|
xmlStream.leafNode("v:shadow", { color: "none [81]", obscured: "t" });
|
|
22
22
|
xmlStream.leafNode("v:path", { "o:connecttype": "none" });
|
|
@@ -14,7 +14,7 @@ class VmlTextboxXform extends base_xform_1.BaseXform {
|
|
|
14
14
|
return `${(parseFloat(value.toString()) * multiple).toFixed(2)}${unit}`;
|
|
15
15
|
}
|
|
16
16
|
reverseConversionUnit(inset) {
|
|
17
|
-
return (inset
|
|
17
|
+
return (inset ?? "").split(",").map(margin => {
|
|
18
18
|
return Number(parseFloat(this.conversionUnit(parseFloat(margin), 0.1, "")).toFixed(2));
|
|
19
19
|
});
|
|
20
20
|
}
|
|
@@ -24,7 +24,7 @@ class AppXform extends base_xform_1.BaseXform {
|
|
|
24
24
|
xmlStream.leafNode("ScaleCrop", undefined, "false");
|
|
25
25
|
this.map.HeadingPairs.render(xmlStream, model.worksheets);
|
|
26
26
|
this.map.TitlesOfParts.render(xmlStream, model.worksheets);
|
|
27
|
-
this.map.Company.render(xmlStream, model.company
|
|
27
|
+
this.map.Company.render(xmlStream, model.company ?? "");
|
|
28
28
|
this.map.Manager.render(xmlStream, model.manager);
|
|
29
29
|
xmlStream.leafNode("LinksUpToDate", undefined, "false");
|
|
30
30
|
xmlStream.leafNode("SharedDoc", undefined, "false");
|
|
@@ -11,7 +11,7 @@ class ContentTypesXform extends base_xform_1.BaseXform {
|
|
|
11
11
|
xmlStream.openXml(xml_stream_1.XmlStream.StdDocAttributes);
|
|
12
12
|
xmlStream.openNode("Types", ContentTypesXform.PROPERTY_ATTRIBUTES);
|
|
13
13
|
const mediaHash = {};
|
|
14
|
-
(model.media
|
|
14
|
+
(model.media ?? []).forEach((medium) => {
|
|
15
15
|
if (medium.type === "image") {
|
|
16
16
|
const imageType = medium.extension;
|
|
17
17
|
if (!mediaHash[imageType]) {
|
|
@@ -40,18 +40,31 @@ class ContentTypesXform extends base_xform_1.BaseXform {
|
|
|
40
40
|
ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
|
-
if ((model.pivotTables
|
|
43
|
+
if ((model.pivotTables ?? []).length) {
|
|
44
|
+
// R9-B6: Deduplicate cache content types by cacheId. When multiple pivot tables
|
|
45
|
+
// share the same cache, the cache definition/records files are written only once.
|
|
46
|
+
const writtenCacheIds = new Set();
|
|
44
47
|
// Add content types for each pivot table
|
|
45
|
-
(model.pivotTables
|
|
48
|
+
(model.pivotTables ?? []).forEach((pivotTable) => {
|
|
46
49
|
const n = pivotTable.tableNumber;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
const cacheId = pivotTable.cacheId;
|
|
51
|
+
if (!writtenCacheIds.has(cacheId)) {
|
|
52
|
+
writtenCacheIds.add(cacheId);
|
|
53
|
+
xmlStream.leafNode("Override", {
|
|
54
|
+
PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotCacheDefinitionPath)(n)),
|
|
55
|
+
ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml"
|
|
56
|
+
});
|
|
57
|
+
// R9-B5: Only register cacheRecords content type when the file actually exists.
|
|
58
|
+
// Loaded pivot tables may lack cacheRecords (e.g. OLAP sources).
|
|
59
|
+
const hasCacheRecords = pivotTable.isLoaded ? !!pivotTable.cacheRecords : true;
|
|
60
|
+
if (hasCacheRecords) {
|
|
61
|
+
xmlStream.leafNode("Override", {
|
|
62
|
+
PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotCacheRecordsPath)(n)),
|
|
63
|
+
ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml"
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Each pivot table always has its own file
|
|
55
68
|
xmlStream.leafNode("Override", {
|
|
56
69
|
PartName: (0, ooxml_paths_1.toContentTypesPartName)((0, ooxml_paths_1.pivotTablePath)(n)),
|
|
57
70
|
ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml"
|
|
@@ -22,8 +22,8 @@ class ExtXform extends base_xform_1.BaseXform {
|
|
|
22
22
|
parseOpen(node) {
|
|
23
23
|
if (node.name === this.tag) {
|
|
24
24
|
this.model = {
|
|
25
|
-
width: parseInt(node.attributes.cx
|
|
26
|
-
height: parseInt(node.attributes.cy
|
|
25
|
+
width: parseInt(node.attributes.cx ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI,
|
|
26
|
+
height: parseInt(node.attributes.cy ?? "0", 10) / EMU_PER_PIXEL_AT_96_DPI
|
|
27
27
|
};
|
|
28
28
|
return true;
|
|
29
29
|
}
|
|
@@ -23,7 +23,7 @@ class OneCellAnchorXform extends base_cell_anchor_xform_1.BaseCellAnchorXform {
|
|
|
23
23
|
this.map["xdr:pic"].prepare(model.picture, options);
|
|
24
24
|
}
|
|
25
25
|
render(xmlStream, model) {
|
|
26
|
-
xmlStream.openNode(this.tag, { editAs: model.range.editAs
|
|
26
|
+
xmlStream.openNode(this.tag, { editAs: model.range.editAs ?? "oneCell" });
|
|
27
27
|
this.map["xdr:from"].render(xmlStream, model.range.tl);
|
|
28
28
|
this.map["xdr:ext"].render(xmlStream, model.range.ext);
|
|
29
29
|
this.map["xdr:pic"].render(xmlStream, model.picture);
|
|
@@ -40,7 +40,7 @@ class TwoCellAnchorXform extends base_cell_anchor_xform_1.BaseCellAnchorXform {
|
|
|
40
40
|
: {})
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
|
-
xmlStream.openNode(this.tag, { editAs: model.range.editAs
|
|
43
|
+
xmlStream.openNode(this.tag, { editAs: model.range.editAs ?? "oneCell" });
|
|
44
44
|
this.map["xdr:from"].render(xmlStream, model.range.tl);
|
|
45
45
|
this.map["xdr:to"].render(xmlStream, model.range.br);
|
|
46
46
|
if (model.picture) {
|
|
@@ -9,7 +9,7 @@ class ListXform extends base_xform_1.BaseXform {
|
|
|
9
9
|
this.always = !!options.always;
|
|
10
10
|
this.count = options.count;
|
|
11
11
|
this.empty = options.empty;
|
|
12
|
-
this.$count = options.$count
|
|
12
|
+
this.$count = options.$count ?? "count";
|
|
13
13
|
this.$ = options.$;
|
|
14
14
|
this.childXform = options.childXform;
|
|
15
15
|
this.maxItems = options.maxItems;
|
|
@@ -27,10 +27,10 @@ class ListXform extends base_xform_1.BaseXform {
|
|
|
27
27
|
if (this.always || (model && model.length)) {
|
|
28
28
|
xmlStream.openNode(this.tag, this.$);
|
|
29
29
|
if (this.count) {
|
|
30
|
-
xmlStream.addAttribute(this.$count,
|
|
30
|
+
xmlStream.addAttribute(this.$count, model?.length ?? 0);
|
|
31
31
|
}
|
|
32
32
|
const { childXform } = this;
|
|
33
|
-
(model
|
|
33
|
+
(model ?? []).forEach((childModel, index) => {
|
|
34
34
|
childXform.render(xmlStream, childModel, index);
|
|
35
35
|
});
|
|
36
36
|
xmlStream.closeNode();
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CacheFieldXform = void 0;
|
|
4
4
|
const base_xform_1 = require("../base-xform.js");
|
|
5
|
+
const pivot_table_1 = require("../../../pivot-table.js");
|
|
5
6
|
const utils_1 = require("../../../../../utils/utils.js");
|
|
7
|
+
const raw_xml_collector_1 = require("./raw-xml-collector.js");
|
|
8
|
+
/** Attribute keys on <cacheField> that are individually parsed (not collected into extraAttrs). */
|
|
9
|
+
const KNOWN_CACHE_FIELD_KEYS = new Set(["name", "numFmtId"]);
|
|
6
10
|
/**
|
|
7
11
|
* Xform for parsing individual <cacheField> elements within a pivot cache definition.
|
|
8
12
|
*
|
|
@@ -25,8 +29,9 @@ const utils_1 = require("../../../../../utils/utils.js");
|
|
|
25
29
|
class CacheFieldXform extends base_xform_1.BaseXform {
|
|
26
30
|
constructor() {
|
|
27
31
|
super();
|
|
28
|
-
this.model = null;
|
|
29
32
|
this.inSharedItems = false;
|
|
33
|
+
this.fieldGroupCollector = new raw_xml_collector_1.RawXmlCollector("fieldGroup");
|
|
34
|
+
this.model = null;
|
|
30
35
|
}
|
|
31
36
|
get tag() {
|
|
32
37
|
return "cacheField";
|
|
@@ -34,89 +39,123 @@ class CacheFieldXform extends base_xform_1.BaseXform {
|
|
|
34
39
|
reset() {
|
|
35
40
|
this.model = null;
|
|
36
41
|
this.inSharedItems = false;
|
|
42
|
+
this.fieldGroupCollector.reset();
|
|
37
43
|
}
|
|
38
44
|
parseOpen(node) {
|
|
39
45
|
const { name, attributes } = node;
|
|
46
|
+
// Collect fieldGroup XML verbatim for roundtrip preservation
|
|
47
|
+
if (this.fieldGroupCollector.active) {
|
|
48
|
+
this.fieldGroupCollector.feedOpen(name, attributes);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
40
51
|
switch (name) {
|
|
41
|
-
case "cacheField":
|
|
52
|
+
case "cacheField": {
|
|
42
53
|
// Initialize the model with field name
|
|
54
|
+
// Collect unknown attributes into extraAttrs bag for roundtrip preservation
|
|
55
|
+
const extraAttrs = {};
|
|
56
|
+
for (const [k, v] of Object.entries(attributes)) {
|
|
57
|
+
if (!KNOWN_CACHE_FIELD_KEYS.has(k)) {
|
|
58
|
+
extraAttrs[k] = String(v);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
43
61
|
this.model = {
|
|
44
|
-
name:
|
|
45
|
-
sharedItems: null
|
|
62
|
+
name: attributes.name ?? "",
|
|
63
|
+
sharedItems: null,
|
|
64
|
+
numFmtId: attributes.numFmtId,
|
|
65
|
+
isLoaded: true,
|
|
66
|
+
extraAttrs: Object.keys(extraAttrs).length > 0 ? extraAttrs : undefined
|
|
46
67
|
};
|
|
47
68
|
break;
|
|
69
|
+
}
|
|
70
|
+
case "fieldGroup":
|
|
71
|
+
// Start collecting fieldGroup XML for roundtrip preservation
|
|
72
|
+
if (this.model) {
|
|
73
|
+
this.fieldGroupCollector.start(attributes);
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
48
76
|
case "sharedItems":
|
|
49
77
|
this.inSharedItems = true;
|
|
50
78
|
// Store numeric field metadata
|
|
51
79
|
if (this.model) {
|
|
52
|
-
|
|
53
|
-
|
|
80
|
+
// R8-B4: Store containsNumber/containsInteger as raw strings for roundtrip fidelity.
|
|
81
|
+
// Previously "0" was lost because it was parsed as undefined.
|
|
82
|
+
if (attributes.containsNumber !== undefined) {
|
|
83
|
+
this.model.containsNumber = attributes.containsNumber;
|
|
84
|
+
}
|
|
85
|
+
if (attributes.containsInteger !== undefined) {
|
|
86
|
+
this.model.containsInteger = attributes.containsInteger;
|
|
87
|
+
}
|
|
88
|
+
// R8-B7: Guard against NaN from malformed minValue/maxValue
|
|
54
89
|
if (attributes.minValue !== undefined) {
|
|
55
|
-
|
|
90
|
+
const parsed = parseFloat(attributes.minValue);
|
|
91
|
+
if (Number.isFinite(parsed)) {
|
|
92
|
+
this.model.minValue = parsed;
|
|
93
|
+
}
|
|
56
94
|
}
|
|
57
95
|
if (attributes.maxValue !== undefined) {
|
|
58
|
-
|
|
96
|
+
const parsed = parseFloat(attributes.maxValue);
|
|
97
|
+
if (Number.isFinite(parsed)) {
|
|
98
|
+
this.model.maxValue = parsed;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Preserve original sharedItems type attributes for roundtrip fidelity.
|
|
102
|
+
// These are stored as raw strings so we can re-emit them exactly as loaded.
|
|
103
|
+
if (attributes.containsSemiMixedTypes !== undefined) {
|
|
104
|
+
this.model.containsSemiMixedTypes = attributes.containsSemiMixedTypes;
|
|
105
|
+
}
|
|
106
|
+
if (attributes.containsNonDate !== undefined) {
|
|
107
|
+
this.model.containsNonDate = attributes.containsNonDate;
|
|
108
|
+
}
|
|
109
|
+
if (attributes.containsString !== undefined) {
|
|
110
|
+
this.model.containsString = attributes.containsString;
|
|
59
111
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (count > 0) {
|
|
63
|
-
this.model.sharedItems = [];
|
|
112
|
+
if (attributes.containsBlank !== undefined) {
|
|
113
|
+
this.model.containsBlank = attributes.containsBlank;
|
|
64
114
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.model.sharedItems = null;
|
|
115
|
+
if (attributes.containsDate !== undefined) {
|
|
116
|
+
this.model.containsDate = attributes.containsDate;
|
|
68
117
|
}
|
|
118
|
+
if (attributes.containsMixedTypes !== undefined) {
|
|
119
|
+
this.model.containsMixedTypes = attributes.containsMixedTypes;
|
|
120
|
+
}
|
|
121
|
+
// Initialize sharedItems array when sharedItems element is present.
|
|
122
|
+
// count="0" means an explicitly empty shared items list (not the same as absent).
|
|
123
|
+
// No count attribute also gets an empty array since the <sharedItems> element
|
|
124
|
+
// itself is present — child elements (<s>, <n>, etc.) will be pushed into it.
|
|
125
|
+
this.model.sharedItems = [];
|
|
69
126
|
}
|
|
70
127
|
break;
|
|
71
128
|
case "s":
|
|
72
|
-
// String value in sharedItems
|
|
73
|
-
if (this.inSharedItems && this.model?.sharedItems !== null) {
|
|
74
|
-
// Decode XML entities in the value
|
|
75
|
-
const value = (0, utils_1.xmlDecode)(attributes.v || "");
|
|
76
|
-
this.model.sharedItems.push(value);
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
129
|
case "n":
|
|
80
|
-
// Numeric value in sharedItems (less common, but possible)
|
|
81
|
-
if (this.inSharedItems && this.model?.sharedItems !== null) {
|
|
82
|
-
const value = parseFloat(attributes.v || "0");
|
|
83
|
-
this.model.sharedItems.push(value);
|
|
84
|
-
}
|
|
85
|
-
break;
|
|
86
130
|
case "b":
|
|
87
|
-
// Boolean value in sharedItems
|
|
88
|
-
if (this.inSharedItems && this.model?.sharedItems !== null) {
|
|
89
|
-
const value = attributes.v === "1";
|
|
90
|
-
this.model.sharedItems.push(value);
|
|
91
|
-
}
|
|
92
|
-
break;
|
|
93
131
|
case "e":
|
|
94
|
-
// Error value in sharedItems
|
|
95
|
-
if (this.inSharedItems && this.model?.sharedItems !== null) {
|
|
96
|
-
const value = `#${attributes.v || "ERROR!"}`;
|
|
97
|
-
this.model.sharedItems.push(value);
|
|
98
|
-
}
|
|
99
|
-
break;
|
|
100
132
|
case "m":
|
|
101
|
-
// Missing/null value in sharedItems
|
|
102
|
-
if (this.inSharedItems && this.model?.sharedItems !== null) {
|
|
103
|
-
this.model.sharedItems.push(null);
|
|
104
|
-
}
|
|
105
|
-
break;
|
|
106
133
|
case "d":
|
|
107
|
-
//
|
|
108
|
-
if (this.inSharedItems && this.model
|
|
109
|
-
|
|
110
|
-
this.model.sharedItems.push(value);
|
|
134
|
+
// Shared item value — push to sharedItems array if we're inside <sharedItems>
|
|
135
|
+
if (this.inSharedItems && this.model && this.model.sharedItems !== null) {
|
|
136
|
+
this.model.sharedItems.push(parseSharedItemValue(name, attributes));
|
|
111
137
|
}
|
|
112
138
|
break;
|
|
113
139
|
}
|
|
114
140
|
return true;
|
|
115
141
|
}
|
|
116
|
-
parseText(
|
|
117
|
-
//
|
|
142
|
+
parseText(text) {
|
|
143
|
+
// Forward text to active collector (B3 fix: text nodes in fieldGroup)
|
|
144
|
+
if (this.fieldGroupCollector.active) {
|
|
145
|
+
this.fieldGroupCollector.feedText(text);
|
|
146
|
+
}
|
|
118
147
|
}
|
|
119
148
|
parseClose(name) {
|
|
149
|
+
// Handle fieldGroup collection — close tags
|
|
150
|
+
if (this.fieldGroupCollector.active) {
|
|
151
|
+
if (this.fieldGroupCollector.feedClose(name)) {
|
|
152
|
+
if (this.model) {
|
|
153
|
+
this.model.fieldGroupXml = this.fieldGroupCollector.result;
|
|
154
|
+
}
|
|
155
|
+
this.fieldGroupCollector.reset();
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
120
159
|
switch (name) {
|
|
121
160
|
case "cacheField":
|
|
122
161
|
// End of this cacheField element
|
|
@@ -129,3 +168,46 @@ class CacheFieldXform extends base_xform_1.BaseXform {
|
|
|
129
168
|
}
|
|
130
169
|
}
|
|
131
170
|
exports.CacheFieldXform = CacheFieldXform;
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Helpers
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
/**
|
|
175
|
+
* Convert a SAX-parsed shared item element into its typed value.
|
|
176
|
+
*
|
|
177
|
+
* Tag mapping:
|
|
178
|
+
* - `s` → string
|
|
179
|
+
* - `n` → number
|
|
180
|
+
* - `b` → boolean
|
|
181
|
+
* - `e` → PivotErrorValue
|
|
182
|
+
* - `m` → null (missing)
|
|
183
|
+
* - `d` → Date (UTC)
|
|
184
|
+
*/
|
|
185
|
+
function parseSharedItemValue(tag, attributes) {
|
|
186
|
+
switch (tag) {
|
|
187
|
+
case "s":
|
|
188
|
+
return attributes.v ?? "";
|
|
189
|
+
case "n":
|
|
190
|
+
// Missing v attribute → treat as null (missing) rather than fabricating 0
|
|
191
|
+
if (attributes.v === undefined || attributes.v === "") {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
return parseFloat(attributes.v);
|
|
195
|
+
case "b":
|
|
196
|
+
return attributes.v === "1";
|
|
197
|
+
case "e":
|
|
198
|
+
return new pivot_table_1.PivotErrorValue(attributes.v ?? "");
|
|
199
|
+
case "m":
|
|
200
|
+
return null;
|
|
201
|
+
case "d": {
|
|
202
|
+
// Missing/empty v attribute → treat as missing value (null) to avoid Invalid Date
|
|
203
|
+
if (!attributes.v) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
// R8-B13: Guard against Invalid Date from malformed date strings
|
|
207
|
+
const date = (0, utils_1.parseOoxmlDate)(attributes.v);
|
|
208
|
+
return isNaN(date.getTime()) ? null : date;
|
|
209
|
+
}
|
|
210
|
+
default:
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
}
|