@rowsncolumns/toolkit 24.5.4 → 24.5.6
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/autofilter-condition.js +6 -2
- package/dist/cjs/excel-parser/helpers.d.ts +9 -1
- package/dist/cjs/excel-parser/helpers.d.ts.map +1 -1
- package/dist/cjs/excel-parser/helpers.js +70 -16
- package/dist/cjs/excel-parser/interface.d.ts +9 -1
- package/dist/cjs/excel-parser/interface.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.js +61 -6
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/data-validations.js +13 -2
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +8 -1
- package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/index.js +159 -26
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +17 -2
- package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/styles.js +25 -14
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -1
- package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.js +19 -15
- package/dist/cjs/excel-parser/types.d.ts +5 -1
- package/dist/cjs/excel-parser/types.d.ts.map +1 -1
- package/dist/cjs/excel-parser/workbook.d.ts +1 -0
- package/dist/cjs/excel-parser/workbook.d.ts.map +1 -1
- package/dist/cjs/excel-parser/workbook.js +4 -0
- package/dist/cjs/excel-parser/worker.js +3 -0
- package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -1
- package/dist/cjs/exporter/xlsx/chart-builder.js +167 -53
- package/dist/cjs/exporter/xlsx/future-functions.d.ts +6 -7
- package/dist/cjs/exporter/xlsx/future-functions.d.ts.map +1 -1
- package/dist/cjs/exporter/xlsx/future-functions.js +5 -261
- package/dist/cjs/exporter/xlsx/style-builder.d.ts.map +1 -1
- package/dist/cjs/exporter/xlsx/style-builder.js +62 -19
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts +10 -2
- package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -1
- package/dist/cjs/exporter/xlsx/xlsx-export.js +404 -158
- package/dist/cjs/helpers/excel-formula-prefixes.d.ts +51 -0
- package/dist/cjs/helpers/excel-formula-prefixes.d.ts.map +1 -0
- package/dist/cjs/helpers/excel-formula-prefixes.js +548 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/autofilter-condition.js +6 -2
- package/dist/esm/excel-parser/helpers.d.ts +9 -1
- package/dist/esm/excel-parser/helpers.d.ts.map +1 -1
- package/dist/esm/excel-parser/helpers.js +65 -3
- package/dist/esm/excel-parser/interface.d.ts +9 -1
- package/dist/esm/excel-parser/interface.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.js +42 -1
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/data-validations.js +11 -2
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +8 -1
- package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/index.js +109 -4
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +17 -2
- package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/styles.js +20 -8
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -1
- package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.js +13 -9
- package/dist/esm/excel-parser/types.d.ts +5 -1
- package/dist/esm/excel-parser/types.d.ts.map +1 -1
- package/dist/esm/excel-parser/workbook.d.ts +1 -0
- package/dist/esm/excel-parser/workbook.d.ts.map +1 -1
- package/dist/esm/excel-parser/workbook.js +3 -0
- package/dist/esm/excel-parser/worker.js +3 -0
- package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -1
- package/dist/esm/exporter/xlsx/chart-builder.js +80 -0
- package/dist/esm/exporter/xlsx/future-functions.d.ts +6 -7
- package/dist/esm/exporter/xlsx/future-functions.d.ts.map +1 -1
- package/dist/esm/exporter/xlsx/future-functions.js +5 -261
- package/dist/esm/exporter/xlsx/style-builder.d.ts.map +1 -1
- package/dist/esm/exporter/xlsx/style-builder.js +56 -18
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts +10 -2
- package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -1
- package/dist/esm/exporter/xlsx/xlsx-export.js +338 -106
- package/dist/esm/helpers/excel-formula-prefixes.d.ts +51 -0
- package/dist/esm/helpers/excel-formula-prefixes.d.ts.map +1 -0
- package/dist/esm/helpers/excel-formula-prefixes.js +531 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -196,7 +196,19 @@ export class StyleBuilder {
|
|
|
196
196
|
if (font) {
|
|
197
197
|
record.font = font;
|
|
198
198
|
}
|
|
199
|
-
|
|
199
|
+
// A rule may set ONLY a border and/or a number format (Excel's Format
|
|
200
|
+
// Cells → Border / Number tabs) — that is a normal rule with a normal
|
|
201
|
+
// dxf, not an empty record to drop.
|
|
202
|
+
const border = buildBorderRecord(format.borders);
|
|
203
|
+
if (hasBorderEdge(border)) {
|
|
204
|
+
record.border = border;
|
|
205
|
+
}
|
|
206
|
+
const numFmtId = this.getNumberFormatId(format);
|
|
207
|
+
const numFmtPattern = format.numberFormat?.pattern;
|
|
208
|
+
if (numFmtId !== 0 && numFmtPattern) {
|
|
209
|
+
record.numFmt = { id: numFmtId, format: numFmtPattern };
|
|
210
|
+
}
|
|
211
|
+
if (!record.fill && !record.font && !record.border && !record.numFmt) {
|
|
200
212
|
return undefined;
|
|
201
213
|
}
|
|
202
214
|
const key = this.serializeDxf(record);
|
|
@@ -312,21 +324,7 @@ export class StyleBuilder {
|
|
|
312
324
|
return nextId;
|
|
313
325
|
}
|
|
314
326
|
getBorderId(borders) {
|
|
315
|
-
|
|
316
|
-
// attributes. If both diagonals are present and identically styled the
|
|
317
|
-
// first non-null one defines the edge; otherwise each flag is set
|
|
318
|
-
// independently and both share the same painted style. This matches
|
|
319
|
-
// how Excel collapses diagonal pairs.
|
|
320
|
-
const diagonalEdge = convertBorderEdge(borders?.diagonalUp ?? borders?.diagonalDown);
|
|
321
|
-
const record = {
|
|
322
|
-
top: convertBorderEdge(borders?.top),
|
|
323
|
-
bottom: convertBorderEdge(borders?.bottom),
|
|
324
|
-
left: convertBorderEdge(borders?.left),
|
|
325
|
-
right: convertBorderEdge(borders?.right),
|
|
326
|
-
diagonal: diagonalEdge,
|
|
327
|
-
diagonalUp: !!borders?.diagonalUp,
|
|
328
|
-
diagonalDown: !!borders?.diagonalDown,
|
|
329
|
-
};
|
|
327
|
+
const record = buildBorderRecord(borders);
|
|
330
328
|
const key = this.serializeBorder(record);
|
|
331
329
|
const existing = this.borderMap.get(key);
|
|
332
330
|
if (typeof existing === "number") {
|
|
@@ -460,7 +458,7 @@ export class StyleBuilder {
|
|
|
460
458
|
].join("|");
|
|
461
459
|
}
|
|
462
460
|
serializeDxf(dxf) {
|
|
463
|
-
return `${dxf.fill ? this.serializeFill(dxf.fill) : ""}|${dxf.font ? this.serializeFont(dxf.font) : ""}`;
|
|
461
|
+
return `${dxf.fill ? this.serializeFill(dxf.fill) : ""}|${dxf.font ? this.serializeFont(dxf.font) : ""}|${dxf.border ? this.serializeBorder(dxf.border) : ""}|${dxf.numFmt ? dxf.numFmt.id : ""}`;
|
|
464
462
|
}
|
|
465
463
|
toXml() {
|
|
466
464
|
const numFmtXml = this.numberFormats.length
|
|
@@ -546,8 +544,12 @@ export class StyleBuilder {
|
|
|
546
544
|
? `<dxfs count="${this.dxfs.length}">${this.dxfs
|
|
547
545
|
.map((dxf) => {
|
|
548
546
|
const font = dxf.font ? this.buildFontXml(dxf.font) : "";
|
|
547
|
+
const numFmt = dxf.numFmt
|
|
548
|
+
? `<numFmt numFmtId="${dxf.numFmt.id}" formatCode="${escapeXml(dxf.numFmt.format)}"/>`
|
|
549
|
+
: "";
|
|
549
550
|
const fill = dxf.fill ? this.buildFillXml(dxf.fill, true) : "";
|
|
550
|
-
|
|
551
|
+
const border = dxf.border ? buildDxfBorderXml(dxf.border) : "";
|
|
552
|
+
return `<dxf>${font}${numFmt}${fill}${border}</dxf>`;
|
|
551
553
|
})
|
|
552
554
|
.join("")}</dxfs>`
|
|
553
555
|
: `<dxfs count="0"/>`;
|
|
@@ -589,6 +591,42 @@ export class StyleBuilder {
|
|
|
589
591
|
return styleXml;
|
|
590
592
|
}
|
|
591
593
|
}
|
|
594
|
+
// OOXML uses a single <diagonal> child plus diagonalUp/diagonalDown
|
|
595
|
+
// attributes. If both diagonals are present and identically styled the
|
|
596
|
+
// first non-null one defines the edge; otherwise each flag is set
|
|
597
|
+
// independently and both share the same painted style. This matches
|
|
598
|
+
// how Excel collapses diagonal pairs.
|
|
599
|
+
const buildBorderRecord = (borders) => {
|
|
600
|
+
const diagonalEdge = convertBorderEdge(borders?.diagonalUp ?? borders?.diagonalDown);
|
|
601
|
+
return {
|
|
602
|
+
top: convertBorderEdge(borders?.top),
|
|
603
|
+
bottom: convertBorderEdge(borders?.bottom),
|
|
604
|
+
left: convertBorderEdge(borders?.left),
|
|
605
|
+
right: convertBorderEdge(borders?.right),
|
|
606
|
+
diagonal: diagonalEdge,
|
|
607
|
+
diagonalUp: !!borders?.diagonalUp,
|
|
608
|
+
diagonalDown: !!borders?.diagonalDown,
|
|
609
|
+
};
|
|
610
|
+
};
|
|
611
|
+
const hasBorderEdge = (border) => Boolean(border.top?.style ||
|
|
612
|
+
border.bottom?.style ||
|
|
613
|
+
border.left?.style ||
|
|
614
|
+
border.right?.style ||
|
|
615
|
+
border.diagonal?.style);
|
|
616
|
+
// A dxf `<border>` lists only the edges the rule sets: unlike a cell
|
|
617
|
+
// border, an empty `<left/>` in a differential format would mean "remove
|
|
618
|
+
// the left border", not "leave it alone".
|
|
619
|
+
const buildDxfBorderXml = (border) => {
|
|
620
|
+
const edges = ["left", "right", "top", "bottom"]
|
|
621
|
+
.filter((side) => border[side]?.style)
|
|
622
|
+
.map((side) => serializeBorderEdgeXml(border[side], side))
|
|
623
|
+
.join("");
|
|
624
|
+
const diagonal = border.diagonal?.style
|
|
625
|
+
? serializeBorderEdgeXml(border.diagonal, "diagonal")
|
|
626
|
+
: "";
|
|
627
|
+
const diagonalAttrs = `${border.diagonalUp ? ` diagonalUp="1"` : ""}${border.diagonalDown ? ` diagonalDown="1"` : ""}`;
|
|
628
|
+
return `<border${diagonalAttrs}>${edges}${diagonal}</border>`;
|
|
629
|
+
};
|
|
592
630
|
const convertBorderEdge = (border) => {
|
|
593
631
|
if (!border || !border.style)
|
|
594
632
|
return undefined;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CellData, Citation, CommentThread, DataValidationRuleRecord, IterativeCalculationOptions, SheetData, TextFormat } from "@rowsncolumns/common-types";
|
|
2
|
-
import type { Color, ConditionalFormatRule, EmbeddedChart, EmbeddedObject, NamedRange, PivotTable, ProtectedRange, Sheet, Slicer, SpreadsheetTheme, TableView, CustomTableStyle } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
import type { Color, ConditionalFormatRule, EmbeddedChart, EmbeddedObject, NamedRange, PivotTable, ProtectedRange, Sheet, WorkbookProtection, Slicer, SpreadsheetTheme, TableView, CustomTableStyle } from "@rowsncolumns/spreadsheet";
|
|
3
3
|
import type { CellXfs, SharedStrings as SharedStringsType } from "@rowsncolumns/spreadsheet-state";
|
|
4
4
|
import type { PowerQueryParts } from "../../power-query";
|
|
5
5
|
import type { ExternalLink, WorkbookProperties } from "../../excel-parser/types";
|
|
@@ -83,6 +83,14 @@ export type ExportExcelProps<S extends Sheet, T extends CellData, C extends Cita
|
|
|
83
83
|
}>;
|
|
84
84
|
}>;
|
|
85
85
|
iterativeCalculationOptions?: IterativeCalculationOptions;
|
|
86
|
+
/**
|
|
87
|
+
* Excel "Protect Workbook" — written as `<workbookProtection …/>` right after
|
|
88
|
+
* `<workbookPr>` in `xl/workbook.xml` (structure / windows / revision locks
|
|
89
|
+
* plus the source's password hash, verbatim). Omitted ⇒ no element, Excel's
|
|
90
|
+
* unprotected workbook. The parser's `getWorkbookProtection()` is the source
|
|
91
|
+
* on a round trip.
|
|
92
|
+
*/
|
|
93
|
+
workbookProtection?: WorkbookProtection;
|
|
86
94
|
ignoreFormulaPatterns?: RegExp | RegExp[];
|
|
87
95
|
citations?: Citation[];
|
|
88
96
|
/**
|
|
@@ -118,7 +126,7 @@ export type ExportExcelProps<S extends Sheet, T extends CellData, C extends Cita
|
|
|
118
126
|
*/
|
|
119
127
|
properties?: WorkbookProperties;
|
|
120
128
|
};
|
|
121
|
-
export declare const createExcelFile: <S extends Sheet, T extends CellData, C extends Citation>({ conditionalFormats: _conditionalFormats, dataValidations: _dataValidations, sheets, sheetData, sharedStrings: sourceSharedStrings, tables: _tables, cellXfs, theme, defaultFont, embeds, charts, slicers, pivotTables, externalLinks, namedRanges, protectedRanges, namedCellStyles, customTableStyles, iterativeCalculationOptions, ignoreFormulaPatterns, citations, comments, password, locale, use1904, properties, powerQuery, }: ExportExcelProps<S, T, C>) => Promise<Uint8Array<ArrayBufferLike>>;
|
|
129
|
+
export declare const createExcelFile: <S extends Sheet, T extends CellData, C extends Citation>({ conditionalFormats: _conditionalFormats, dataValidations: _dataValidations, sheets, sheetData, sharedStrings: sourceSharedStrings, tables: _tables, cellXfs, theme, defaultFont, embeds, charts, slicers, pivotTables, externalLinks, namedRanges, protectedRanges, namedCellStyles, customTableStyles, iterativeCalculationOptions, workbookProtection, ignoreFormulaPatterns, citations, comments, password, locale, use1904, properties, powerQuery, }: ExportExcelProps<S, T, C>) => Promise<Uint8Array<ArrayBufferLike>>;
|
|
122
130
|
/**
|
|
123
131
|
* Normalize a dataValidation sqref list: collapse degenerate ranges
|
|
124
132
|
* (`C7:C7` → `C7`), drop exact duplicates, and drop members fully contained
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xlsx-export.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/xlsx-export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,QAAQ,EACR,aAAa,EAEb,wBAAwB,EAGxB,2BAA2B,EAI3B,SAAS,EACT,UAAU,EAEX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAGV,KAAK,EAEL,qBAAqB,EAErB,aAAa,EACb,cAAc,
|
|
1
|
+
{"version":3,"file":"xlsx-export.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/xlsx-export.ts"],"names":[],"mappings":"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"}
|