@rowsncolumns/toolkit 24.4.3 → 24.4.4

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.
Files changed (86) hide show
  1. package/dist/cjs/excel-parser/interface.d.ts +5 -1
  2. package/dist/cjs/excel-parser/interface.d.ts.map +1 -1
  3. package/dist/cjs/excel-parser/plugins/base/index.d.ts +2 -0
  4. package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -1
  5. package/dist/cjs/excel-parser/plugins/base/index.js +3 -0
  6. package/dist/cjs/excel-parser/plugins/xls/index.d.ts +55 -9
  7. package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -1
  8. package/dist/cjs/excel-parser/plugins/xls/index.js +487 -24
  9. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -1
  10. package/dist/cjs/excel-parser/plugins/xlsb/index.js +12 -5
  11. package/dist/cjs/excel-parser/plugins/xlsx/chartex.d.ts +37 -0
  12. package/dist/cjs/excel-parser/plugins/xlsx/chartex.d.ts.map +1 -0
  13. package/dist/cjs/excel-parser/plugins/xlsx/chartex.js +244 -0
  14. package/dist/cjs/excel-parser/plugins/xlsx/form-controls.d.ts +70 -0
  15. package/dist/cjs/excel-parser/plugins/xlsx/form-controls.d.ts.map +1 -0
  16. package/dist/cjs/excel-parser/plugins/xlsx/form-controls.js +295 -0
  17. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +9 -1
  18. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
  19. package/dist/cjs/excel-parser/plugins/xlsx/index.js +251 -104
  20. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +15 -1
  21. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
  22. package/dist/cjs/excel-parser/plugins/xlsx/styles.js +90 -4
  23. package/dist/cjs/excel-parser/registry.d.ts +7 -0
  24. package/dist/cjs/excel-parser/registry.d.ts.map +1 -1
  25. package/dist/cjs/excel-parser/registry.js +28 -1
  26. package/dist/cjs/excel-parser/types.d.ts +10 -1
  27. package/dist/cjs/excel-parser/types.d.ts.map +1 -1
  28. package/dist/cjs/excel-parser/workbook.d.ts +2 -0
  29. package/dist/cjs/excel-parser/workbook.d.ts.map +1 -1
  30. package/dist/cjs/excel-parser/workbook.js +20 -14
  31. package/dist/cjs/excel-parser/worker.js +128 -130
  32. package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -1
  33. package/dist/cjs/exporter/xlsx/chart-builder.js +5 -33
  34. package/dist/cjs/exporter/xlsx/chartex-builder.d.ts +36 -0
  35. package/dist/cjs/exporter/xlsx/chartex-builder.d.ts.map +1 -0
  36. package/dist/cjs/exporter/xlsx/chartex-builder.js +109 -0
  37. package/dist/cjs/exporter/xlsx/form-controls-builder.d.ts +61 -0
  38. package/dist/cjs/exporter/xlsx/form-controls-builder.d.ts.map +1 -0
  39. package/dist/cjs/exporter/xlsx/form-controls-builder.js +197 -0
  40. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -1
  41. package/dist/cjs/exporter/xlsx/xlsx-export.js +431 -193
  42. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  43. package/dist/esm/excel-parser/interface.d.ts +5 -1
  44. package/dist/esm/excel-parser/interface.d.ts.map +1 -1
  45. package/dist/esm/excel-parser/plugins/base/index.d.ts +2 -0
  46. package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -1
  47. package/dist/esm/excel-parser/plugins/base/index.js +3 -0
  48. package/dist/esm/excel-parser/plugins/xls/index.d.ts +55 -9
  49. package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -1
  50. package/dist/esm/excel-parser/plugins/xls/index.js +429 -23
  51. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -1
  52. package/dist/esm/excel-parser/plugins/xlsb/index.js +10 -3
  53. package/dist/esm/excel-parser/plugins/xlsx/chartex.d.ts +37 -0
  54. package/dist/esm/excel-parser/plugins/xlsx/chartex.d.ts.map +1 -0
  55. package/dist/esm/excel-parser/plugins/xlsx/chartex.js +199 -0
  56. package/dist/esm/excel-parser/plugins/xlsx/form-controls.d.ts +70 -0
  57. package/dist/esm/excel-parser/plugins/xlsx/form-controls.d.ts.map +1 -0
  58. package/dist/esm/excel-parser/plugins/xlsx/form-controls.js +246 -0
  59. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +9 -1
  60. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
  61. package/dist/esm/excel-parser/plugins/xlsx/index.js +92 -6
  62. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +15 -1
  63. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
  64. package/dist/esm/excel-parser/plugins/xlsx/styles.js +80 -0
  65. package/dist/esm/excel-parser/registry.d.ts +7 -0
  66. package/dist/esm/excel-parser/registry.d.ts.map +1 -1
  67. package/dist/esm/excel-parser/registry.js +18 -1
  68. package/dist/esm/excel-parser/types.d.ts +10 -1
  69. package/dist/esm/excel-parser/types.d.ts.map +1 -1
  70. package/dist/esm/excel-parser/workbook.d.ts +2 -0
  71. package/dist/esm/excel-parser/workbook.d.ts.map +1 -1
  72. package/dist/esm/excel-parser/workbook.js +16 -10
  73. package/dist/esm/excel-parser/worker.js +10 -18
  74. package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -1
  75. package/dist/esm/exporter/xlsx/chart-builder.js +0 -28
  76. package/dist/esm/exporter/xlsx/chartex-builder.d.ts +36 -0
  77. package/dist/esm/exporter/xlsx/chartex-builder.d.ts.map +1 -0
  78. package/dist/esm/exporter/xlsx/chartex-builder.js +97 -0
  79. package/dist/esm/exporter/xlsx/form-controls-builder.d.ts +61 -0
  80. package/dist/esm/exporter/xlsx/form-controls-builder.d.ts.map +1 -0
  81. package/dist/esm/exporter/xlsx/form-controls-builder.js +173 -0
  82. package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -1
  83. package/dist/esm/exporter/xlsx/xlsx-export.js +228 -19
  84. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  85. package/package.json +3 -3
  86. package/xlsx.d.ts +14 -0
