xlsx-mini 0.0.0 → 0.0.1
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/README.md +418 -2
- package/dist/browser.d.ts +16 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +36 -0
- package/dist/browser.js.map +1 -0
- package/dist/errors/index.d.ts +21 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +23 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/opc/index.d.ts +8 -0
- package/dist/opc/index.d.ts.map +1 -0
- package/dist/opc/index.js +8 -0
- package/dist/opc/index.js.map +1 -0
- package/dist/opc/lib/compression.d.ts +17 -0
- package/dist/opc/lib/compression.d.ts.map +1 -0
- package/dist/opc/lib/compression.js +54 -0
- package/dist/opc/lib/compression.js.map +1 -0
- package/dist/opc/lib/crc32.d.ts +8 -0
- package/dist/opc/lib/crc32.d.ts.map +1 -0
- package/dist/opc/lib/crc32.js +58 -0
- package/dist/opc/lib/crc32.js.map +1 -0
- package/dist/opc/lib/zip.d.ts +13 -0
- package/dist/opc/lib/zip.d.ts.map +1 -0
- package/dist/opc/lib/zip.js +104 -0
- package/dist/opc/lib/zip.js.map +1 -0
- package/dist/shared-strings/index.d.ts +9 -0
- package/dist/shared-strings/index.d.ts.map +1 -0
- package/dist/shared-strings/index.js +27 -0
- package/dist/shared-strings/index.js.map +1 -0
- package/dist/styles/index.d.ts +32 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +106 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/workbook/index.d.ts +27 -0
- package/dist/workbook/index.d.ts.map +1 -0
- package/dist/workbook/index.js +75 -0
- package/dist/workbook/index.js.map +1 -0
- package/dist/workbook/lib/model.d.ts +11 -0
- package/dist/workbook/lib/model.d.ts.map +1 -0
- package/dist/workbook/lib/model.js +2 -0
- package/dist/workbook/lib/model.js.map +1 -0
- package/dist/workbook/lib/validate.d.ts +4 -0
- package/dist/workbook/lib/validate.d.ts.map +1 -0
- package/dist/workbook/lib/validate.js +38 -0
- package/dist/workbook/lib/validate.js.map +1 -0
- package/dist/worksheet/index.d.ts +16 -0
- package/dist/worksheet/index.d.ts.map +1 -0
- package/dist/worksheet/index.js +25 -0
- package/dist/worksheet/index.js.map +1 -0
- package/dist/worksheet/lib/cell-ref.d.ts +6 -0
- package/dist/worksheet/lib/cell-ref.d.ts.map +1 -0
- package/dist/worksheet/lib/cell-ref.js +19 -0
- package/dist/worksheet/lib/cell-ref.js.map +1 -0
- package/dist/worksheet/lib/from-objects.d.ts +53 -0
- package/dist/worksheet/lib/from-objects.d.ts.map +1 -0
- package/dist/worksheet/lib/from-objects.js +65 -0
- package/dist/worksheet/lib/from-objects.js.map +1 -0
- package/dist/worksheet/lib/layout.d.ts +12 -0
- package/dist/worksheet/lib/layout.d.ts.map +1 -0
- package/dist/worksheet/lib/layout.js +58 -0
- package/dist/worksheet/lib/layout.js.map +1 -0
- package/dist/worksheet/lib/model.d.ts +112 -0
- package/dist/worksheet/lib/model.d.ts.map +1 -0
- package/dist/worksheet/lib/model.js +2 -0
- package/dist/worksheet/lib/model.js.map +1 -0
- package/dist/worksheet/lib/render-rows.d.ts +23 -0
- package/dist/worksheet/lib/render-rows.d.ts.map +1 -0
- package/dist/worksheet/lib/render-rows.js +167 -0
- package/dist/worksheet/lib/render-rows.js.map +1 -0
- package/dist/worksheet/lib/serial.d.ts +11 -0
- package/dist/worksheet/lib/serial.d.ts.map +1 -0
- package/dist/worksheet/lib/serial.js +44 -0
- package/dist/worksheet/lib/serial.js.map +1 -0
- package/dist/write-xlsx.d.ts +29 -0
- package/dist/write-xlsx.d.ts.map +1 -0
- package/dist/write-xlsx.js +49 -0
- package/dist/write-xlsx.js.map +1 -0
- package/dist/xml/index.d.ts +24 -0
- package/dist/xml/index.d.ts.map +1 -0
- package/dist/xml/index.js +152 -0
- package/dist/xml/index.js.map +1 -0
- package/package.json +79 -7
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { XlsxMiniError } from "../../errors/index.js";
|
|
2
|
+
import { columnLetter } from "./cell-ref.js";
|
|
3
|
+
import { serialFromCivil, serialFromEpochMillis } from "./serial.js";
|
|
4
|
+
const MAX_ROWS = 1_048_576;
|
|
5
|
+
const MAX_COLUMNS = 16_384;
|
|
6
|
+
const MAX_TEXT_LENGTH = 32_767;
|
|
7
|
+
/** Built-in number formats a date-like value falls back to. */
|
|
8
|
+
const GENERAL = 0;
|
|
9
|
+
const DATE = 14;
|
|
10
|
+
const DATE_TIME = 22;
|
|
11
|
+
/**
|
|
12
|
+
* Renders every row with at least one cell into the sink; positions survive because rows and
|
|
13
|
+
* cells carry `r`. Returns the used range such as `A1:C4`, or an empty string when no cell was
|
|
14
|
+
* written.
|
|
15
|
+
*/
|
|
16
|
+
export function renderSheetData(rows, columnStyles, context, sink) {
|
|
17
|
+
let rowIndex = -1;
|
|
18
|
+
let lastRowWithCells = 0;
|
|
19
|
+
let maxColumn = -1;
|
|
20
|
+
for (const row of rows) {
|
|
21
|
+
rowIndex++;
|
|
22
|
+
if (rowIndex >= MAX_ROWS) {
|
|
23
|
+
throw new XlsxMiniError("TOO_MANY_ROWS", rowPath(context, rowIndex), `Excel allows at most ${MAX_ROWS} rows`);
|
|
24
|
+
}
|
|
25
|
+
if (row.length > MAX_COLUMNS) {
|
|
26
|
+
throw new XlsxMiniError("TOO_MANY_COLUMNS", rowPath(context, rowIndex), `Excel allows at most ${MAX_COLUMNS} columns`);
|
|
27
|
+
}
|
|
28
|
+
let cells = "";
|
|
29
|
+
for (let column = 0; column < row.length; column++) {
|
|
30
|
+
const cell = row[column];
|
|
31
|
+
if (cell === null || cell === undefined)
|
|
32
|
+
continue;
|
|
33
|
+
const rendered = renderCell(cell, column, columnStyles[column], rowIndex, context);
|
|
34
|
+
if (rendered.length === 0)
|
|
35
|
+
continue;
|
|
36
|
+
cells += rendered;
|
|
37
|
+
if (column > maxColumn)
|
|
38
|
+
maxColumn = column;
|
|
39
|
+
}
|
|
40
|
+
if (cells.length === 0)
|
|
41
|
+
continue;
|
|
42
|
+
const rowNumber = rowIndex + 1;
|
|
43
|
+
sink.write(`<row r="${rowNumber}">${cells}</row>`);
|
|
44
|
+
lastRowWithCells = rowNumber;
|
|
45
|
+
}
|
|
46
|
+
if (lastRowWithCells === 0)
|
|
47
|
+
return "";
|
|
48
|
+
return `A1:${columnLetter(maxColumn)}${lastRowWithCells}`;
|
|
49
|
+
}
|
|
50
|
+
function renderCell(cell, column, columnStyle, rowIndex, context) {
|
|
51
|
+
let value = cell;
|
|
52
|
+
let cellStyle;
|
|
53
|
+
if (isWrapper(value)) {
|
|
54
|
+
cellStyle = value.style;
|
|
55
|
+
value = value.value;
|
|
56
|
+
if (isWrapper(value)) {
|
|
57
|
+
throw new XlsxMiniError("UNSUPPORTED_VALUE", cellPath(context, rowIndex, column), "A cell object cannot wrap another cell object");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const reference = columnLetter(column) + (rowIndex + 1);
|
|
61
|
+
const style = cellStyle === undefined && columnStyle === undefined
|
|
62
|
+
? ""
|
|
63
|
+
: styleAttribute(cellStyle, columnStyle, GENERAL, column, rowIndex, context);
|
|
64
|
+
return renderValue(value, reference, style, cellStyle, columnStyle, column, rowIndex, context, false);
|
|
65
|
+
}
|
|
66
|
+
function renderValue(value, reference, style, cellStyle, columnStyle, column, rowIndex, context, coerced) {
|
|
67
|
+
if (value === null || value === undefined)
|
|
68
|
+
return "";
|
|
69
|
+
switch (typeof value) {
|
|
70
|
+
case "string": {
|
|
71
|
+
if (value.length > MAX_TEXT_LENGTH) {
|
|
72
|
+
throw new XlsxMiniError("CELL_TEXT_TOO_LONG", cellPath(context, rowIndex, column), `Excel allows at most ${MAX_TEXT_LENGTH} characters in a cell`);
|
|
73
|
+
}
|
|
74
|
+
return `<c r="${reference}"${style} t="s"><v>${context.strings.intern(value)}</v></c>`;
|
|
75
|
+
}
|
|
76
|
+
case "number": {
|
|
77
|
+
if (!Number.isFinite(value)) {
|
|
78
|
+
throw new XlsxMiniError("INVALID_NUMBER", cellPath(context, rowIndex, column), `${value} cannot be written to a cell`);
|
|
79
|
+
}
|
|
80
|
+
return `<c r="${reference}"${style}><v>${value}</v></c>`;
|
|
81
|
+
}
|
|
82
|
+
case "boolean":
|
|
83
|
+
return `<c r="${reference}"${style} t="b"><v>${value ? 1 : 0}</v></c>`;
|
|
84
|
+
default:
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
// Everything else: Date, Temporal-like, registered, or unsupported. The coerce hook sees it once.
|
|
88
|
+
if (!coerced && context.coerce !== undefined) {
|
|
89
|
+
const next = context.coerce(value, cellPath(context, rowIndex, column));
|
|
90
|
+
return renderValue(next, reference, style, cellStyle, columnStyle, column, rowIndex, context, true);
|
|
91
|
+
}
|
|
92
|
+
if (value instanceof Date) {
|
|
93
|
+
const millis = value.getTime();
|
|
94
|
+
if (Number.isNaN(millis)) {
|
|
95
|
+
throw new XlsxMiniError("INVALID_DATE", cellPath(context, rowIndex, column), "Invalid Date cannot be written to a cell");
|
|
96
|
+
}
|
|
97
|
+
return dateCell(reference, serialFromEpochMillis(millis), DATE_TIME, cellStyle, columnStyle, column, rowIndex, context);
|
|
98
|
+
}
|
|
99
|
+
if (typeof value === "object") {
|
|
100
|
+
const tag = value[Symbol.toStringTag];
|
|
101
|
+
switch (tag) {
|
|
102
|
+
case "Temporal.PlainDate": {
|
|
103
|
+
const date = value;
|
|
104
|
+
const serial = serialFromCivil(date.year, date.month, date.day, 0, 0, 0, 0);
|
|
105
|
+
return dateCell(reference, serial, DATE, cellStyle, columnStyle, column, rowIndex, context);
|
|
106
|
+
}
|
|
107
|
+
case "Temporal.PlainDateTime":
|
|
108
|
+
case "Temporal.ZonedDateTime": {
|
|
109
|
+
const time = value;
|
|
110
|
+
const millisecond = time.millisecond + time.microsecond / 1000 + time.nanosecond / 1_000_000;
|
|
111
|
+
const serial = serialFromCivil(time.year, time.month, time.day, time.hour, time.minute, time.second, millisecond);
|
|
112
|
+
return dateCell(reference, serial, DATE_TIME, cellStyle, columnStyle, column, rowIndex, context);
|
|
113
|
+
}
|
|
114
|
+
case "Temporal.Instant": {
|
|
115
|
+
const serial = serialFromEpochMillis(value.epochMilliseconds);
|
|
116
|
+
return dateCell(reference, serial, DATE_TIME, cellStyle, columnStyle, column, rowIndex, context);
|
|
117
|
+
}
|
|
118
|
+
default:
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
throw new XlsxMiniError("UNSUPPORTED_VALUE", cellPath(context, rowIndex, column), `A value of type ${describe(value)} cannot be written to a cell; register the type and convert it in coerce`);
|
|
123
|
+
}
|
|
124
|
+
function dateCell(reference, serial, dateDefault, cellStyle, columnStyle, column, rowIndex, context) {
|
|
125
|
+
if (Number.isNaN(serial)) {
|
|
126
|
+
throw new XlsxMiniError("DATE_OUT_OF_RANGE", cellPath(context, rowIndex, column), "Excel dates run from 1900-01-01 to 9999-12-31");
|
|
127
|
+
}
|
|
128
|
+
const style = styleAttribute(cellStyle, columnStyle, dateDefault, column, rowIndex, context);
|
|
129
|
+
return `<c r="${reference}"${style}><v>${serial}</v></c>`;
|
|
130
|
+
}
|
|
131
|
+
/** The ` s="N"` attribute for a styled cell, or an empty string for the default format. */
|
|
132
|
+
function styleAttribute(cellStyle, columnStyle, dateDefault, column, rowIndex, context) {
|
|
133
|
+
let index;
|
|
134
|
+
try {
|
|
135
|
+
index = context.styles.indexFor(cellStyle, columnStyle, dateDefault);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
if (error instanceof XlsxMiniError) {
|
|
139
|
+
throw new XlsxMiniError(error.code, cellPath(context, rowIndex, column), error.message.replace(/ at $/, ""));
|
|
140
|
+
}
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
return index === 0 ? "" : ` s="${index}"`;
|
|
144
|
+
}
|
|
145
|
+
/** A plain object with a `value` property is a cell object; class instances never are. */
|
|
146
|
+
function isWrapper(value) {
|
|
147
|
+
if (typeof value !== "object" || value === null)
|
|
148
|
+
return false;
|
|
149
|
+
const prototype = Object.getPrototypeOf(value);
|
|
150
|
+
return (prototype === Object.prototype || prototype === null) && "value" in value;
|
|
151
|
+
}
|
|
152
|
+
function describe(value) {
|
|
153
|
+
if (typeof value !== "object" || value === null)
|
|
154
|
+
return typeof value;
|
|
155
|
+
const tag = value[Symbol.toStringTag];
|
|
156
|
+
if (typeof tag === "string")
|
|
157
|
+
return tag;
|
|
158
|
+
const constructor = value.constructor;
|
|
159
|
+
return constructor?.name ?? "object";
|
|
160
|
+
}
|
|
161
|
+
function cellPath(context, rowIndex, column) {
|
|
162
|
+
return `sheets[${context.sheetIndex}].rows[${rowIndex}][${column}]`;
|
|
163
|
+
}
|
|
164
|
+
function rowPath(context, rowIndex) {
|
|
165
|
+
return `sheets[${context.sheetIndex}].rows[${rowIndex}]`;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=render-rows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-rows.js","sourceRoot":"","sources":["../../../src/worksheet/lib/render-rows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,+DAA+D;AAC/D,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,IAAI,GAAG,EAAE,CAAC;AAChB,MAAM,SAAS,GAAG,EAAE,CAAC;AAmBrB;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAmB,EACnB,YAAgD,EAChD,OAAyB,EACzB,IAAa;IAEb,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,QAAQ,EAAE,CAAC;QACX,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,aAAa,CACrB,eAAe,EACf,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC1B,wBAAwB,QAAQ,OAAO,CACxC,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,aAAa,CACrB,kBAAkB,EAClB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC1B,wBAAwB,WAAW,UAAU,CAC9C,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACpC,KAAK,IAAI,QAAQ,CAAC;YAClB,IAAI,MAAM,GAAG,SAAS;gBAAE,SAAS,GAAG,MAAM,CAAC;QAC7C,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,WAAW,SAAS,KAAK,KAAK,QAAQ,CAAC,CAAC;QACnD,gBAAgB,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,IAAI,gBAAgB,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,MAAM,YAAY,CAAC,SAAS,CAAC,GAAG,gBAAgB,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,UAAU,CACjB,IAAU,EACV,MAAc,EACd,WAAkC,EAClC,QAAgB,EAChB,OAAyB;IAEzB,IAAI,KAAK,GAAY,IAAI,CAAC;IAC1B,IAAI,SAAgC,CAAC;IACrC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACpB,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,aAAa,CACrB,mBAAmB,EACnB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,+CAA+C,CAChD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GACT,SAAS,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS;QAClD,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjF,OAAO,WAAW,CAChB,KAAK,EACL,SAAS,EACT,KAAK,EACL,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,EACP,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAAc,EACd,SAAiB,EACjB,KAAa,EACb,SAAgC,EAChC,WAAkC,EAClC,MAAc,EACd,QAAgB,EAChB,OAAyB,EACzB,OAAgB;IAEhB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ,EAAE,CAAC;YACd,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACnC,MAAM,IAAI,aAAa,CACrB,oBAAoB,EACpB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,wBAAwB,eAAe,uBAAuB,CAC/D,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,SAAS,IAAI,KAAK,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QACzF,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,aAAa,CACrB,gBAAgB,EAChB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,GAAG,KAAK,8BAA8B,CACvC,CAAC;YACJ,CAAC;YACD,OAAO,SAAS,SAAS,IAAI,KAAK,OAAO,KAAK,UAAU,CAAC;QAC3D,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,SAAS,SAAS,IAAI,KAAK,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACzE;YACE,MAAM;IACV,CAAC;IAED,kGAAkG;IAClG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAA4B,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/F,OAAO,WAAW,CAChB,IAAI,EACJ,SAAS,EACT,KAAK,EACL,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,CACL,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,aAAa,CACrB,cAAc,EACd,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,0CAA0C,CAC3C,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CACb,SAAS,EACT,qBAAqB,CAAC,MAAM,CAAC,EAC7B,SAAS,EACT,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAI,KAAqD,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvF,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,oBAAoB,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,KAAqD,CAAC;gBACnE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5E,OAAO,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9F,CAAC;YACD,KAAK,wBAAwB,CAAC;YAC9B,KAAK,wBAAwB,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,KAUZ,CAAC;gBACF,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC3E,MAAM,MAAM,GAAG,eAAe,CAC5B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,EACX,WAAW,CACZ,CAAC;gBACF,OAAO,QAAQ,CACb,SAAS,EACT,MAAM,EACN,SAAS,EACT,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;YACJ,CAAC;YACD,KAAK,kBAAkB,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,qBAAqB,CACjC,KAAuC,CAAC,iBAAiB,CAC3D,CAAC;gBACF,OAAO,QAAQ,CACb,SAAS,EACT,MAAM,EACN,SAAS,EACT,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;YACJ,CAAC;YACD;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IACD,MAAM,IAAI,aAAa,CACrB,mBAAmB,EACnB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,mBAAmB,QAAQ,CAAC,KAAK,CAAC,0EAA0E,CAC7G,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CACf,SAAiB,EACjB,MAAc,EACd,WAAmB,EACnB,SAAgC,EAChC,WAAkC,EAClC,MAAc,EACd,QAAgB,EAChB,OAAyB;IAEzB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,aAAa,CACrB,mBAAmB,EACnB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,+CAA+C,CAChD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7F,OAAO,SAAS,SAAS,IAAI,KAAK,OAAO,MAAM,UAAU,CAAC;AAC5D,CAAC;AAED,2FAA2F;AAC3F,SAAS,cAAc,CACrB,SAAgC,EAChC,WAAkC,EAClC,WAAmB,EACnB,MAAc,EACd,QAAgB,EAChB,OAAyB;IAEzB,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,MAAM,IAAI,aAAa,CACrB,KAAK,CAAC,IAAI,EACV,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EACnC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CACnC,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;AAC5C,CAAC;AAED,0FAA0F;AAC1F,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAY,CAAC;IAC1D,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,CAAC;AACpF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,OAAO,KAAK,CAAC;IACrE,MAAM,GAAG,GAAI,KAAqD,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvF,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,WAAW,GAAI,KAA6C,CAAC,WAAW,CAAC;IAC/E,OAAO,WAAW,EAAE,IAAI,IAAI,QAAQ,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAyB,EAAE,QAAgB,EAAE,MAAc;IAC3E,OAAO,UAAU,OAAO,CAAC,UAAU,UAAU,QAAQ,KAAK,MAAM,GAAG,CAAC;AACtE,CAAC;AAED,SAAS,OAAO,CAAC,OAAyB,EAAE,QAAgB;IAC1D,OAAO,UAAU,OAAO,CAAC,UAAU,UAAU,QAAQ,GAAG,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Excel serial for an instant given as milliseconds since the Unix epoch, read as UTC.
|
|
3
|
+
* Returns NaN for a non-finite input or a day outside 1900-01-01 to 9999-12-31.
|
|
4
|
+
*/
|
|
5
|
+
export declare function serialFromEpochMillis(millis: number): number;
|
|
6
|
+
/**
|
|
7
|
+
* Excel serial for wall-clock fields (month 1 to 12), with no time-zone conversion.
|
|
8
|
+
* Returns NaN for a day outside 1900-01-01 to 9999-12-31.
|
|
9
|
+
*/
|
|
10
|
+
export declare function serialFromCivil(year: number, month: number, day: number, hour: number, minute: number, second: number, millisecond: number): number;
|
|
11
|
+
//# sourceMappingURL=serial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/serial.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,MAAM,CAKR"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const MILLISECONDS_PER_DAY = 86_400_000;
|
|
2
|
+
/** Days from Excel's day zero (1899-12-30) to the Unix epoch. */
|
|
3
|
+
const EPOCH_OFFSET_DAYS = 25_569;
|
|
4
|
+
/** Serials below this are shifted down by one: Excel believes 1900-02-29 existed. */
|
|
5
|
+
const LEAP_BUG_BOUNDARY = 61;
|
|
6
|
+
const MIN_SERIAL = 1; // 1900-01-01
|
|
7
|
+
const MAX_SERIAL = 2_958_465; // 9999-12-31
|
|
8
|
+
/**
|
|
9
|
+
* Excel serial for an instant given as milliseconds since the Unix epoch, read as UTC.
|
|
10
|
+
* Returns NaN for a non-finite input or a day outside 1900-01-01 to 9999-12-31.
|
|
11
|
+
*/
|
|
12
|
+
export function serialFromEpochMillis(millis) {
|
|
13
|
+
if (!Number.isFinite(millis))
|
|
14
|
+
return Number.NaN;
|
|
15
|
+
const days = Math.floor(millis / MILLISECONDS_PER_DAY);
|
|
16
|
+
const fraction = (millis - days * MILLISECONDS_PER_DAY) / MILLISECONDS_PER_DAY;
|
|
17
|
+
return finish(days + EPOCH_OFFSET_DAYS, fraction);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Excel serial for wall-clock fields (month 1 to 12), with no time-zone conversion.
|
|
21
|
+
* Returns NaN for a day outside 1900-01-01 to 9999-12-31.
|
|
22
|
+
*/
|
|
23
|
+
export function serialFromCivil(year, month, day, hour, minute, second, millisecond) {
|
|
24
|
+
const days = daysFromCivil(year, month, day) + EPOCH_OFFSET_DAYS;
|
|
25
|
+
const fraction = (((hour * 60 + minute) * 60 + second) * 1000 + millisecond) / MILLISECONDS_PER_DAY;
|
|
26
|
+
return finish(days, fraction);
|
|
27
|
+
}
|
|
28
|
+
function finish(days, fraction) {
|
|
29
|
+
const serialDay = days < LEAP_BUG_BOUNDARY ? days - 1 : days;
|
|
30
|
+
if (serialDay < MIN_SERIAL || serialDay > MAX_SERIAL)
|
|
31
|
+
return Number.NaN;
|
|
32
|
+
return serialDay + fraction;
|
|
33
|
+
}
|
|
34
|
+
/** Days since 1970-01-01 for a proleptic Gregorian date (Howard Hinnant's algorithm). */
|
|
35
|
+
function daysFromCivil(year, month, day) {
|
|
36
|
+
const shiftedYear = month <= 2 ? year - 1 : year;
|
|
37
|
+
const era = Math.floor(shiftedYear / 400);
|
|
38
|
+
const yearOfEra = shiftedYear - era * 400;
|
|
39
|
+
const shiftedMonth = month > 2 ? month - 3 : month + 9;
|
|
40
|
+
const dayOfYear = Math.floor((153 * shiftedMonth + 2) / 5) + day - 1;
|
|
41
|
+
const dayOfEra = yearOfEra * 365 + Math.floor(yearOfEra / 4) - Math.floor(yearOfEra / 100) + dayOfYear;
|
|
42
|
+
return era * 146_097 + dayOfEra - 719_468;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=serial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial.js","sourceRoot":"","sources":["../../../src/worksheet/lib/serial.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,UAAU,CAAC;AACxC,iEAAiE;AACjE,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,qFAAqF;AACrF,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,aAAa;AACnC,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,aAAa;AAE3C;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;IAC/E,OAAO,MAAM,CAAC,IAAI,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAAa,EACb,GAAW,EACX,IAAY,EACZ,MAAc,EACd,MAAc,EACd,WAAmB;IAEnB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC;IACjE,MAAM,QAAQ,GACZ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,GAAG,oBAAoB,CAAC;IACrF,OAAO,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,QAAgB;IAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,IAAI,SAAS,GAAG,UAAU,IAAI,SAAS,GAAG,UAAU;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IACxE,OAAO,SAAS,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,yFAAyF;AACzF,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW;IAC7D,MAAM,WAAW,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;IAC1C,MAAM,YAAY,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACrE,MAAM,QAAQ,GACZ,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC;IACxF,OAAO,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CompressionMode } from "./opc/index.js";
|
|
2
|
+
import { type Workbook } from "./workbook/index.js";
|
|
3
|
+
import { type Coerce } from "./worksheet/index.js";
|
|
4
|
+
/** How to write, as opposed to what to write. */
|
|
5
|
+
export interface WriteOptions {
|
|
6
|
+
/** Converts values the writer does not handle natively; see `Coerce`. */
|
|
7
|
+
readonly coerce?: Coerce;
|
|
8
|
+
/**
|
|
9
|
+
* `"deflate"` (the default) compresses every part through the runtime's `CompressionStream`.
|
|
10
|
+
* `"none"` writes STORE entries: larger, but byte-identical on every platform, which is what
|
|
11
|
+
* golden tests want. Runtimes that cannot deflate get STORE either way.
|
|
12
|
+
*/
|
|
13
|
+
readonly compression?: CompressionMode;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Writes a workbook to the bytes of an .xlsx file.
|
|
17
|
+
*
|
|
18
|
+
* The result is an ArrayBuffer-backed `Uint8Array`: hand it to `fs.writeFile`, a `Response`, or
|
|
19
|
+
* `new Blob([bytes])` as it is.
|
|
20
|
+
* Identical input gives identical bytes for `compression: "none"`. Throws `XlsxMiniError` on input Excel
|
|
21
|
+
* would refuse.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* const bytes = await writeXlsx({
|
|
25
|
+
* sheets: [{ name: "Orders", rows: [["Order", "Total"], ["A-1001", 1234.5]] }],
|
|
26
|
+
* });
|
|
27
|
+
*/
|
|
28
|
+
export declare function writeXlsx(workbook: Workbook, options?: WriteOptions): Promise<Uint8Array<ArrayBuffer>>;
|
|
29
|
+
//# sourceMappingURL=write-xlsx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-xlsx.d.ts","sourceRoot":"","sources":["../src/write-xlsx.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAEL,KAAK,QAAQ,EAMd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,sBAAsB,CAAC;AAEpE,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC;CACxC;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CA8BlC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createPackage, selectCompression, } from "./opc/index.js";
|
|
2
|
+
import { createStringTable } from "./shared-strings/index.js";
|
|
3
|
+
import { createStyleTable } from "./styles/index.js";
|
|
4
|
+
import { renderContentTypes, renderRootRelationships, renderWorkbook, renderWorkbookRelationships, validateWorkbook, } from "./workbook/index.js";
|
|
5
|
+
import { renderWorksheet } from "./worksheet/index.js";
|
|
6
|
+
const encoder = new TextEncoder();
|
|
7
|
+
/**
|
|
8
|
+
* Writes a workbook to the bytes of an .xlsx file.
|
|
9
|
+
*
|
|
10
|
+
* The result is an ArrayBuffer-backed `Uint8Array`: hand it to `fs.writeFile`, a `Response`, or
|
|
11
|
+
* `new Blob([bytes])` as it is.
|
|
12
|
+
* Identical input gives identical bytes for `compression: "none"`. Throws `XlsxMiniError` on input Excel
|
|
13
|
+
* would refuse.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const bytes = await writeXlsx({
|
|
17
|
+
* sheets: [{ name: "Orders", rows: [["Order", "Total"], ["A-1001", 1234.5]] }],
|
|
18
|
+
* });
|
|
19
|
+
*/
|
|
20
|
+
export async function writeXlsx(workbook, options = {}) {
|
|
21
|
+
validateWorkbook(workbook);
|
|
22
|
+
const strings = createStringTable();
|
|
23
|
+
const styles = createStyleTable();
|
|
24
|
+
const sheets = workbook.sheets;
|
|
25
|
+
// Sheets render first: they fill the shared-strings and styles tables those parts are built from.
|
|
26
|
+
const sheetParts = [];
|
|
27
|
+
const entries = [];
|
|
28
|
+
for (let i = 0; i < sheets.length; i++) {
|
|
29
|
+
const sheet = sheets[i];
|
|
30
|
+
const context = { strings, styles, coerce: options.coerce, sheetIndex: i };
|
|
31
|
+
const rendered = renderWorksheet(sheet, context);
|
|
32
|
+
sheetParts.push({ path: `xl/worksheets/sheet${i + 1}.xml`, data: rendered.data });
|
|
33
|
+
entries.push({ name: sheet.name, filterRange: rendered.filterRange });
|
|
34
|
+
}
|
|
35
|
+
const compression = selectCompression(options.compression ?? "deflate");
|
|
36
|
+
return createPackage([
|
|
37
|
+
part("[Content_Types].xml", renderContentTypes(sheets.length)),
|
|
38
|
+
part("_rels/.rels", renderRootRelationships()),
|
|
39
|
+
part("xl/workbook.xml", renderWorkbook(entries)),
|
|
40
|
+
part("xl/_rels/workbook.xml.rels", renderWorkbookRelationships(sheets.length)),
|
|
41
|
+
part("xl/styles.xml", styles.render()),
|
|
42
|
+
part("xl/sharedStrings.xml", strings.render()),
|
|
43
|
+
...sheetParts,
|
|
44
|
+
], compression);
|
|
45
|
+
}
|
|
46
|
+
function part(path, xml) {
|
|
47
|
+
return { path, data: encoder.encode(xml) };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=write-xlsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-xlsx.js","sourceRoot":"","sources":["../src/write-xlsx.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EAEb,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAGL,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAe,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAcpE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAkB,EAClB,OAAO,GAAiB,EAAE;IAE1B,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE/B,kGAAkG;IAClG,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IACxE,OAAO,aAAa,CAClB;QACE,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,EAAE,uBAAuB,EAAE,CAAC;QAC9C,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,4BAA4B,EAAE,2BAA2B,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9E,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9C,GAAG,UAAU;KACd,EACD,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,GAAW;IACrC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Declaration every part starts with. Excel writes `standalone="yes"`; some readers expect it. */
|
|
2
|
+
export declare const XML_DECLARATION = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n";
|
|
3
|
+
/**
|
|
4
|
+
* Makes text safe to place in XML: escapes the five reserved characters and drops what XML 1.0
|
|
5
|
+
* cannot carry (control characters other than tab, newline and carriage return, the two
|
|
6
|
+
* non-characters U+FFFE and U+FFFF, and lone surrogates). Scans once and returns the input
|
|
7
|
+
* untouched when nothing needs changing, which is the common case for cell text.
|
|
8
|
+
*
|
|
9
|
+
* @example escapeXml("Tom & Jerry\u0000") // "Tom & Jerry"
|
|
10
|
+
*/
|
|
11
|
+
export declare function escapeXml(text: string): string;
|
|
12
|
+
/** True when leading or trailing whitespace must survive, so the `<t>` needs `xml:space="preserve"`. */
|
|
13
|
+
export declare function needsSpacePreserve(text: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Collects the text of one part and encodes it as it comes, so a large part never exists as one
|
|
16
|
+
* JavaScript string. `write` takes whole characters; `finish` wraps the body in the text that is
|
|
17
|
+
* only known at the end, such as a dimension computed from the rows, and returns the bytes.
|
|
18
|
+
*/
|
|
19
|
+
export interface XmlSink {
|
|
20
|
+
write(text: string): void;
|
|
21
|
+
finish(prefix: string, suffix: string): Uint8Array;
|
|
22
|
+
}
|
|
23
|
+
export declare function createXmlSink(): XmlSink;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/xml/index.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,eAAO,MAAM,eAAe,oEAA8D,CAAC;AAgB3F;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8B9C;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxD;AAiDD;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;CACpD;AAED,wBAAgB,aAAa,IAAI,OAAO,CA+CvC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/** Declaration every part starts with. Excel writes `standalone="yes"`; some readers expect it. */
|
|
2
|
+
export const XML_DECLARATION = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
|
|
3
|
+
const TAB = 9;
|
|
4
|
+
const LINE_FEED = 10;
|
|
5
|
+
const CARRIAGE_RETURN = 13;
|
|
6
|
+
const SPACE = 32;
|
|
7
|
+
const DOUBLE_QUOTE = 34;
|
|
8
|
+
const AMPERSAND = 38;
|
|
9
|
+
const APOSTROPHE = 39;
|
|
10
|
+
const LESS_THAN = 60;
|
|
11
|
+
const GREATER_THAN = 62;
|
|
12
|
+
const HIGH_SURROGATE_START = 0xd800;
|
|
13
|
+
const LOW_SURROGATE_START = 0xdc00;
|
|
14
|
+
const LOW_SURROGATE_END = 0xdfff;
|
|
15
|
+
const NOT_A_CHARACTER = 0xfffe;
|
|
16
|
+
/**
|
|
17
|
+
* Makes text safe to place in XML: escapes the five reserved characters and drops what XML 1.0
|
|
18
|
+
* cannot carry (control characters other than tab, newline and carriage return, the two
|
|
19
|
+
* non-characters U+FFFE and U+FFFF, and lone surrogates). Scans once and returns the input
|
|
20
|
+
* untouched when nothing needs changing, which is the common case for cell text.
|
|
21
|
+
*
|
|
22
|
+
* @example escapeXml("Tom & Jerry\u0000") // "Tom & Jerry"
|
|
23
|
+
*/
|
|
24
|
+
export function escapeXml(text) {
|
|
25
|
+
const length = text.length;
|
|
26
|
+
let index = 0;
|
|
27
|
+
for (; index < length; index++) {
|
|
28
|
+
const code = text.charCodeAt(index);
|
|
29
|
+
if (isReserved(code) || !isPlainValid(code))
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
if (index === length)
|
|
33
|
+
return text;
|
|
34
|
+
let out = "";
|
|
35
|
+
let copiedUpTo = 0;
|
|
36
|
+
for (; index < length; index++) {
|
|
37
|
+
const code = text.charCodeAt(index);
|
|
38
|
+
if (code >= HIGH_SURROGATE_START && code <= LOW_SURROGATE_END) {
|
|
39
|
+
// A high surrogate followed by a low surrogate is one valid character; anything else is dropped.
|
|
40
|
+
const next = index + 1 < length ? text.charCodeAt(index + 1) : 0;
|
|
41
|
+
if (code < LOW_SURROGATE_START && next >= LOW_SURROGATE_START && next <= LOW_SURROGATE_END) {
|
|
42
|
+
index++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
out += text.slice(copiedUpTo, index);
|
|
46
|
+
copiedUpTo = index + 1;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const replacement = replacementFor(code);
|
|
50
|
+
if (replacement === undefined)
|
|
51
|
+
continue;
|
|
52
|
+
out += text.slice(copiedUpTo, index) + replacement;
|
|
53
|
+
copiedUpTo = index + 1;
|
|
54
|
+
}
|
|
55
|
+
return out + text.slice(copiedUpTo);
|
|
56
|
+
}
|
|
57
|
+
/** True when leading or trailing whitespace must survive, so the `<t>` needs `xml:space="preserve"`. */
|
|
58
|
+
export function needsSpacePreserve(text) {
|
|
59
|
+
if (text.length === 0)
|
|
60
|
+
return false;
|
|
61
|
+
return isWhitespace(text.charCodeAt(0)) || isWhitespace(text.charCodeAt(text.length - 1));
|
|
62
|
+
}
|
|
63
|
+
function isReserved(code) {
|
|
64
|
+
return (code === AMPERSAND ||
|
|
65
|
+
code === LESS_THAN ||
|
|
66
|
+
code === GREATER_THAN ||
|
|
67
|
+
code === DOUBLE_QUOTE ||
|
|
68
|
+
code === APOSTROPHE);
|
|
69
|
+
}
|
|
70
|
+
/** Valid on its own: not a control character, not a non-character, not a surrogate. */
|
|
71
|
+
function isPlainValid(code) {
|
|
72
|
+
if (code < SPACE)
|
|
73
|
+
return code === TAB || code === LINE_FEED || code === CARRIAGE_RETURN;
|
|
74
|
+
if (code >= HIGH_SURROGATE_START && code <= LOW_SURROGATE_END)
|
|
75
|
+
return false;
|
|
76
|
+
return code < NOT_A_CHARACTER;
|
|
77
|
+
}
|
|
78
|
+
/** The escape for a reserved character, an empty string for an invalid one, undefined to keep. */
|
|
79
|
+
function replacementFor(code) {
|
|
80
|
+
switch (code) {
|
|
81
|
+
case AMPERSAND:
|
|
82
|
+
return "&";
|
|
83
|
+
case LESS_THAN:
|
|
84
|
+
return "<";
|
|
85
|
+
case GREATER_THAN:
|
|
86
|
+
return ">";
|
|
87
|
+
case DOUBLE_QUOTE:
|
|
88
|
+
return """;
|
|
89
|
+
case APOSTROPHE:
|
|
90
|
+
return "'";
|
|
91
|
+
default:
|
|
92
|
+
return isPlainValid(code) ? undefined : "";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function isWhitespace(code) {
|
|
96
|
+
return code === SPACE || code === TAB || code === LINE_FEED || code === CARRIAGE_RETURN;
|
|
97
|
+
}
|
|
98
|
+
/** The first block of a sink; blocks double up to the cap, so small parts stay small. */
|
|
99
|
+
const FIRST_BLOCK_SIZE = 16_384;
|
|
100
|
+
const MAX_BLOCK_SIZE = 1_048_576;
|
|
101
|
+
/** Pending text is encoded once it reaches this many UTF-16 units: few calls, short-lived ropes. */
|
|
102
|
+
const FLUSH_AT = 65_536;
|
|
103
|
+
const utf8 = new TextEncoder();
|
|
104
|
+
export function createXmlSink() {
|
|
105
|
+
const blocks = [];
|
|
106
|
+
let blockSize = FIRST_BLOCK_SIZE;
|
|
107
|
+
let block = new Uint8Array(blockSize);
|
|
108
|
+
let used = 0;
|
|
109
|
+
let total = 0;
|
|
110
|
+
let pending = "";
|
|
111
|
+
const flush = () => {
|
|
112
|
+
let text = pending;
|
|
113
|
+
pending = "";
|
|
114
|
+
while (text.length > 0) {
|
|
115
|
+
const { read, written } = utf8.encodeInto(text, block.subarray(used));
|
|
116
|
+
used += written;
|
|
117
|
+
total += written;
|
|
118
|
+
if (read === text.length)
|
|
119
|
+
break;
|
|
120
|
+
// The block cannot take the next character: seal it and start a bigger one.
|
|
121
|
+
blocks.push(block.subarray(0, used));
|
|
122
|
+
blockSize = Math.min(blockSize * 2, MAX_BLOCK_SIZE);
|
|
123
|
+
block = new Uint8Array(blockSize);
|
|
124
|
+
used = 0;
|
|
125
|
+
text = text.slice(read);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
write(text) {
|
|
130
|
+
pending += text;
|
|
131
|
+
if (pending.length >= FLUSH_AT)
|
|
132
|
+
flush();
|
|
133
|
+
},
|
|
134
|
+
finish(prefix, suffix) {
|
|
135
|
+
flush();
|
|
136
|
+
const head = utf8.encode(prefix);
|
|
137
|
+
const tail = utf8.encode(suffix);
|
|
138
|
+
const out = new Uint8Array(head.length + total + tail.length);
|
|
139
|
+
out.set(head, 0);
|
|
140
|
+
let offset = head.length;
|
|
141
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
142
|
+
const sealed = blocks[i];
|
|
143
|
+
out.set(sealed, offset);
|
|
144
|
+
offset += sealed.length;
|
|
145
|
+
}
|
|
146
|
+
out.set(block.subarray(0, used), offset);
|
|
147
|
+
out.set(tail, offset + used);
|
|
148
|
+
return out;
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/xml/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,83 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xlsx-mini",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Zero-dependency .xlsx writer for TypeScript
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Zero-dependency .xlsx writer for TypeScript that runs everywhere.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"excel",
|
|
7
|
+
"export",
|
|
8
|
+
"spreadsheet",
|
|
9
|
+
"typescript",
|
|
10
|
+
"xlsx",
|
|
11
|
+
"zero-dependency"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/ANicholasson/xlsx-mini#readme",
|
|
14
|
+
"bugs": "https://github.com/ANicholasson/xlsx-mini/issues",
|
|
5
15
|
"license": "MIT",
|
|
6
16
|
"author": "Aron Nicholasson",
|
|
7
|
-
"repository": {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/ANicholasson/xlsx-mini.git"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./browser": {
|
|
34
|
+
"types": "./dist/browser.d.ts",
|
|
35
|
+
"default": "./dist/browser.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public",
|
|
41
|
+
"provenance": true
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@arethetypeswrong/cli": "0.18.5",
|
|
45
|
+
"@changesets/cli": "3.0.3",
|
|
46
|
+
"@edge-runtime/vm": "5.0.0",
|
|
47
|
+
"@swc/core": "^1.16.21",
|
|
48
|
+
"@types/node": "^26.6.6",
|
|
49
|
+
"@vitest/coverage-v8": "5.0.5",
|
|
50
|
+
"bun": "1.4.4",
|
|
51
|
+
"deno": "2.9.6",
|
|
52
|
+
"dependency-cruiser": "18.7.2",
|
|
53
|
+
"fast-check": "^4.10.2",
|
|
54
|
+
"knip": "6.44.1",
|
|
55
|
+
"miniflare": "4.20260730.0",
|
|
56
|
+
"publint": "0.3.25",
|
|
57
|
+
"rolldown": "1.2.16",
|
|
58
|
+
"typescript": "7.0.2",
|
|
59
|
+
"vite-plus": "1.4.0"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": "^20.12.0 || >=22"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"build": "tsc -p tsconfig.build.json",
|
|
66
|
+
"typecheck": "tsc --noEmit",
|
|
67
|
+
"lint:boundaries": "depcruise src test bench",
|
|
68
|
+
"knip": "knip",
|
|
69
|
+
"test": "vp test run",
|
|
70
|
+
"test:coverage": "vp test run --coverage",
|
|
71
|
+
"bench": "pnpm run build && node bench/run.ts",
|
|
72
|
+
"bench:all": "pnpm run build && node bench/run.ts --json bench/results/node.json && bun bench/run.ts --json bench/results/bun.json && deno run --allow-all --no-lock bench/run.ts --json bench/results/deno.json",
|
|
73
|
+
"bench:report": "node bench/report.ts --head bench/results --out bench/results/report.md",
|
|
74
|
+
"bench:memory": "pnpm run build && node bench/memory.ts",
|
|
75
|
+
"check:package": "pnpm run build && publint --strict && attw --pack . --profile esm-only",
|
|
76
|
+
"verify": "vp check && pnpm run typecheck && pnpm run lint:boundaries && pnpm run knip && pnpm run test:coverage && pnpm run check:package",
|
|
77
|
+
"fixtures:update": "UPDATE_FIXTURES=1 vp test run test/golden.test.ts",
|
|
78
|
+
"validate": "XLSX_MINI_VALIDATE=1 vp test run test/validate",
|
|
79
|
+
"changeset": "changeset",
|
|
80
|
+
"version": "changeset version",
|
|
81
|
+
"release": "pnpm run build && changeset publish"
|
|
82
|
+
}
|
|
83
|
+
}
|