@rowsncolumns/toolkit 24.4.3 → 24.4.5
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/cjs/excel-parser/interface.d.ts +5 -1
- package/dist/cjs/excel-parser/interface.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/base/index.d.ts +2 -0
- package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/base/index.js +3 -0
- package/dist/cjs/excel-parser/plugins/xls/index.d.ts +55 -9
- package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xls/index.js +487 -24
- package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsb/index.js +12 -5
- package/dist/cjs/excel-parser/plugins/xlsx/chartex.d.ts +37 -0
- package/dist/cjs/excel-parser/plugins/xlsx/chartex.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/chartex.js +244 -0
- package/dist/cjs/excel-parser/plugins/xlsx/form-controls.d.ts +70 -0
- package/dist/cjs/excel-parser/plugins/xlsx/form-controls.d.ts.map +1 -0
- package/dist/cjs/excel-parser/plugins/xlsx/form-controls.js +295 -0
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +9 -1
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/index.js +251 -104
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +15 -1
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/styles.js +90 -4
- package/dist/cjs/excel-parser/registry.d.ts +7 -0
- package/dist/cjs/excel-parser/registry.d.ts.map +1 -1
- package/dist/cjs/excel-parser/registry.js +28 -1
- package/dist/cjs/excel-parser/types.d.ts +10 -1
- package/dist/cjs/excel-parser/types.d.ts.map +1 -1
- package/dist/cjs/excel-parser/workbook.d.ts +2 -0
- package/dist/cjs/excel-parser/workbook.d.ts.map +1 -1
- package/dist/cjs/excel-parser/workbook.js +20 -14
- package/dist/cjs/excel-parser/worker.js +128 -130
- package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -1
- package/dist/cjs/exporter/xlsx/chart-builder.js +5 -33
- package/dist/cjs/exporter/xlsx/chartex-builder.d.ts +36 -0
- package/dist/cjs/exporter/xlsx/chartex-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/chartex-builder.js +109 -0
- package/dist/cjs/exporter/xlsx/form-controls-builder.d.ts +61 -0
- package/dist/cjs/exporter/xlsx/form-controls-builder.d.ts.map +1 -0
- package/dist/cjs/exporter/xlsx/form-controls-builder.js +197 -0
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -1
- package/dist/cjs/exporter/xlsx/xlsx-export.js +431 -193
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/excel-parser/interface.d.ts +5 -1
- package/dist/esm/excel-parser/interface.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/base/index.d.ts +2 -0
- package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/base/index.js +3 -0
- package/dist/esm/excel-parser/plugins/xls/index.d.ts +55 -9
- package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xls/index.js +429 -23
- package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsb/index.js +10 -3
- package/dist/esm/excel-parser/plugins/xlsx/chartex.d.ts +37 -0
- package/dist/esm/excel-parser/plugins/xlsx/chartex.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/chartex.js +199 -0
- package/dist/esm/excel-parser/plugins/xlsx/form-controls.d.ts +70 -0
- package/dist/esm/excel-parser/plugins/xlsx/form-controls.d.ts.map +1 -0
- package/dist/esm/excel-parser/plugins/xlsx/form-controls.js +246 -0
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +9 -1
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/index.js +92 -6
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +15 -1
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/styles.js +80 -0
- package/dist/esm/excel-parser/registry.d.ts +7 -0
- package/dist/esm/excel-parser/registry.d.ts.map +1 -1
- package/dist/esm/excel-parser/registry.js +18 -1
- package/dist/esm/excel-parser/types.d.ts +10 -1
- package/dist/esm/excel-parser/types.d.ts.map +1 -1
- package/dist/esm/excel-parser/workbook.d.ts +2 -0
- package/dist/esm/excel-parser/workbook.d.ts.map +1 -1
- package/dist/esm/excel-parser/workbook.js +16 -10
- package/dist/esm/excel-parser/worker.js +10 -18
- package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -1
- package/dist/esm/exporter/xlsx/chart-builder.js +0 -28
- package/dist/esm/exporter/xlsx/chartex-builder.d.ts +36 -0
- package/dist/esm/exporter/xlsx/chartex-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/chartex-builder.js +97 -0
- package/dist/esm/exporter/xlsx/form-controls-builder.d.ts +61 -0
- package/dist/esm/exporter/xlsx/form-controls-builder.d.ts.map +1 -0
- package/dist/esm/exporter/xlsx/form-controls-builder.js +173 -0
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -1
- package/dist/esm/exporter/xlsx/xlsx-export.js +228 -19
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +5 -3
- 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
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
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
|
|
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
|
-
|
|
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
|
+
"version": "24.4.5",
|
|
4
4
|
"author": "Vinay M",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -43,14 +43,16 @@
|
|
|
43
43
|
"url": "https://github.com/rowsncolumns/spreadsheet/issues"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@rowsncolumns/utils": ">=9.2.
|
|
46
|
+
"@rowsncolumns/utils": ">=9.2.44",
|
|
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.
|
|
53
|
+
"@rowsncolumns/calculator": ">=7.2.33",
|
|
54
|
+
"@rowsncolumns/common-types": ">=5.2.33",
|
|
55
|
+
"@rowsncolumns/date-parser": ">=12.0.32",
|
|
54
56
|
"@zip.js/zip.js": "^2.8.17",
|
|
55
57
|
"fast-xml-parser": "^5.8.0",
|
|
56
58
|
"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;
|