@rowsncolumns/toolkit 24.5.4 → 24.5.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/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/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/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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CellData, ConditionalFormatRule, DataValidationRuleRecord, EmbeddedChart, NamedRange, ProtectedRange, Slicer, SpreadsheetTheme, TableView } from "@rowsncolumns/spreadsheet";
|
|
1
|
+
import type { CellData, ConditionalFormatRule, DataValidationRuleRecord, EmbeddedChart, NamedRange, ProtectedRange, Slicer, SpreadsheetTheme, TableView, WorkbookProtection } from "@rowsncolumns/spreadsheet";
|
|
2
2
|
import type { CommentThread, IterativeCalculationOptions, NamedCellStyle } from "@rowsncolumns/common-types";
|
|
3
3
|
import type { CustomTableStyle, EmbeddedObject } from "@rowsncolumns/spreadsheet";
|
|
4
4
|
import { type Sheet } from "@rowsncolumns/spreadsheet";
|
|
@@ -217,6 +217,8 @@ export type WorkerResponse = {
|
|
|
217
217
|
error?: string;
|
|
218
218
|
requiresRecalc?: boolean;
|
|
219
219
|
iterativeCalculationOptions?: IterativeCalculationOptions;
|
|
220
|
+
/** `<workbookProtection>` — Excel's "Protect Workbook" state, when present. */
|
|
221
|
+
workbookProtection?: WorkbookProtection;
|
|
220
222
|
/**
|
|
221
223
|
* The source workbook declared the 1904 date system. The emitted cell
|
|
222
224
|
* data is already converted to the 1900 system (date-formatted
|
|
@@ -349,6 +351,8 @@ export type WorkerResponse = {
|
|
|
349
351
|
namedRanges: NamedRange[];
|
|
350
352
|
requiresRecalc?: boolean;
|
|
351
353
|
iterativeCalculationOptions?: IterativeCalculationOptions;
|
|
354
|
+
/** `<workbookProtection>` — Excel's "Protect Workbook" state, when present. */
|
|
355
|
+
workbookProtection?: WorkbookProtection;
|
|
352
356
|
/** Source workbook was 1904-system; chunk data is 1900-system (see `PARSE_EXCEL_SUCCESS`). */
|
|
353
357
|
use1904?: boolean;
|
|
354
358
|
} | ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../excel-parser/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,qBAAqB,EACrB,wBAAwB,EACxB,aAAa,EACb,UAAU,EACV,cAAc,EACd,MAAM,EACN,gBAAgB,EAChB,SAAS,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../excel-parser/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ export declare class WorkBook implements IWorkbookPlugin {
|
|
|
31
31
|
get sharedFormulaMap(): Map<string, [string, string]> | undefined;
|
|
32
32
|
requiresRecalc(): boolean;
|
|
33
33
|
getIterativeCalculationOptions(): import("@rowsncolumns/common-types").IterativeCalculationOptions | undefined;
|
|
34
|
+
getWorkbookProtection(): import("@rowsncolumns/spreadsheet").WorkbookProtection | undefined;
|
|
34
35
|
getUse1904Epoch(): boolean;
|
|
35
36
|
getSharedStrings(): string[];
|
|
36
37
|
processSheetData(chunkSize?: number, enableCellXfsRegistry?: boolean, enableSharedStrings?: boolean, onPhase?: (phase: string, sheetTitle?: string) => void): AsyncGenerator<import("./types").ProcessSheetDataResult, void, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workbook.d.ts","sourceRoot":"","sources":["../../../excel-parser/workbook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,2BAA2B,IAAI,4BAA4B,EAC3D,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,+BAA+B,EAC/B,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAsBjB,qBAAa,QAAS,YAAW,eAAe;IAC9C,OAAO,CAAC,MAAM,CAAmB;;IAI3B,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAqB3E,OAAO;IAIP,aAAa;IAIb,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAIvD;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAe/C,QAAQ,CACZ,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAehC,QAAQ;IAIR,6EAA6E;IAC7E,kBAAkB;IAGlB,oBAAoB;IAIpB,0EAA0E;IAC1E,cAAc;IAId,QAAQ;IAIR,UAAU;IAIV,SAAS;IAIT,IAAI,cAAc,QAEjB;IAED,IAAI,aAAa,yBAEhB;IAED,IAAI,oBAAoB,kFAEvB;IAED,IAAI,gBAAgB,8CAEnB;IAED,cAAc;IAId,8BAA8B;IAI9B,eAAe;IAIf,gBAAgB;IAIhB,gBAAgB,CACd,SAAS,CAAC,EAAE,MAAM,EAClB,qBAAqB,CAAC,EAAE,OAAO,EAC/B,mBAAmB,CAAC,EAAE,OAAO,EAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI;IAUxD,wBAAwB,CAAC,OAAO,EAAE,+BAA+B;IAmBjE,kBAAkB,CAAC,OAAO,EAAE,MAAM;IAIlC,WAAW;IAIX,SAAS;IAIT,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM;IAgBzC,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM;IAgBnC,cAAc;IAId,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM;IAInC,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM;IAIlC,UAAU;IAIV,cAAc;IAId,aAAa;IAIb,gBAAgB;IAIV,aAAa;IAInB,cAAc,CAAC,MAAM,EAAE,GAAG;CAM3B;AAED,eAAO,MAAM,2BAA2B,qCAA+B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"workbook.d.ts","sourceRoot":"","sources":["../../../excel-parser/workbook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,2BAA2B,IAAI,4BAA4B,EAC3D,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EACV,+BAA+B,EAC/B,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAsBjB,qBAAa,QAAS,YAAW,eAAe;IAC9C,OAAO,CAAC,MAAM,CAAmB;;IAI3B,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAqB3E,OAAO;IAIP,aAAa;IAIb,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;IAIvD;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAe/C,QAAQ,CACZ,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAehC,QAAQ;IAIR,6EAA6E;IAC7E,kBAAkB;IAGlB,oBAAoB;IAIpB,0EAA0E;IAC1E,cAAc;IAId,QAAQ;IAIR,UAAU;IAIV,SAAS;IAIT,IAAI,cAAc,QAEjB;IAED,IAAI,aAAa,yBAEhB;IAED,IAAI,oBAAoB,kFAEvB;IAED,IAAI,gBAAgB,8CAEnB;IAED,cAAc;IAId,8BAA8B;IAI9B,qBAAqB;IAIrB,eAAe;IAIf,gBAAgB;IAIhB,gBAAgB,CACd,SAAS,CAAC,EAAE,MAAM,EAClB,qBAAqB,CAAC,EAAE,OAAO,EAC/B,mBAAmB,CAAC,EAAE,OAAO,EAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI;IAUxD,wBAAwB,CAAC,OAAO,EAAE,+BAA+B;IAmBjE,kBAAkB,CAAC,OAAO,EAAE,MAAM;IAIlC,WAAW;IAIX,SAAS;IAIT,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM;IAgBzC,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM;IAgBnC,cAAc;IAId,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM;IAInC,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM;IAIlC,UAAU;IAIV,cAAc;IAId,aAAa;IAIb,gBAAgB;IAIV,aAAa;IAInB,cAAc,CAAC,MAAM,EAAE,GAAG;CAM3B;AAED,eAAO,MAAM,2BAA2B,qCAA+B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -117,6 +117,9 @@ export class WorkBook {
|
|
|
117
117
|
getIterativeCalculationOptions() {
|
|
118
118
|
return this.plugin.getIterativeCalculationOptions();
|
|
119
119
|
}
|
|
120
|
+
getWorkbookProtection() {
|
|
121
|
+
return this.plugin.getWorkbookProtection?.();
|
|
122
|
+
}
|
|
120
123
|
getUse1904Epoch() {
|
|
121
124
|
return this.plugin.getUse1904Epoch();
|
|
122
125
|
}
|
|
@@ -176,6 +176,7 @@ const postOpenWorkbookComplete = async (s) => {
|
|
|
176
176
|
namedRanges: s.workbook.getNamedRanges(),
|
|
177
177
|
requiresRecalc: s.workbook.requiresRecalc(),
|
|
178
178
|
iterativeCalculationOptions: s.workbook.getIterativeCalculationOptions(),
|
|
179
|
+
workbookProtection: s.workbook.getWorkbookProtection(),
|
|
179
180
|
use1904: s.workbook.getUse1904Epoch(),
|
|
180
181
|
});
|
|
181
182
|
};
|
|
@@ -516,6 +517,7 @@ self.onmessage = async (e) => {
|
|
|
516
517
|
responseType: ResponseType.PARSE_EXCEL_SUCCESS,
|
|
517
518
|
requiresRecalc: workbook.requiresRecalc(),
|
|
518
519
|
iterativeCalculationOptions: workbook.getIterativeCalculationOptions(),
|
|
520
|
+
workbookProtection: workbook.getWorkbookProtection(),
|
|
519
521
|
use1904: workbook.getUse1904Epoch(),
|
|
520
522
|
});
|
|
521
523
|
// Pass theme back
|
|
@@ -804,6 +806,7 @@ self.onmessage = async (e) => {
|
|
|
804
806
|
responseType: ResponseType.PARSE_EXCEL_SUCCESS,
|
|
805
807
|
requiresRecalc: workbook.requiresRecalc(),
|
|
806
808
|
iterativeCalculationOptions: workbook.getIterativeCalculationOptions(),
|
|
809
|
+
workbookProtection: workbook.getWorkbookProtection(),
|
|
807
810
|
});
|
|
808
811
|
self.postMessage({
|
|
809
812
|
responseType: ResponseType.GET_THEME_SUCCESS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-builder.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/chart-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AA63CnC;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,YAAY,EAAE,MAAM,GAAG,MAAM,KAC1B,MAAM,GAAG,SAAS,CAAC;AAExB,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,yBAAyB,sBAAsB,KAC9C,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"chart-builder.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/chart-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,aAAa,EAEd,MAAM,2BAA2B,CAAC;AA63CnC;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,CACnC,YAAY,EAAE,MAAM,GAAG,MAAM,KAC1B,MAAM,GAAG,SAAS,CAAC;AAExB,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,yBAAyB,sBAAsB,KAC9C,MAAM,GAAG,SAwqBX,CAAC"}
|
|
@@ -1667,9 +1667,89 @@ export const buildChartXml = (input, sheetNameById, resolvePivotSourceName) => {
|
|
|
1667
1667
|
"a:srgbClr": { a$: { val: borderHex } },
|
|
1668
1668
|
};
|
|
1669
1669
|
}
|
|
1670
|
+
normalizeSeriesChildOrder(chartSpace["c:chartSpace"]?.["c:chart"]?.["c:plotArea"]);
|
|
1670
1671
|
const xml = chartBuilder.build(chartSpace);
|
|
1671
1672
|
return `${XML_DECLARATION}${xml}`;
|
|
1672
1673
|
};
|
|
1674
|
+
/**
|
|
1675
|
+
* The `CT_*Ser` child sequence (ECMA-376 §21.2.2.15 CT_BarSer, §21.2.2.106
|
|
1676
|
+
* CT_LineSer, §21.2.2.161 CT_ScatterSer, §21.2.2.135 CT_PieSer, §21.2.2.11
|
|
1677
|
+
* CT_AreaSer, §21.2.2.22 CT_BubbleSer, merged): every series type uses a
|
|
1678
|
+
* subset of this list in this order. The builders above assemble a series
|
|
1679
|
+
* node from a template plus late additions (`c:tx`, `c:cat`, trendlines,
|
|
1680
|
+
* `c:extLst`, …) in whatever order the features are applied, and the XML
|
|
1681
|
+
* builder emits keys in insertion order — Excel tolerates the resulting
|
|
1682
|
+
* misorder, but LibreOffice, Google Sheets and the python chart libraries
|
|
1683
|
+
* validate the sequence and reject the part.
|
|
1684
|
+
*/
|
|
1685
|
+
const SERIES_CHILD_ORDER = [
|
|
1686
|
+
"c:idx",
|
|
1687
|
+
"c:order",
|
|
1688
|
+
"c:tx",
|
|
1689
|
+
"c:spPr",
|
|
1690
|
+
"c:invertIfNegative",
|
|
1691
|
+
"c:pictureOptions",
|
|
1692
|
+
"c:marker",
|
|
1693
|
+
"c:explosion",
|
|
1694
|
+
"c:dPt",
|
|
1695
|
+
"c:dLbls",
|
|
1696
|
+
"c:trendline",
|
|
1697
|
+
"c:errBars",
|
|
1698
|
+
"c:cat",
|
|
1699
|
+
"c:val",
|
|
1700
|
+
"c:xVal",
|
|
1701
|
+
"c:yVal",
|
|
1702
|
+
"c:bubbleSize",
|
|
1703
|
+
"c:bubble3D",
|
|
1704
|
+
"c:shape",
|
|
1705
|
+
"c:smooth",
|
|
1706
|
+
"c:extLst",
|
|
1707
|
+
];
|
|
1708
|
+
const seriesChildRank = (key) => {
|
|
1709
|
+
if (key === "a$")
|
|
1710
|
+
return -1;
|
|
1711
|
+
const rank = SERIES_CHILD_ORDER.indexOf(key);
|
|
1712
|
+
return rank === -1 ? SERIES_CHILD_ORDER.length : rank;
|
|
1713
|
+
};
|
|
1714
|
+
/** Re-key one `<c:ser>` object node into schema order (stable for ties). */
|
|
1715
|
+
const reorderSeriesNode = (node) => {
|
|
1716
|
+
if (!node || typeof node !== "object" || Array.isArray(node))
|
|
1717
|
+
return;
|
|
1718
|
+
const keys = Object.keys(node);
|
|
1719
|
+
const sorted = [...keys].sort((a, b) => seriesChildRank(a) - seriesChildRank(b) || keys.indexOf(a) - keys.indexOf(b));
|
|
1720
|
+
if (sorted.every((key, i) => key === keys[i]))
|
|
1721
|
+
return;
|
|
1722
|
+
const entries = sorted.map((key) => [key, node[key]]);
|
|
1723
|
+
for (const key of keys)
|
|
1724
|
+
delete node[key];
|
|
1725
|
+
for (const [key, value] of entries)
|
|
1726
|
+
node[key] = value;
|
|
1727
|
+
};
|
|
1728
|
+
/**
|
|
1729
|
+
* Walk every chart-type container under `<c:plotArea>` (including the ones
|
|
1730
|
+
* nested in an `mc:AlternateContent` fallback) and put each `<c:ser>`'s
|
|
1731
|
+
* children into schema order.
|
|
1732
|
+
*/
|
|
1733
|
+
const normalizeSeriesChildOrder = (plotArea) => {
|
|
1734
|
+
const visit = (node, depth) => {
|
|
1735
|
+
if (!node || typeof node !== "object" || depth > 4)
|
|
1736
|
+
return;
|
|
1737
|
+
if (Array.isArray(node)) {
|
|
1738
|
+
node.forEach((item) => visit(item, depth));
|
|
1739
|
+
return;
|
|
1740
|
+
}
|
|
1741
|
+
const ser = node["c:ser"];
|
|
1742
|
+
if (ser) {
|
|
1743
|
+
(Array.isArray(ser) ? ser : [ser]).forEach(reorderSeriesNode);
|
|
1744
|
+
}
|
|
1745
|
+
for (const [key, value] of Object.entries(node)) {
|
|
1746
|
+
if (key === "c:ser" || key === "a$" || key === "t$")
|
|
1747
|
+
continue;
|
|
1748
|
+
visit(value, depth + 1);
|
|
1749
|
+
}
|
|
1750
|
+
};
|
|
1751
|
+
visit(plotArea, 0);
|
|
1752
|
+
};
|
|
1673
1753
|
/** `#RRGGBB` / `RRGGBB` → uppercase `RRGGBB`; anything else is not emitted. */
|
|
1674
1754
|
const toHex = (color) => {
|
|
1675
1755
|
if (typeof color !== "string")
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* qualified exactly once.
|
|
2
|
+
* Excel "future functions" — functions added after the Excel 2007 (.xlsx)
|
|
3
|
+
* file format was frozen — must be written into sheet XML behind a `_xlfn.`
|
|
4
|
+
* namespace prefix. The list and both directions of the transform live in
|
|
5
|
+
* `helpers/excel-formula-prefixes` (the importer strips what the exporter
|
|
6
|
+
* adds); this module keeps the exporter-side entry point.
|
|
8
7
|
*/
|
|
9
|
-
export
|
|
8
|
+
export { FUTURE_FUNCTION_NAMES, WORKSHEET_SCOPED_FUTURE_FUNCTIONS, qualifyFutureFunctions, } from "../../helpers/excel-formula-prefixes";
|
|
10
9
|
//# sourceMappingURL=future-functions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"future-functions.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/future-functions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"future-functions.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/future-functions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,sCAAsC,CAAC"}
|
|
@@ -1,264 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Excel "future functions" — functions added after the Excel 2007 (.xlsx)
|
|
3
|
-
* file format was frozen
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* the implicit-intersection operator (`=@DAYS(...)`) and evaluates `#NAME?`.
|
|
8
|
-
*
|
|
9
|
-
* The list follows Microsoft's documentation of `_xlfn.`-prefixed functions
|
|
10
|
-
* ("Issue: An _xlfn. prefix is displayed in front of a function in a
|
|
11
|
-
* formula", support.microsoft.com) plus the dynamic-array / LAMBDA-era and
|
|
12
|
-
* 2024 additions that ship with the same prefix convention.
|
|
3
|
+
* file format was frozen — must be written into sheet XML behind a `_xlfn.`
|
|
4
|
+
* namespace prefix. The list and both directions of the transform live in
|
|
5
|
+
* `helpers/excel-formula-prefixes` (the importer strips what the exporter
|
|
6
|
+
* adds); this module keeps the exporter-side entry point.
|
|
13
7
|
*/
|
|
14
|
-
|
|
15
|
-
"ACOT",
|
|
16
|
-
"ACOTH",
|
|
17
|
-
"AGGREGATE",
|
|
18
|
-
"ANCHORARRAY",
|
|
19
|
-
"ARABIC",
|
|
20
|
-
"ARRAYTOTEXT",
|
|
21
|
-
"BASE",
|
|
22
|
-
"BETA.DIST",
|
|
23
|
-
"BETA.INV",
|
|
24
|
-
"BINOM.DIST",
|
|
25
|
-
"BINOM.DIST.RANGE",
|
|
26
|
-
"BINOM.INV",
|
|
27
|
-
"BITAND",
|
|
28
|
-
"BITLSHIFT",
|
|
29
|
-
"BITOR",
|
|
30
|
-
"BITRSHIFT",
|
|
31
|
-
"BITXOR",
|
|
32
|
-
"BYCOL",
|
|
33
|
-
"BYROW",
|
|
34
|
-
"CEILING.MATH",
|
|
35
|
-
"CEILING.PRECISE",
|
|
36
|
-
"CHISQ.DIST",
|
|
37
|
-
"CHISQ.DIST.RT",
|
|
38
|
-
"CHISQ.INV",
|
|
39
|
-
"CHISQ.INV.RT",
|
|
40
|
-
"CHISQ.TEST",
|
|
41
|
-
"CHOOSECOLS",
|
|
42
|
-
"CHOOSEROWS",
|
|
43
|
-
"COMBINA",
|
|
44
|
-
"CONCAT",
|
|
45
|
-
"CONFIDENCE.NORM",
|
|
46
|
-
"CONFIDENCE.T",
|
|
47
|
-
"COT",
|
|
48
|
-
"COTH",
|
|
49
|
-
"COVARIANCE.P",
|
|
50
|
-
"COVARIANCE.S",
|
|
51
|
-
"CSC",
|
|
52
|
-
"CSCH",
|
|
53
|
-
"DAYS",
|
|
54
|
-
"DECIMAL",
|
|
55
|
-
"DETECTLANGUAGE",
|
|
56
|
-
"DROP",
|
|
57
|
-
"ENCODEURL",
|
|
58
|
-
"ERF.PRECISE",
|
|
59
|
-
"ERFC.PRECISE",
|
|
60
|
-
"EXPAND",
|
|
61
|
-
"EXPON.DIST",
|
|
62
|
-
"F.DIST",
|
|
63
|
-
"F.DIST.RT",
|
|
64
|
-
"F.INV",
|
|
65
|
-
"F.INV.RT",
|
|
66
|
-
"F.TEST",
|
|
67
|
-
"FIELDVALUE",
|
|
68
|
-
"FILTER",
|
|
69
|
-
"FILTERXML",
|
|
70
|
-
"FLOOR.MATH",
|
|
71
|
-
"FLOOR.PRECISE",
|
|
72
|
-
"FORECAST.ETS",
|
|
73
|
-
"FORECAST.ETS.CONFINT",
|
|
74
|
-
"FORECAST.ETS.SEASONALITY",
|
|
75
|
-
"FORECAST.ETS.STAT",
|
|
76
|
-
"FORECAST.LINEAR",
|
|
77
|
-
"FORMULATEXT",
|
|
78
|
-
"GAMMA",
|
|
79
|
-
"GAMMA.DIST",
|
|
80
|
-
"GAMMA.INV",
|
|
81
|
-
"GAMMALN.PRECISE",
|
|
82
|
-
"GAUSS",
|
|
83
|
-
"GROUPBY",
|
|
84
|
-
"HSTACK",
|
|
85
|
-
"HYPGEOM.DIST",
|
|
86
|
-
"IFNA",
|
|
87
|
-
"IFS",
|
|
88
|
-
"IMAGE",
|
|
89
|
-
"IMCOSH",
|
|
90
|
-
"IMCOT",
|
|
91
|
-
"IMCSC",
|
|
92
|
-
"IMCSCH",
|
|
93
|
-
"IMSEC",
|
|
94
|
-
"IMSECH",
|
|
95
|
-
"IMSINH",
|
|
96
|
-
"IMTAN",
|
|
97
|
-
"ISFORMULA",
|
|
98
|
-
"ISOMITTED",
|
|
99
|
-
"ISOWEEKNUM",
|
|
100
|
-
"LAMBDA",
|
|
101
|
-
"LET",
|
|
102
|
-
"LOGNORM.DIST",
|
|
103
|
-
"LOGNORM.INV",
|
|
104
|
-
"MAKEARRAY",
|
|
105
|
-
"MAP",
|
|
106
|
-
"MAXIFS",
|
|
107
|
-
"MINIFS",
|
|
108
|
-
"MODE.MULT",
|
|
109
|
-
"MODE.SNGL",
|
|
110
|
-
"MUNIT",
|
|
111
|
-
"NEGBINOM.DIST",
|
|
112
|
-
"NETWORKDAYS.INTL",
|
|
113
|
-
"NORM.DIST",
|
|
114
|
-
"NORM.INV",
|
|
115
|
-
"NORM.S.DIST",
|
|
116
|
-
"NORM.S.INV",
|
|
117
|
-
"NUMBERVALUE",
|
|
118
|
-
"PDURATION",
|
|
119
|
-
"PERCENTILE.EXC",
|
|
120
|
-
"PERCENTILE.INC",
|
|
121
|
-
"PERCENTOF",
|
|
122
|
-
"PERCENTRANK.EXC",
|
|
123
|
-
"PERCENTRANK.INC",
|
|
124
|
-
"PERMUTATIONA",
|
|
125
|
-
"PHI",
|
|
126
|
-
"PIVOTBY",
|
|
127
|
-
"POISSON.DIST",
|
|
128
|
-
"QUARTILE.EXC",
|
|
129
|
-
"QUARTILE.INC",
|
|
130
|
-
"QUERYSTRING",
|
|
131
|
-
"RANDARRAY",
|
|
132
|
-
"RANK.AVG",
|
|
133
|
-
"RANK.EQ",
|
|
134
|
-
"REDUCE",
|
|
135
|
-
"REGEXEXTRACT",
|
|
136
|
-
"REGEXREPLACE",
|
|
137
|
-
"REGEXTEST",
|
|
138
|
-
"RRI",
|
|
139
|
-
"SCAN",
|
|
140
|
-
"SEC",
|
|
141
|
-
"SECH",
|
|
142
|
-
"SEQUENCE",
|
|
143
|
-
"SHEET",
|
|
144
|
-
"SHEETS",
|
|
145
|
-
"SINGLE",
|
|
146
|
-
"SKEW.P",
|
|
147
|
-
"SORT",
|
|
148
|
-
"SORTBY",
|
|
149
|
-
"STDEV.P",
|
|
150
|
-
"STDEV.S",
|
|
151
|
-
"STOCKHISTORY",
|
|
152
|
-
"SWITCH",
|
|
153
|
-
"T.DIST",
|
|
154
|
-
"T.DIST.2T",
|
|
155
|
-
"T.DIST.RT",
|
|
156
|
-
"T.INV",
|
|
157
|
-
"T.INV.2T",
|
|
158
|
-
"T.TEST",
|
|
159
|
-
"TAKE",
|
|
160
|
-
"TEXTAFTER",
|
|
161
|
-
"TEXTBEFORE",
|
|
162
|
-
"TEXTJOIN",
|
|
163
|
-
"TEXTSPLIT",
|
|
164
|
-
"TOCOL",
|
|
165
|
-
"TOROW",
|
|
166
|
-
"TRANSLATE",
|
|
167
|
-
"TRIMRANGE",
|
|
168
|
-
"UNICHAR",
|
|
169
|
-
"UNICODE",
|
|
170
|
-
"UNIQUE",
|
|
171
|
-
"VALUETOTEXT",
|
|
172
|
-
"VAR.P",
|
|
173
|
-
"VAR.S",
|
|
174
|
-
"VSTACK",
|
|
175
|
-
"WEBSERVICE",
|
|
176
|
-
"WEIBULL.DIST",
|
|
177
|
-
"WORKDAY.INTL",
|
|
178
|
-
"WRAPCOLS",
|
|
179
|
-
"WRAPROWS",
|
|
180
|
-
"XLOOKUP",
|
|
181
|
-
"XMATCH",
|
|
182
|
-
"XOR",
|
|
183
|
-
"Z.TEST",
|
|
184
|
-
];
|
|
185
|
-
/**
|
|
186
|
-
* Future functions that Excel writes behind the worksheet-scope prefix
|
|
187
|
-
* (`_xlfn._xlws.`) rather than plain `_xlfn.` — the dynamic-array functions
|
|
188
|
-
* that also exist as worksheet-only names.
|
|
189
|
-
*/
|
|
190
|
-
const WORKSHEET_SCOPED_FUTURE_FUNCTIONS = new Set([
|
|
191
|
-
"FILTER",
|
|
192
|
-
"SORT",
|
|
193
|
-
]);
|
|
194
|
-
const QUALIFIED_BY_NAME = new Map(FUTURE_FUNCTION_NAMES.map((name) => [
|
|
195
|
-
name,
|
|
196
|
-
WORKSHEET_SCOPED_FUTURE_FUNCTIONS.has(name)
|
|
197
|
-
? `_xlfn._xlws.${name}`
|
|
198
|
-
: `_xlfn.${name}`,
|
|
199
|
-
]));
|
|
200
|
-
// Longest names first so `T.DIST.2T` wins over `T.DIST`. The match must be
|
|
201
|
-
// followed by `(` — a bare name (e.g. the defined name `DAYS`) is not a call.
|
|
202
|
-
const FUTURE_FUNCTION_REGEX = new RegExp("(" +
|
|
203
|
-
[...FUTURE_FUNCTION_NAMES]
|
|
204
|
-
.sort((a, b) => b.length - a.length)
|
|
205
|
-
.map((name) => name.replace(/\./g, "\\."))
|
|
206
|
-
.join("|") +
|
|
207
|
-
")(\\s*\\()", "gi");
|
|
208
|
-
// `\b` is not enough of a left boundary: it would match the `DAYS` in
|
|
209
|
-
// `_xlfn.DAYS` and in `MYDAYS`. The preceding character is checked by offset
|
|
210
|
-
// instead of being consumed by the pattern, so nested calls
|
|
211
|
-
// (`SORT(FILTER(...))`) still match after the enclosing one.
|
|
212
|
-
const FUTURE_FUNCTION_LEFT_BOUNDARY = /[A-Za-z0-9_.$]/;
|
|
213
|
-
function qualifySegment(segment) {
|
|
214
|
-
const stripped = segment
|
|
215
|
-
.replace(/_xlfn\./gi, "")
|
|
216
|
-
.replace(/_xlws\./gi, "")
|
|
217
|
-
.replace(/_xludf\./gi, "");
|
|
218
|
-
return stripped.replace(FUTURE_FUNCTION_REGEX, (match, name, open, offset) => {
|
|
219
|
-
if (offset > 0 &&
|
|
220
|
-
FUTURE_FUNCTION_LEFT_BOUNDARY.test(stripped[offset - 1])) {
|
|
221
|
-
return match;
|
|
222
|
-
}
|
|
223
|
-
const qualified = QUALIFIED_BY_NAME.get(name.toUpperCase());
|
|
224
|
-
return qualified ? qualified + open : match;
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Strip the `_xlfn.` / `_xlws.` / `_xludf.` prefixes and re-add the correct
|
|
229
|
-
* one to every future-function call in `formula`. Quoted spans are copied
|
|
230
|
-
* verbatim so string literals (`"…"`) and quoted sheet names (`'…'`) keep
|
|
231
|
-
* their original text; a doubled quote inside a span is an escaped quote.
|
|
232
|
-
* Because the strip pass runs first, already-qualified input comes out
|
|
233
|
-
* qualified exactly once.
|
|
234
|
-
*/
|
|
235
|
-
export function qualifyFutureFunctions(formula) {
|
|
236
|
-
let result = "";
|
|
237
|
-
let segmentStart = 0;
|
|
238
|
-
let index = 0;
|
|
239
|
-
while (index < formula.length) {
|
|
240
|
-
const char = formula[index];
|
|
241
|
-
if (char !== '"' && char !== "'") {
|
|
242
|
-
index++;
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
result += qualifySegment(formula.slice(segmentStart, index));
|
|
246
|
-
let end = index + 1;
|
|
247
|
-
while (end < formula.length) {
|
|
248
|
-
if (formula[end] === char) {
|
|
249
|
-
if (formula[end + 1] === char) {
|
|
250
|
-
end += 2;
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
end++;
|
|
256
|
-
}
|
|
257
|
-
// An unterminated literal consumes the rest of the formula.
|
|
258
|
-
const literalEnd = end < formula.length ? end + 1 : formula.length;
|
|
259
|
-
result += formula.slice(index, literalEnd);
|
|
260
|
-
index = literalEnd;
|
|
261
|
-
segmentStart = literalEnd;
|
|
262
|
-
}
|
|
263
|
-
return result + qualifySegment(formula.slice(segmentStart));
|
|
264
|
-
}
|
|
8
|
+
export { FUTURE_FUNCTION_NAMES, WORKSHEET_SCOPED_FUTURE_FUNCTIONS, qualifyFutureFunctions, } from "../../helpers/excel-formula-prefixes";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-builder.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/style-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,EACR,UAAU,EACV,KAAK,EAEL,UAAU,EACV,gBAAgB,EAEjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"style-builder.d.ts","sourceRoot":"","sources":["../../../../exporter/xlsx/style-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,QAAQ,EACR,UAAU,EACV,KAAK,EAEL,UAAU,EACV,gBAAgB,EAEjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,iCAAiC,CAAC;AA4F/D,KAAK,oBAAoB,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAKF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,KAAK,CAAC;QACxB,SAAS,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GACxC,aAAa,gBAAgB,KAC5B,sBAAsB,CAAC,UAAU,CAqBnC,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,KAAK,CAKX;IACF,OAAO,CAAC,KAAK,CAA+D;IAC5E,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,eAAe,CAErB;IACF,OAAO,CAAC,iBAAiB,CAAgC;IAEzD;;;;;;;;;;;OAWG;IACH,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE;IAUlD;;;;;;;OAOG;IACH,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,EAAE;IAOtD,OAAO,CAAC,OAAO,CAOb;IAEF,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,MAAM,CAA6B;;IAU3C;;;;;;;OAOG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI;IASzC,YAAY,CAAC,CAAC,SAAS,QAAQ,EAC7B,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC1B,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IACnC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,GAC/C,MAAM;IAsET,0BAA0B,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI;IAsCrD,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,SAAS;IA2DjB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,YAAY;IAqCpB,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;IAQpB,KAAK;CA6JN"}
|
|
@@ -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;
|