@@ -2,6 +2,8 @@ import { cellRangeToAddress, cellToAddress, escapeCharacters, getCellEffectiveFo
2
2
  import { zipSync } from "fflate";
3
3
  import { omitInvalidDataValidationError } from "../invalid-data-validation";
4
4
  import { buildAutoFilterConditionXml } from "../../autofilter-condition";
5
+ import { buildControlElementXml, buildControlsXml, buildCtrlPropXml, buildFormControlVmlShape, buildVmlDrawingXml, CTRL_PROP_CONTENT_TYPE, CTRL_PROP_REL_TYPE, FORM_CONTROL_VML_SHAPETYPE, } from "./form-controls-builder";
6
+ import { buildChartExGraphicFrameXml, buildChartExXml, CHART_EX_CONTENT_TYPE, CHART_EX_REL_TYPE, isChartExType, } from "./chartex-builder";
5
7
  import { applyPowerQueryParts } from "./power-query-builder";
6
8
  import { encodeImplicitIntersection } from "../../helpers/implicit-intersection";
7
9
  import { qualifyFutureFunctions } from "./future-functions";
@@ -53,6 +55,8 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
53
55
  const embedsBySheet = groupEmbedsBySheet(embeds ?? []);
54
56
  const textBoxesBySheet = groupTextBoxesBySheet(embeds ?? []);
55
57
  const shapesBySheet = groupShapesBySheet(embeds ?? []);
58
+ const formControlsBySheet = groupFormControlsBySheet(embeds ?? []);
59
+ const ctrlProps = { parts: [] };
56
60
  const chartsBySheet = groupChartsBySheet(charts ?? []);
57
61
  // Remap slicer tableIds to match prepared table IDs
58
62
  const remappedSlicers = slicers.map((slicer) => {
@@ -118,6 +122,7 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
118
122
  const embedImages = embedsBySheet.get(sheet.sheetId) ?? [];
119
123
  const textBoxes = textBoxesBySheet.get(sheet.sheetId) ?? [];
120
124
  const sheetShapes = shapesBySheet.get(sheet.sheetId) ?? [];
125
+ const sheetFormControls = formControlsBySheet.get(sheet.sheetId) ?? [];
121
126
  const sheetCharts = chartsBySheet.get(sheet.sheetId) ?? [];
122
127
  const sheetSlicers = slicersBySheet.get(sheet.sheetId) ?? [];
123
128
  const worksheetSlicerRelIds = [];
@@ -250,6 +255,8 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
250
255
  sheets: sortedSheets,
251
256
  locale,
252
257
  protectedRanges,
258
+ formControls: sheetFormControls,
259
+ ctrlProps,
253
260
  });
254
261
  return {
255
262
  index,
@@ -322,6 +329,10 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
322
329
  const drawingSheets = [];
323
330
  const imageExtensions = new Set();
324
331
  const chartEntries = [];
332
+ // Excel 2016+ chartex parts (treemap / sunburst) — numbered apart from
333
+ // `chart{N}.xml`, as Excel does.
334
+ const chartExEntries = [];
335
+ let globalChartExIndex = 1;
325
336
  for (const entry of worksheetEntries) {
326
337
  const placements = [...entry.cellImages, ...entry.embedImages];
327
338
  const textBoxesForSheet = entry.textBoxes ?? [];
@@ -341,6 +352,7 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
341
352
  shapes: shapesForSheet,
342
353
  startImageIndex: globalImageIndex,
343
354
  startChartIndex: globalChartIndex,
355
+ startChartExIndex: globalChartExIndex,
344
356
  charts: chartsForSheet,
345
357
  slicers: slicersForSheet,
346
358
  sheetNameById,
@@ -358,13 +370,20 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
358
370
  for (const chartEntry of drawingParts.charts) {
359
371
  chartEntries.push(chartEntry);
360
372
  }
373
+ for (const chartExEntry of drawingParts.chartExs) {
374
+ chartExEntries.push(chartExEntry);
375
+ }
361
376
  globalImageIndex = drawingParts.nextImageIndex;
362
377
  globalChartIndex = drawingParts.nextChartIndex;
378
+ globalChartExIndex = drawingParts.nextChartExIndex;
363
379
  drawingSheets.push(entry.index + 1);
364
380
  }
365
381
  for (const chartEntry of chartEntries) {
366
382
  files[chartEntry.path] = encodeXml(chartEntry.xml);
367
383
  }
384
+ for (const chartExEntry of chartExEntries) {
385
+ files[chartExEntry.path] = encodeXml(chartExEntry.xml);
386
+ }
368
387
  for (const slicerCacheEntry of slicerCacheEntries) {
369
388
  files[slicerCacheEntry.path] = encodeXml(slicerCacheEntry.xml);
370
389
  }
@@ -398,6 +417,10 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
398
417
  const commentsSheets = worksheetEntries
399
418
  .filter((entry) => entry.commentsXml)
400
419
  .map((entry) => entry.sheet.sheetId ?? entry.index + 1);
420
+ const hasVmlDrawings = worksheetEntries.some((entry) => entry.vmlDrawingXml);
421
+ for (const part of ctrlProps.parts) {
422
+ files[part.path] = encodeXml(part.xml);
423
+ }
401
424
  const threadedCommentsSheets = worksheetEntries
402
425
  .filter((entry) => entry.threadedCommentsXml)
403
426
  .map((entry) => entry.sheet.sheetId ?? entry.index + 1);
@@ -407,6 +430,7 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
407
430
  drawingSheets,
408
431
  mediaExtensions: Array.from(imageExtensions),
409
432
  chartCount: chartEntries.length,
433
+ chartExCount: chartExEntries.length,
410
434
  slicerCount: slicerEntries.length,
411
435
  slicerCacheCount: slicerCacheEntries.length,
412
436
  pivotTableCount: pivotTableEntries.length,
@@ -415,6 +439,8 @@ export const createExcelFile = async ({ conditionalFormats: _conditionalFormats,
415
439
  threadedCommentsSheets,
416
440
  hasPersons: !personRegistry.isEmpty(),
417
441
  externalLinkCount: externalLinks.length,
442
+ hasVmlDrawings,
443
+ ctrlPropCount: ctrlProps.parts.length,
418
444
  });
419
445
  files["[Content_Types].xml"] = encodeXml(contentTypesXml);
420
446
  // Preserved Power Query machinery (DataMashup customXml, connections.xml, queryTable parts) is
@@ -563,6 +589,8 @@ class DataValidationCollector {
563
589
  return `<dataValidations count="${this.entries.size}">${items.join("")}</dataValidations>`;
564
590
  }
565
591
  }
592
+ /** First VML shape id the note shapes take (`_x0000_s1026`, `_x0000_s1027`, …). */
593
+ const NOTE_VML_SHAPE_ID_BASE = 1026;
566
594
  class CommentsCollector {
567
595
  entries = [];
568
596
  add(address, text, author = "System") {
@@ -587,13 +615,18 @@ class CommentsCollector {
587
615
  .join("");
588
616
  return `${XML_DECLARATION}<comments xmlns="${WORKSHEET_NS}"><authors>${authorsXml}</authors><commentList>${commentsXml}</commentList></comments>`;
589
617
  }
590
- toVmlXml() {
591
- if (!this.entries.length) {
592
- return undefined;
593
- }
594
- const shapes = this.entries
595
- .map((entry, index) => {
596
- const shapeId = `_x0000_s${1026 + index}`;
618
+ /**
619
+ * VML shape ids the note shapes occupy. Excel allocates notes and form
620
+ * controls from one per-sheet counter, so the form-control allocator must
621
+ * never hand these out again.
622
+ */
623
+ vmlShapeIds() {
624
+ return this.entries.map((_, index) => NOTE_VML_SHAPE_ID_BASE + index);
625
+ }
626
+ /** One `<v:shape>` per note (Excel's hidden `Note` object). */
627
+ toVmlShapes() {
628
+ return this.entries.map((entry, index) => {
629
+ const shapeId = `_x0000_s${NOTE_VML_SHAPE_ID_BASE + index}`;
597
630
  // Parse cell address to get row and column
598
631
  const match = entry.address.match(/^([A-Z]+)(\d+)$/);
599
632
  if (!match)
@@ -604,11 +637,11 @@ class CommentsCollector {
604
637
  .split("")
605
638
  .reduce((acc, char) => acc * 26 + (char.charCodeAt(0) - 64), 0) - 1;
606
639
  return `<v:shape id="${shapeId}" type="#_x0000_t202" style='position:absolute;margin-left:59.25pt;margin-top:1.5pt;width:108pt;height:59.25pt;z-index:${index + 1};visibility:hidden' fillcolor="#ffffe1" o:insetmode="auto"><v:fill color2="#ffffe1"/><v:shadow on="t" color="black" obscured="t"/><v:path o:connecttype="none"/><v:textbox style='mso-direction-alt:auto'><div style='text-align:left'></div></v:textbox><x:ClientData ObjectType="Note"><x:MoveWithCells/><x:SizeWithCells/><x:Anchor>1, 15, 0, 2, 3, 15, 3, 16</x:Anchor><x:AutoFill>False</x:AutoFill><x:Row>${row - 1}</x:Row><x:Column>${colIndex}</x:Column></x:ClientData></v:shape>`;
607
- })
608
- .join("");
609
- return `<xml xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout><v:shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><v:stroke joinstyle="miter"/><v:path gradientshapeok="t" o:connecttype="rect"/></v:shapetype>${shapes}</xml>`;
640
+ }).filter(Boolean);
610
641
  }
611
642
  }
643
+ /** VML `<v:shapetype>` for legacy notes (`#_x0000_t202`). */
644
+ const NOTE_VML_SHAPETYPE = `<v:shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><v:stroke joinstyle="miter"/><v:path gradientshapeok="t" o:connecttype="rect"/></v:shapetype>`;
612
645
  const INVALID_XML_CHAR_REGEX = /[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g;
613
646
  const sanitizeXmlText = (value) => {
614
647
  if (!value)
@@ -660,7 +693,7 @@ const getRowsForSheet = (sheetData, sheetId) => {
660
693
  sheetData[Number(sheetId)] ??
661
694
  []);
662
695
  };
663
- const buildWorksheetXml = ({ sheet, rows, sharedStrings, sourceSharedStrings, cellXfs, styleBuilder, tables, relationships, drawingContext, conditionalFormats, dataValidationsById, dataValidations, ignoreFormulaPatterns, citations, comments, personRegistry, slicerRelIds, sheetData, sheets, locale, protectedRanges, }) => {
696
+ const buildWorksheetXml = ({ sheet, rows, sharedStrings, sourceSharedStrings, cellXfs, styleBuilder, tables, relationships, drawingContext, conditionalFormats, dataValidationsById, dataValidations, ignoreFormulaPatterns, citations, comments, personRegistry, slicerRelIds, sheetData, sheets, locale, protectedRanges, formControls = [], ctrlProps = { parts: [] }, }) => {
664
697
  const tableNameMap = buildTableNameMap(tables);
665
698
  const bounds = {
666
699
  minRow: Number.POSITIVE_INFINITY,
@@ -823,12 +856,33 @@ const buildWorksheetXml = ({ sheet, rows, sharedStrings, sourceSharedStrings, ce
823
856
  }
824
857
  // Generate comments XML (notes) and add relationships if there are comments
825
858
  const commentsXml = commentsCollector.toXml();
826
- let legacyDrawingXml = "";
827
859
  if (commentsXml) {
828
860
  relationships.add(COMMENTS_REL_TYPE, `../comments${sheet.sheetId}.xml`);
861
+ }
862
+ // Notes and form controls share the sheet's one legacy VML part
863
+ // (`<legacyDrawing>`); a control without its VML shape is dropped by Excel.
864
+ const noteVmlShapes = commentsCollector.toVmlShapes();
865
+ const formControlBuild = buildSheetFormControls({
866
+ sheet,
867
+ controls: formControls,
868
+ relationships,
869
+ ctrlProps,
870
+ zIndexStart: noteVmlShapes.length,
871
+ reservedShapeIds: commentsCollector.vmlShapeIds(),
872
+ });
873
+ const vmlDrawingXml = buildVmlDrawingXml({
874
+ shapeTypes: [
875
+ ...(noteVmlShapes.length ? [NOTE_VML_SHAPETYPE] : []),
876
+ ...(formControlBuild.vmlShapes.length ? [FORM_CONTROL_VML_SHAPETYPE] : []),
877
+ ],
878
+ shapes: [...noteVmlShapes, ...formControlBuild.vmlShapes],
879
+ });
880
+ let legacyDrawingXml = "";
881
+ if (vmlDrawingXml) {
829
882
  const legacyDrawingRelId = relationships.add("http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", `../drawings/vmlDrawing${sheet.sheetId}.vml`);
830
883
  legacyDrawingXml = `<legacyDrawing r:id="${legacyDrawingRelId}"/>`;
831
884
  }
885
+ const controlsXml = formControlBuild.controlsXml;
832
886
  const sheetDataXml = `<sheetData>${rowXmlChunks.join("")}</sheetData>`;
833
887
  const protectionXml = buildSheetProtectionXml(sheet, protectedRanges);
834
888
  const printSettingsXml = buildPrintSettingsXml(sheet.printSettings);
@@ -865,13 +919,13 @@ const buildWorksheetXml = ({ sheet, rows, sharedStrings, sourceSharedStrings, ce
865
919
  explicitDefaultColumnWidthPx > 0) {
866
920
  sheetFormatPrAttrs.push(`defaultColWidth="${columnPixelToChars(explicitDefaultColumnWidthPx).toFixed(2)}"`);
867
921
  }
868
- const worksheetXml = `${XML_DECLARATION}<worksheet xmlns="${WORKSHEET_NS}" xmlns:r="${REL_NS}">${sheetPrXml}<dimension ref="${dimension}"/>${sheetViews}<sheetFormatPr ${sheetFormatPrAttrs.join(" ")}/>${columnXml}${sheetDataXml}${protectionXml}${basicFilterXml}${mergeXml}${conditionalFormattingXml}${dataValidationsXml}${hyperlinksXml}${printSettingsXml}${drawingXml}${legacyDrawingXml}${tablePartsXml}${extLstXml}</worksheet>`;
922
+ const worksheetXml = `${XML_DECLARATION}<worksheet xmlns="${WORKSHEET_NS}" xmlns:r="${REL_NS}">${sheetPrXml}<dimension ref="${dimension}"/>${sheetViews}<sheetFormatPr ${sheetFormatPrAttrs.join(" ")}/>${columnXml}${sheetDataXml}${protectionXml}${basicFilterXml}${mergeXml}${conditionalFormattingXml}${dataValidationsXml}${hyperlinksXml}${printSettingsXml}${drawingXml}${legacyDrawingXml}${controlsXml}${tablePartsXml}${extLstXml}</worksheet>`;
869
923
  return {
870
924
  xml: worksheetXml,
871
925
  relationshipsXml: relationships.toXml(),
872
926
  images: collectedImages,
873
927
  commentsXml,
874
- vmlDrawingXml: commentsCollector.toVmlXml(),
928
+ vmlDrawingXml,
875
929
  threadedCommentsXml,
876
930
  };
877
931
  };
@@ -2763,6 +2817,130 @@ const groupTextBoxesBySheet = (embeds) => {
2763
2817
  });
2764
2818
  return result;
2765
2819
  };
2820
+ /** Form-control embeds (`spec.type === "formControl"`) by sheet, in host order. */
2821
+ const groupFormControlsBySheet = (embeds) => {
2822
+ const result = new Map();
2823
+ (embeds ?? []).forEach((embed, order) => {
2824
+ if (!embed.position?.overlayPosition)
2825
+ return;
2826
+ if (embed.spec?.type !== "formControl")
2827
+ return;
2828
+ const overlay = embed.position.overlayPosition;
2829
+ const placement = {
2830
+ shape: embed,
2831
+ order,
2832
+ rowIndex: overlay.anchorCell.rowIndex,
2833
+ columnIndex: overlay.anchorCell.columnIndex,
2834
+ offsetX: overlay.offsetXPixels ?? 0,
2835
+ offsetY: overlay.offsetYPixels ?? 0,
2836
+ width: overlay.widthPixels ?? 120,
2837
+ height: overlay.heightPixels ?? 20,
2838
+ };
2839
+ const list = result.get(embed.position.sheetId) ?? [];
2840
+ list.push(placement);
2841
+ result.set(embed.position.sheetId, list);
2842
+ });
2843
+ return result;
2844
+ };
2845
+ /**
2846
+ * Write a sheet's form controls: one ctrlProp part + sheet relationship per
2847
+ * control, the `<controls>` worksheet element, and the VML shapes Excel
2848
+ * draws them with (merged into the sheet's `vmlDrawing` alongside notes).
2849
+ */
2850
+ const buildSheetFormControls = ({ sheet, controls, relationships, ctrlProps, zIndexStart, reservedShapeIds, }) => {
2851
+ if (!controls.length)
2852
+ return { controlsXml: "", vmlShapes: [] };
2853
+ const controlElements = [];
2854
+ const vmlShapes = [];
2855
+ // Excel numbers notes and form-control shapes from one per-sheet counter
2856
+ // (1025 upward); a control that arrived with its own id keeps it unless it
2857
+ // collides with a note shape or another control.
2858
+ const usedShapeIds = new Set(reservedShapeIds);
2859
+ let nextShapeId = 1025;
2860
+ const allocateShapeId = (wanted) => {
2861
+ if (wanted && Number.isInteger(wanted) && !usedShapeIds.has(wanted)) {
2862
+ usedShapeIds.add(wanted);
2863
+ return wanted;
2864
+ }
2865
+ while (usedShapeIds.has(nextShapeId))
2866
+ nextShapeId += 1;
2867
+ usedShapeIds.add(nextShapeId);
2868
+ return nextShapeId++;
2869
+ };
2870
+ const sumSizes = (count, getSize) => {
2871
+ let total = 0;
2872
+ for (let index = 0; index < count; index++)
2873
+ total += getSize(index);
2874
+ return total;
2875
+ };
2876
+ controls.forEach((placement, position) => {
2877
+ const spec = placement.shape.spec;
2878
+ const fromRow = Math.max(0, placement.rowIndex - 1);
2879
+ const fromColumn = Math.max(0, placement.columnIndex - 1);
2880
+ const offsetX = Math.max(0, placement.offsetX ?? 0);
2881
+ const offsetY = Math.max(0, placement.offsetY ?? 0);
2882
+ const widthPx = Math.max(5, placement.width ?? 120);
2883
+ const heightPx = Math.max(5, placement.height ?? 20);
2884
+ const columnSize = (index) => getColumnWidthPx(sheet, index, true);
2885
+ const rowSize = (index) => getRowHeightPx(sheet, index, true);
2886
+ const toColumn = resolveAnchorEndpoint({
2887
+ startIndex: fromColumn,
2888
+ startOffset: offsetX,
2889
+ span: widthPx,
2890
+ getSize: columnSize,
2891
+ });
2892
+ const toRow = resolveAnchorEndpoint({
2893
+ startIndex: fromRow,
2894
+ startOffset: offsetY,
2895
+ span: heightPx,
2896
+ getSize: rowSize,
2897
+ });
2898
+ const partIndex = ctrlProps.parts.length + 1;
2899
+ const path = `xl/ctrlProps/ctrlProp${partIndex}.xml`;
2900
+ ctrlProps.parts.push({ path, xml: buildCtrlPropXml(spec) });
2901
+ const relId = relationships.add(CTRL_PROP_REL_TYPE, `../ctrlProps/ctrlProp${partIndex}.xml`);
2902
+ const shapeId = allocateShapeId(spec.shapeId);
2903
+ controlElements.push(buildControlElementXml({
2904
+ spec,
2905
+ relId,
2906
+ shapeId,
2907
+ from: {
2908
+ col: fromColumn,
2909
+ colOff: offsetX * EMUS_PER_PIXEL,
2910
+ row: fromRow,
2911
+ rowOff: offsetY * EMUS_PER_PIXEL,
2912
+ },
2913
+ to: {
2914
+ col: toColumn.index,
2915
+ colOff: toColumn.offset * EMUS_PER_PIXEL,
2916
+ row: toRow.index,
2917
+ rowOff: toRow.offset * EMUS_PER_PIXEL,
2918
+ },
2919
+ }));
2920
+ vmlShapes.push(buildFormControlVmlShape({
2921
+ spec,
2922
+ shapeId,
2923
+ zIndex: zIndexStart + position + 1,
2924
+ geometry: {
2925
+ leftPx: sumSizes(fromColumn, columnSize) + offsetX,
2926
+ topPx: sumSizes(fromRow, rowSize) + offsetY,
2927
+ widthPx,
2928
+ heightPx,
2929
+ anchor: [
2930
+ fromColumn,
2931
+ Math.round(offsetX),
2932
+ fromRow,
2933
+ Math.round(offsetY),
2934
+ toColumn.index,
2935
+ Math.round(toColumn.offset),
2936
+ toRow.index,
2937
+ Math.round(toRow.offset),
2938
+ ],
2939
+ },
2940
+ }));
2941
+ });
2942
+ return { controlsXml: buildControlsXml(controlElements), vmlShapes };
2943
+ };
2766
2944
  const groupShapesBySheet = (embeds) => {
2767
2945
  const result = new Map();
2768
2946
  (embeds ?? []).forEach((embed, order) => {
@@ -3376,7 +3554,7 @@ const buildConditionalFormattingRuleXml = ({ rule, styleBuilder, priority, baseC
3376
3554
  rules.push(dataBarXml);
3377
3555
  return rules.length ? rules : undefined;
3378
3556
  };
3379
- const buildDrawingParts = async ({ placements, textBoxes, shapes = [], startImageIndex, startChartIndex, charts, slicers, sheet, sheetNameById, }) => {
3557
+ const buildDrawingParts = async ({ placements, textBoxes, shapes = [], startImageIndex, startChartIndex, startChartExIndex = 1, charts, slicers, sheet, sheetNameById, }) => {
3380
3558
  if (!placements.length &&
3381
3559
  !textBoxes.length &&
3382
3560
  !shapes.length &&
@@ -3388,10 +3566,27 @@ const buildDrawingParts = async ({ placements, textBoxes, shapes = [], startImag
3388
3566
  const media = [];
3389
3567
  let imageIndex = startImageIndex;
3390
3568
  let chartIndex = startChartIndex;
3569
+ let chartExIndex = startChartExIndex;
3391
3570
  let pictureId = 1;
3392
3571
  let frameId = 1;
3393
3572
  const chartEntries = [];
3573
+ const chartExEntries = [];
3394
3574
  for (const placement of charts) {
3575
+ if (isChartExType(placement.chart.spec.chartType)) {
3576
+ // Treemap / sunburst live in a chartex part with an mc:AlternateContent anchor.
3577
+ const chartExXml = buildChartExXml(placement.chart, sheetNameById);
3578
+ if (!chartExXml)
3579
+ continue;
3580
+ const relId = relationships.add(CHART_EX_REL_TYPE, `../charts/chartEx${chartExIndex}.xml`);
3581
+ anchors.push(createChartAnchor({ sheet, placement, relId, frameId, chartEx: true }));
3582
+ chartExEntries.push({
3583
+ path: `xl/charts/chartEx${chartExIndex}.xml`,
3584
+ xml: chartExXml,
3585
+ });
3586
+ chartExIndex += 1;
3587
+ frameId += 1;
3588
+ continue;
3589
+ }
3395
3590
  const chartXml = buildChartXml(placement.chart, sheetNameById);
3396
3591
  if (!chartXml)
3397
3592
  continue;
@@ -3480,8 +3675,10 @@ const buildDrawingParts = async ({ placements, textBoxes, shapes = [], startImag
3480
3675
  relsXml: relationships.toXml(),
3481
3676
  media,
3482
3677
  charts: chartEntries,
3678
+ chartExs: chartExEntries,
3483
3679
  nextImageIndex: imageIndex,
3484
3680
  nextChartIndex: chartIndex,
3681
+ nextChartExIndex: chartExIndex,
3485
3682
  };
3486
3683
  };
3487
3684
  const createTwoCellAnchor = ({ placement, relId, pictureId, sheet, }) => {
@@ -3555,7 +3752,7 @@ const buildPictureAdjustmentsXml = (adjustments) => {
3555
3752
  }
3556
3753
  return { blipChildren, srcRectXml };
3557
3754
  };
3558
- const createChartAnchor = ({ placement, relId, frameId, sheet, }) => {
3755
+ const createChartAnchor = ({ placement, relId, frameId, sheet, chartEx = false, }) => {
3559
3756
  const fromRow = Math.max(0, placement.rowIndex - 1);
3560
3757
  const fromColumn = Math.max(0, placement.columnIndex - 1);
3561
3758
  const offsetX = Math.max(0, placement.offsetX ?? 0);
@@ -3576,6 +3773,14 @@ const createChartAnchor = ({ placement, relId, frameId, sheet, }) => {
3576
3773
  });
3577
3774
  const fromXml = `<xdr:from><xdr:col>${fromColumn}</xdr:col><xdr:colOff>${Math.round(offsetX * EMUS_PER_PIXEL)}</xdr:colOff><xdr:row>${fromRow}</xdr:row><xdr:rowOff>${Math.round(offsetY * EMUS_PER_PIXEL)}</xdr:rowOff></xdr:from>`;
3578
3775
  const toXml = `<xdr:to><xdr:col>${toColumn.index}</xdr:col><xdr:colOff>${Math.round(toColumn.offset * EMUS_PER_PIXEL)}</xdr:colOff><xdr:row>${toRow.index}</xdr:row><xdr:rowOff>${Math.round(toRow.offset * EMUS_PER_PIXEL)}</xdr:rowOff></xdr:to>`;
3776
+ if (chartEx) {
3777
+ return `<xdr:twoCellAnchor>${fromXml}${toXml}${buildChartExGraphicFrameXml({
3778
+ relId,
3779
+ frameId,
3780
+ widthEmu: Math.round(widthPx * EMUS_PER_PIXEL),
3781
+ heightEmu: Math.round(heightPx * EMUS_PER_PIXEL),
3782
+ })}<xdr:clientData/></xdr:twoCellAnchor>`;
3783
+ }
3579
3784
  return `<xdr:twoCellAnchor>${fromXml}${toXml}<xdr:graphicFrame><xdr:nvGraphicFramePr><xdr:cNvPr id="${frameId}" name="Chart ${frameId}"/><xdr:cNvGraphicFramePr/></xdr:nvGraphicFramePr><xdr:xfrm><a:off x="0" y="0"/><a:ext cx="${Math.round(widthPx * EMUS_PER_PIXEL)}" cy="${Math.round(heightPx * EMUS_PER_PIXEL)}"/></xdr:xfrm><a:graphic><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart"><c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:r="${REL_NS}" r:id="${relId}"/></a:graphicData></a:graphic></xdr:graphicFrame><xdr:clientData/></xdr:twoCellAnchor>`;
3580
3785
  };
3581
3786
  const createSlicerAnchor = ({ placement, frameId, sheet, }) => {
@@ -4395,7 +4600,7 @@ const buildWorkbookRelationships = (sheetCount, slicerCacheCount = 0, externalLi
4395
4600
  slicerCacheRelationshipIds: slicerCacheRelIds,
4396
4601
  };
4397
4602
  };
4398
- const buildContentTypesXml = ({ sheetCount, tableCount, drawingSheets, mediaExtensions, chartCount, slicerCount = 0, slicerCacheCount = 0, pivotTableCount = 0, pivotCacheCount = 0, commentsSheets = [], threadedCommentsSheets = [], hasPersons = false, externalLinkCount = 0, }) => {
4603
+ const buildContentTypesXml = ({ sheetCount, tableCount, drawingSheets, mediaExtensions, chartCount, chartExCount = 0, slicerCount = 0, slicerCacheCount = 0, pivotTableCount = 0, pivotCacheCount = 0, commentsSheets = [], threadedCommentsSheets = [], hasPersons = false, externalLinkCount = 0, hasVmlDrawings = false, ctrlPropCount = 0, }) => {
4399
4604
  const sheetOverrides = Array.from({ length: sheetCount }, (_, index) => {
4400
4605
  return `<Override PartName="/xl/worksheets/sheet${index + 1}.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/>`;
4401
4606
  }).join("");
@@ -4408,6 +4613,9 @@ const buildContentTypesXml = ({ sheetCount, tableCount, drawingSheets, mediaExte
4408
4613
  const chartOverrides = Array.from({ length: chartCount }, (_, index) => {
4409
4614
  return `<Override PartName="/xl/charts/chart${index + 1}.xml" ContentType="application/vnd.openxmlformats-officedocument.drawingml.chart+xml"/>`;
4410
4615
  }).join("");
4616
+ const chartExOverrides = Array.from({ length: chartExCount }, (_, index) => {
4617
+ return `<Override PartName="/xl/charts/chartEx${index + 1}.xml" ContentType="${CHART_EX_CONTENT_TYPE}"/>`;
4618
+ }).join("");
4411
4619
  const slicerOverrides = Array.from({ length: slicerCount }, (_, index) => {
4412
4620
  return `<Override PartName="/xl/slicers/slicer${index + 1}.xml" ContentType="application/vnd.ms-excel.slicer+xml"/>`;
4413
4621
  }).join("");
@@ -4432,10 +4640,11 @@ const buildContentTypesXml = ({ sheetCount, tableCount, drawingSheets, mediaExte
4432
4640
  const mediaDefaults = mediaExtensions
4433
4641
  .map((extension) => `<Default Extension="${extension}" ContentType="image/${extension}"/>`)
4434
4642
  .join("");
4435
- const vmlDefault = commentsSheets.length
4643
+ const vmlDefault = hasVmlDrawings || commentsSheets.length
4436
4644
  ? `<Default Extension="vml" ContentType="application/vnd.openxmlformats-officedocument.vmlDrawing"/>`
4437
4645
  : "";
4438
- return `${XML_DECLARATION}<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/>${vmlDefault}${mediaDefaults}<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>${sheetOverrides}${tableOverrides}${drawingOverrides}${chartOverrides}${slicerOverrides}${slicerCacheOverrides}${pivotTableOverrides}${pivotCacheOverrides}${externalLinkOverrides}${commentsOverrides}${threadedCommentsOverrides}${personOverride}<Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/><Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/></Types>`;
4646
+ const ctrlPropOverrides = Array.from({ length: ctrlPropCount }, (_, index) => `<Override PartName="/xl/ctrlProps/ctrlProp${index + 1}.xml" ContentType="${CTRL_PROP_CONTENT_TYPE}"/>`).join("");
4647
+ return `${XML_DECLARATION}<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/>${vmlDefault}${mediaDefaults}<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>${sheetOverrides}${tableOverrides}${drawingOverrides}${chartOverrides}${chartExOverrides}${slicerOverrides}${slicerCacheOverrides}${pivotTableOverrides}${pivotCacheOverrides}${externalLinkOverrides}${ctrlPropOverrides}${commentsOverrides}${threadedCommentsOverrides}${personOverride}<Override PartName="/xl/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/><Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/></Types>`;
4439
4648
  };
4440
4649
  const buildRootRelationshipsXml = () => {
4441
4650
  return `${XML_DECLARATION}<Relationships xmlns="${PACKAGE_REL_NS}"><Relationship Id="rId1" Type="${REL_NS}/officeDocument" Target="xl/workbook.xml"/><Relationship Id="rId2" Type="${REL_NS}/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId3" Type="${REL_NS}/core-properties" Target="docProps/core.xml"/></Relationships>`;
@@ -1 +1 @@
1
- {"root":["../../autofilter-condition.ts","../../csv-export.ts","../../csv-import-worker.ts","../../csv-import.ts","../../excel-export.ts","../../excel-import-session.ts","../../excel-import-worker.ts","../../helpers.ts","../../index.ts","../../indexed-colors.ts","../../ods-export.ts","../../parse.ts","../../power-query.ts","../../print-settings.ts","../../server.ts","../../theme1.ts","../../types.ts","../../vitest.config.ts","../../xlsx.d.ts","../../csv-parser/helpers.ts","../../csv-parser/types.ts","../../csv-parser/worker.ts","../../excel-parser/builtin-numfmts.ts","../../excel-parser/cfb-decryptor.ts","../../excel-parser/cfb-encryptor.ts","../../excel-parser/dv-cell-stamp.ts","../../excel-parser/helpers.ts","../../excel-parser/interface.ts","../../excel-parser/registry.ts","../../excel-parser/style-registry.ts","../../excel-parser/theme-default.ts","../../excel-parser/types.ts","../../excel-parser/utils.ts","../../excel-parser/workbook.ts","../../excel-parser/worker.ts","../../excel-parser/zip-parser-streaming.ts","../../excel-parser/zip-parser.ts","../../excel-parser/plugins/base/index.ts","../../excel-parser/plugins/ods/conditional-formatting.ts","../../excel-parser/plugins/ods/data-validations.ts","../../excel-parser/plugins/ods/formula.ts","../../excel-parser/plugins/ods/index.ts","../../excel-parser/plugins/ods/sparklines.ts","../../excel-parser/plugins/ods/styles.ts","../../excel-parser/plugins/ods/types.ts","../../excel-parser/plugins/xls/index.ts","../../excel-parser/plugins/xlsb/biff-record-reader.ts","../../excel-parser/plugins/xlsb/index.ts","../../excel-parser/plugins/xlsb/rgce-parser.ts","../../excel-parser/plugins/xlsm/index.ts","../../excel-parser/plugins/xlsx/charts.ts","../../excel-parser/plugins/xlsx/conditional-formatting.ts","../../excel-parser/plugins/xlsx/data-validations.ts","../../excel-parser/plugins/xlsx/drawing.ts","../../excel-parser/plugins/xlsx/index.ts","../../excel-parser/plugins/xlsx/numfmt.ts","../../excel-parser/plugins/xlsx/pivots.ts","../../excel-parser/plugins/xlsx/relationships.ts","../../excel-parser/plugins/xlsx/sheet-views.ts","../../excel-parser/plugins/xlsx/styles.ts","../../excel-parser/plugins/xlsx/theme.ts","../../excel-parser/plugins/xlsx/threaded-comments.ts","../../excel-parser/plugins/xlsx/value-type-detection.ts","../../exporter/invalid-data-validation.ts","../../exporter/ods/ods-export.ts","../../exporter/ods/sparkline-builder.ts","../../exporter/xlsx/chart-builder.ts","../../exporter/xlsx/chart-templates.ts","../../exporter/xlsx/future-functions.ts","../../exporter/xlsx/pivot-builder.ts","../../exporter/xlsx/power-query-builder.ts","../../exporter/xlsx/slicer-builder.ts","../../exporter/xlsx/sparkline-builder.ts","../../exporter/xlsx/style-builder.ts","../../exporter/xlsx/threaded-comments-builder.ts","../../exporter/xlsx/xlsx-export.ts","../../helpers/implicit-intersection.ts","../../helpers/theme-xml-generator.ts"],"version":"5.8.3"}
1
+ {"root":["../../autofilter-condition.ts","../../csv-export.ts","../../csv-import-worker.ts","../../csv-import.ts","../../excel-export.ts","../../excel-import-session.ts","../../excel-import-worker.ts","../../helpers.ts","../../index.ts","../../indexed-colors.ts","../../ods-export.ts","../../parse.ts","../../power-query.ts","../../print-settings.ts","../../server.ts","../../theme1.ts","../../types.ts","../../vitest.config.ts","../../xlsx.d.ts","../../csv-parser/helpers.ts","../../csv-parser/types.ts","../../csv-parser/worker.ts","../../excel-parser/builtin-numfmts.ts","../../excel-parser/cfb-decryptor.ts","../../excel-parser/cfb-encryptor.ts","../../excel-parser/dv-cell-stamp.ts","../../excel-parser/helpers.ts","../../excel-parser/interface.ts","../../excel-parser/registry.ts","../../excel-parser/style-registry.ts","../../excel-parser/theme-default.ts","../../excel-parser/types.ts","../../excel-parser/utils.ts","../../excel-parser/workbook.ts","../../excel-parser/worker.ts","../../excel-parser/zip-parser-streaming.ts","../../excel-parser/zip-parser.ts","../../excel-parser/plugins/base/index.ts","../../excel-parser/plugins/ods/conditional-formatting.ts","../../excel-parser/plugins/ods/data-validations.ts","../../excel-parser/plugins/ods/formula.ts","../../excel-parser/plugins/ods/index.ts","../../excel-parser/plugins/ods/sparklines.ts","../../excel-parser/plugins/ods/styles.ts","../../excel-parser/plugins/ods/types.ts","../../excel-parser/plugins/xls/index.ts","../../excel-parser/plugins/xlsb/biff-record-reader.ts","../../excel-parser/plugins/xlsb/index.ts","../../excel-parser/plugins/xlsb/rgce-parser.ts","../../excel-parser/plugins/xlsm/index.ts","../../excel-parser/plugins/xlsx/chartex.ts","../../excel-parser/plugins/xlsx/charts.ts","../../excel-parser/plugins/xlsx/conditional-formatting.ts","../../excel-parser/plugins/xlsx/data-validations.ts","../../excel-parser/plugins/xlsx/drawing.ts","../../excel-parser/plugins/xlsx/form-controls.ts","../../excel-parser/plugins/xlsx/index.ts","../../excel-parser/plugins/xlsx/numfmt.ts","../../excel-parser/plugins/xlsx/pivots.ts","../../excel-parser/plugins/xlsx/relationships.ts","../../excel-parser/plugins/xlsx/sheet-views.ts","../../excel-parser/plugins/xlsx/styles.ts","../../excel-parser/plugins/xlsx/theme.ts","../../excel-parser/plugins/xlsx/threaded-comments.ts","../../excel-parser/plugins/xlsx/value-type-detection.ts","../../exporter/invalid-data-validation.ts","../../exporter/ods/ods-export.ts","../../exporter/ods/sparkline-builder.ts","../../exporter/xlsx/chart-builder.ts","../../exporter/xlsx/chart-templates.ts","../../exporter/xlsx/chartex-builder.ts","../../exporter/xlsx/form-controls-builder.ts","../../exporter/xlsx/future-functions.ts","../../exporter/xlsx/pivot-builder.ts","../../exporter/xlsx/power-query-builder.ts","../../exporter/xlsx/slicer-builder.ts","../../exporter/xlsx/sparkline-builder.ts","../../exporter/xlsx/style-builder.ts","../../exporter/xlsx/threaded-comments-builder.ts","../../exporter/xlsx/xlsx-export.ts","../../helpers/implicit-intersection.ts","../../helpers/theme-xml-generator.ts"],"version":"5.8.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rowsncolumns/toolkit",
3
- "version": "24.4.3",
3
+ "version": "24.4.4",
4
4
  "author": "Vinay M",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "main": "./dist/cjs/index.js",
@@ -43,14 +43,14 @@
43
43
  "url": "https://github.com/rowsncolumns/spreadsheet/issues"
44
44
  },
45
45
  "devDependencies": {
46
- "@rowsncolumns/utils": ">=9.2.40",
46
+ "@rowsncolumns/utils": ">=9.2.41",
47
47
  "@types/lodash-es": "^4.17.12"
48
48
  },
49
49
  "peerDependencies": {},
50
50
  "dependencies": {
51
51
  "@noble/ciphers": "^0.5.3",
52
52
  "@noble/hashes": "^1.4.0",
53
- "@rowsncolumns/calculator": ">=7.2.31",
53
+ "@rowsncolumns/calculator": ">=7.2.32",
54
54
  "@zip.js/zip.js": "^2.8.17",
55
55
  "fast-xml-parser": "^5.8.0",
56
56
  "fflate": "^0.8.2",
package/xlsx.d.ts CHANGED
@@ -1,4 +1,18 @@
1
1
  declare module "xlsx/xlsx.mjs" {
2
+ import type * as SheetJs from "xlsx";
3
+
4
+ /** SheetJS workbook reader — used for the BIFF8 (`.xls`) plugin. */
5
+ export const read: typeof SheetJs.read;
6
+ /** SheetJS workbook writer (tests build BIFF8 fixtures with it). */
7
+ export const write: typeof SheetJs.write;
8
+ export const utils: typeof SheetJs.utils;
9
+ export type WorkBook = SheetJs.WorkBook;
10
+ export type WorkSheet = SheetJs.WorkSheet;
11
+ export type CellObject = SheetJs.CellObject;
12
+ export type ColInfo = SheetJs.ColInfo;
13
+ export type RowInfo = SheetJs.RowInfo;
14
+ export type DefinedName = SheetJs.DefinedName;
15
+
2
16
  export namespace CFB {
3
17
  interface CFBEntry {
4
18
  name: string;