xlsx-mini 0.1.0 → 0.2.0
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 +92 -16
- package/dist/errors/index.d.ts +12 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +30 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles/index.d.ts +40 -8
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/index.js +267 -30
- package/dist/styles/index.js.map +1 -1
- package/dist/worksheet/index.d.ts.map +1 -1
- package/dist/worksheet/index.js +9 -7
- package/dist/worksheet/index.js.map +1 -1
- package/dist/worksheet/lib/layout.d.ts +8 -1
- package/dist/worksheet/lib/layout.d.ts.map +1 -1
- package/dist/worksheet/lib/layout.js +75 -3
- package/dist/worksheet/lib/layout.js.map +1 -1
- package/dist/worksheet/lib/model.d.ts +5 -0
- package/dist/worksheet/lib/model.d.ts.map +1 -1
- package/dist/worksheet/lib/render-rows.d.ts +10 -4
- package/dist/worksheet/lib/render-rows.d.ts.map +1 -1
- package/dist/worksheet/lib/render-rows.js +51 -19
- package/dist/worksheet/lib/render-rows.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -196,7 +196,7 @@ export default function fromObjects(orders: Order[]): Promise<Uint8Array> {
|
|
|
196
196
|
|
|
197
197
|
## Number formats
|
|
198
198
|
|
|
199
|
-
A style sets `bold` and a `numberFormat`: an Excel format string, or a built-in format id from 0 to 49. Column styles apply to every cell in the column; a cell's own style wins.
|
|
199
|
+
A style sets `bold` and a `numberFormat`: an Excel format string, or a built-in format id from 0 to 49; the next section covers fonts, fills, borders and alignment. Column styles apply to every cell in the column; a cell's own style wins.
|
|
200
200
|
|
|
201
201
|
<!-- snippet: formats -->
|
|
202
202
|
|
|
@@ -247,6 +247,76 @@ export default function formats(): Promise<Uint8Array> {
|
|
|
247
247
|
| Date and time | `yyyy-mm-dd hh:mm` |
|
|
248
248
|
| Text as typed | `@` |
|
|
249
249
|
|
|
250
|
+
## Fonts, fills, borders and alignment
|
|
251
|
+
|
|
252
|
+
A style also sets the font (`italic`, `fontSize` in points, `fontColor`), a solid `fill`, a `border` for all four sides or per side (`thin`, `medium`, `thick`), `align`, `verticalAlign`, `wrap` and `indent`. An indent aligns left unless `align` is `right`. Colours are `#rrggbb`. A sheet merges ranges with `merges` and sets `rowHeights` in points by row number. A cell object with a style and a `null` value writes an empty styled cell, which is how a border or a fill runs across a blank.
|
|
253
|
+
|
|
254
|
+
<!-- snippet: appearance -->
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
import { type CellStyle, writeXlsx } from "xlsx-mini";
|
|
258
|
+
|
|
259
|
+
const title: CellStyle = {
|
|
260
|
+
bold: true,
|
|
261
|
+
fontSize: 16,
|
|
262
|
+
fontColor: "#ffffff",
|
|
263
|
+
fill: "#1f4e79",
|
|
264
|
+
align: "center",
|
|
265
|
+
verticalAlign: "middle",
|
|
266
|
+
};
|
|
267
|
+
const heading: CellStyle = { bold: true, fill: "#d9e1f2", border: "thin" };
|
|
268
|
+
const total: CellStyle = { bold: true, border: { top: "medium", bottom: "thick" } };
|
|
269
|
+
|
|
270
|
+
export default function appearance(): Promise<Uint8Array> {
|
|
271
|
+
return writeXlsx({
|
|
272
|
+
sheets: [
|
|
273
|
+
{
|
|
274
|
+
name: "Invoice",
|
|
275
|
+
columns: [
|
|
276
|
+
{ width: 14 },
|
|
277
|
+
{ width: 36 },
|
|
278
|
+
{ width: 8, style: { align: "right" } },
|
|
279
|
+
{ width: 14, style: { numberFormat: '#,##0.00 "kr"' } },
|
|
280
|
+
],
|
|
281
|
+
// The title spans four columns; its row and the wrapped row get a height in points.
|
|
282
|
+
merges: ["A1:D1"],
|
|
283
|
+
rowHeights: { 1: 28, 3: 48 },
|
|
284
|
+
rows: [
|
|
285
|
+
[{ value: "Invoice 2026-1042", style: title }],
|
|
286
|
+
[
|
|
287
|
+
{ value: "Item", style: heading },
|
|
288
|
+
{ value: "Description", style: heading },
|
|
289
|
+
{ value: "Qty", style: heading },
|
|
290
|
+
{ value: "Amount", style: heading },
|
|
291
|
+
],
|
|
292
|
+
[
|
|
293
|
+
"Desk",
|
|
294
|
+
{
|
|
295
|
+
value: "Height-adjustable desk, delivered and assembled on site",
|
|
296
|
+
style: { wrap: true, verticalAlign: "top" },
|
|
297
|
+
},
|
|
298
|
+
2,
|
|
299
|
+
9998,
|
|
300
|
+
],
|
|
301
|
+
["Chair", { value: "Mesh office chair", style: { indent: 1 } }, 4, 5198],
|
|
302
|
+
[
|
|
303
|
+
{ value: "Total", style: total },
|
|
304
|
+
// A styled cell without a value: the rule runs across the blank.
|
|
305
|
+
{ value: null, style: total },
|
|
306
|
+
{ value: 6, style: total },
|
|
307
|
+
{ value: 15196, style: total },
|
|
308
|
+
],
|
|
309
|
+
[],
|
|
310
|
+
[{ value: "Payment within 30 days.", style: { italic: true, fontColor: "#808080" } }],
|
|
311
|
+
],
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Every distinct style is written once, however many cells share it, so styling costs nothing per cell beyond a lookup.
|
|
319
|
+
|
|
250
320
|
## Dates and Temporal
|
|
251
321
|
|
|
252
322
|
A `Date` is written as its UTC instant; what the reader shows follows the cell's format, or the built-in date-time format when the cell has none. Temporal values need no polyfill: `Temporal.PlainDate`, `PlainDateTime`, `ZonedDateTime` and `Instant` are recognised by their `Symbol.toStringTag`, and a `PlainDate` gets the built-in date format. Dates run from 1900-01-01 to 9999-12-31, in Excel's 1900 date system.
|
|
@@ -351,7 +421,10 @@ export default async function safely(): Promise<string> {
|
|
|
351
421
|
| `UNSUPPORTED_VALUE` | A value no cell can hold and `coerce` did not convert. |
|
|
352
422
|
| `INVALID_NUMBER_FORMAT` | A format string outside 1 to 255 characters, or a built-in id outside 0 to 49. |
|
|
353
423
|
| `INVALID_COLUMN_WIDTH` | A width outside 0 to 255. |
|
|
424
|
+
| `INVALID_STYLE` | A colour not `#rrggbb`, a border, alignment, font size or indent outside what Excel accepts. |
|
|
354
425
|
| `INVALID_FREEZE` | Frozen rows or columns outside the sheet. |
|
|
426
|
+
| `INVALID_MERGE` | A merge not in A1 form, a single cell, outside the sheet, or overlapping another merge. |
|
|
427
|
+
| `INVALID_ROW_HEIGHT` | A row number below 1 or a height outside 0 to 409 points. |
|
|
355
428
|
| `CELL_TEXT_TOO_LONG` | Text over 32 767 characters. |
|
|
356
429
|
| `TOO_MANY_COLUMNS` | More than 16 384 cells in a row. |
|
|
357
430
|
| `TOO_MANY_ROWS` | More than 1 048 576 rows. |
|
|
@@ -362,21 +435,23 @@ Empty cells cost nothing: `null`, `undefined` and rows without cells are skipped
|
|
|
362
435
|
|
|
363
436
|
## API
|
|
364
437
|
|
|
365
|
-
| Export | Shape
|
|
366
|
-
| ---------------------------------- |
|
|
367
|
-
| `writeXlsx(workbook, options?)` | `Promise<Uint8Array<ArrayBuffer>>`
|
|
368
|
-
| `WriteOptions` | `{ coerce?: Coerce; compression?: "deflate" \| "none" }`; `"none"` writes STORE entries, byte-identical on every platform
|
|
369
|
-
| `Workbook` | `{ sheets: readonly Sheet[] }`
|
|
370
|
-
| `Sheet` | `{ name; rows: Iterable<Row>; columns?: (Column \| undefined)[]; freeze?: Freeze; autoFilter?: boolean }`
|
|
371
|
-
| `Row`, `Cell` | `readonly Cell[]`; `CellValue \| { value: CellValue; style?: CellStyle }`
|
|
372
|
-
| `CellValue` | `string \| number \| boolean \| Date \| TemporalLike \| null \| undefined \| Registered`
|
|
373
|
-
| `CellStyle` | `{ bold
|
|
374
|
-
| `
|
|
375
|
-
| `
|
|
376
|
-
| `
|
|
377
|
-
| `
|
|
378
|
-
| `
|
|
379
|
-
| `
|
|
438
|
+
| Export | Shape |
|
|
439
|
+
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
440
|
+
| `writeXlsx(workbook, options?)` | `Promise<Uint8Array<ArrayBuffer>>` |
|
|
441
|
+
| `WriteOptions` | `{ coerce?: Coerce; compression?: "deflate" \| "none" }`; `"none"` writes STORE entries, byte-identical on every platform |
|
|
442
|
+
| `Workbook` | `{ sheets: readonly Sheet[] }` |
|
|
443
|
+
| `Sheet` | `{ name; rows: Iterable<Row>; columns?: (Column \| undefined)[]; freeze?: Freeze; autoFilter?: boolean; merges?: string[]; rowHeights?: Record<number, number> }` |
|
|
444
|
+
| `Row`, `Cell` | `readonly Cell[]`; `CellValue \| { value: CellValue; style?: CellStyle }` |
|
|
445
|
+
| `CellValue` | `string \| number \| boolean \| Date \| TemporalLike \| null \| undefined \| Registered` |
|
|
446
|
+
| `CellStyle` | `{ bold?; italic?; fontSize?; fontColor?; fill?; border?; align?; verticalAlign?; wrap?; indent?; numberFormat? }`; colours `#rrggbb` |
|
|
447
|
+
| `BorderStyle`, `Borders` | `"thin" \| "medium" \| "thick"`; `{ top?; right?; bottom?; left? }` of those |
|
|
448
|
+
| `HorizontalAlign`, `VerticalAlign` | `"left" \| "center" \| "right"`; `"top" \| "middle" \| "bottom"` |
|
|
449
|
+
| `Column`, `Freeze` | `{ width?: number; style?: CellStyle }`; `{ rows?: number; columns?: number }` |
|
|
450
|
+
| `Coerce`, `Register`, `Registered` | `(value: Date \| TemporalLike \| Registered, path: string) => CellValue`; the augmentation point and what it holds |
|
|
451
|
+
| `sheetFromObjects(data, options)` | `Sheet`; options `{ name; columns?: ObjectColumn<T>[]; header?: CellStyle \| false; freeze?: boolean; autoFilter?: boolean }` |
|
|
452
|
+
| `XlsxMiniError`, `ErrorCode` | `{ code: ErrorCode; path: string; message }` |
|
|
453
|
+
| `XLSX_MIME_TYPE` | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` |
|
|
454
|
+
| `downloadXlsx(bytes, filename)` | from `xlsx-mini/browser`; adds `.xlsx` when the name lacks it |
|
|
380
455
|
|
|
381
456
|
Rows are read once: pass a generator or a database cursor and the writer streams through it, encoding each row as it comes.
|
|
382
457
|
|
|
@@ -411,6 +486,7 @@ Each golden fixture is opened by hand in four applications before a release; `do
|
|
|
411
486
|
| Styles and number formats | clean | clean | clean | clean |
|
|
412
487
|
| Widths, frozen panes, autofilter | clean | clean | clean | clean |
|
|
413
488
|
| Built from objects | clean | clean | clean | clean |
|
|
489
|
+
| Fonts, fills, borders, merges | clean | clean | clean | clean |
|
|
414
490
|
|
|
415
491
|
LibreOffice also reads every fixture back cell for cell in CI, on every change.
|
|
416
492
|
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Every failure the writer reports, as a string literal so callers can switch on it. */
|
|
2
|
-
export type ErrorCode = "NO_SHEETS" | "INVALID_SHEET_NAME" | "DUPLICATE_SHEET_NAME" | "INVALID_NUMBER" | "INVALID_DATE" | "DATE_OUT_OF_RANGE" | "UNSUPPORTED_VALUE" | "INVALID_NUMBER_FORMAT" | "INVALID_COLUMN_WIDTH" | "INVALID_FREEZE" | "CELL_TEXT_TOO_LONG" | "TOO_MANY_COLUMNS" | "TOO_MANY_ROWS" | "PACKAGE_TOO_LARGE" | "NO_DOM";
|
|
2
|
+
export type ErrorCode = "NO_SHEETS" | "INVALID_SHEET_NAME" | "DUPLICATE_SHEET_NAME" | "INVALID_NUMBER" | "INVALID_DATE" | "DATE_OUT_OF_RANGE" | "UNSUPPORTED_VALUE" | "INVALID_NUMBER_FORMAT" | "INVALID_STYLE" | "INVALID_COLUMN_WIDTH" | "INVALID_FREEZE" | "INVALID_MERGE" | "INVALID_ROW_HEIGHT" | "CELL_TEXT_TOO_LONG" | "TOO_MANY_COLUMNS" | "TOO_MANY_ROWS" | "PACKAGE_TOO_LARGE" | "NO_DOM";
|
|
3
3
|
/**
|
|
4
4
|
* The one error class the writer throws. `code` says what went wrong, `path` says where in the
|
|
5
5
|
* input, as the caller wrote it: `sheets[1].rows[40][2]` is the third cell of the 41st row of the
|
|
@@ -18,4 +18,15 @@ export declare class XlsxMiniError extends Error {
|
|
|
18
18
|
readonly path: string;
|
|
19
19
|
constructor(code: ErrorCode, path: string, message: string);
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* The same error at a longer path: a feature that validates without knowing where its input sits
|
|
23
|
+
* throws with the local path, and the caller prefixes its own. `prefix` ends up as `prefix.local`,
|
|
24
|
+
* or as `prefix` alone when the local path is empty.
|
|
25
|
+
*/
|
|
26
|
+
export declare function atPath(error: XlsxMiniError, prefix: string): XlsxMiniError;
|
|
27
|
+
/**
|
|
28
|
+
* A value as an error message names it: strings quoted, other primitives as they print, objects
|
|
29
|
+
* by their tag or constructor. Never throws, unlike `JSON.stringify` on a bigint.
|
|
30
|
+
*/
|
|
31
|
+
export declare function describeValue(value: unknown): string;
|
|
21
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,sBAAsB,GACtB,gBAAgB,GAChB,oBAAoB,GACpB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,QAAQ,CAAC;AAEb;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,mBAAmB;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAIzD;CACF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,GAChB,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,eAAe,GACf,sBAAsB,GACtB,gBAAgB,GAChB,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,QAAQ,CAAC;AAEb;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,mBAAmB;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAIzD;CACF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAU1E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQpD"}
|
package/dist/errors/index.js
CHANGED
|
@@ -15,9 +15,38 @@ export class XlsxMiniError extends Error {
|
|
|
15
15
|
code;
|
|
16
16
|
path;
|
|
17
17
|
constructor(code, path, message) {
|
|
18
|
-
super(`${message} at ${path}`);
|
|
18
|
+
super(path.length === 0 ? message : `${message} at ${path}`);
|
|
19
19
|
this.code = code;
|
|
20
20
|
this.path = path;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* The same error at a longer path: a feature that validates without knowing where its input sits
|
|
25
|
+
* throws with the local path, and the caller prefixes its own. `prefix` ends up as `prefix.local`,
|
|
26
|
+
* or as `prefix` alone when the local path is empty.
|
|
27
|
+
*/
|
|
28
|
+
export function atPath(error, prefix) {
|
|
29
|
+
const suffix = ` at ${error.path}`;
|
|
30
|
+
const message = error.message.endsWith(suffix)
|
|
31
|
+
? error.message.slice(0, -suffix.length)
|
|
32
|
+
: error.message;
|
|
33
|
+
return new XlsxMiniError(error.code, error.path.length === 0 ? prefix : `${prefix}.${error.path}`, message);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A value as an error message names it: strings quoted, other primitives as they print, objects
|
|
37
|
+
* by their tag or constructor. Never throws, unlike `JSON.stringify` on a bigint.
|
|
38
|
+
*/
|
|
39
|
+
export function describeValue(value) {
|
|
40
|
+
if (typeof value === "string")
|
|
41
|
+
return JSON.stringify(value);
|
|
42
|
+
if (typeof value === "bigint")
|
|
43
|
+
return `${value}n`;
|
|
44
|
+
if (typeof value !== "object" || value === null)
|
|
45
|
+
return String(value);
|
|
46
|
+
const tag = value[Symbol.toStringTag];
|
|
47
|
+
if (typeof tag === "string")
|
|
48
|
+
return tag;
|
|
49
|
+
const constructor = value.constructor;
|
|
50
|
+
return constructor?.name ?? "object";
|
|
51
|
+
}
|
|
23
52
|
//# sourceMappingURL=index.js.map
|
package/dist/errors/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACpB,IAAI,GAAG,eAAe,CAAC;IAChC,IAAI,CAAY;IAChB,IAAI,CAAS;IAEtB,YAAY,IAAe,EAAE,IAAY,EAAE,OAAe;QACxD,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,MAAM,CAAC,KAAoB,EAAE,MAAc;IACzD,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAClB,OAAO,IAAI,aAAa,CACtB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,EAC5D,OAAO,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { type ErrorCode, XlsxMiniError } from "./errors/index.js";
|
|
|
2
2
|
export type { CompressionMode } from "./opc/index.js";
|
|
3
3
|
export { type ObjectColumn, type SheetFromObjectsOptions, sheetFromObjects, } from "./worksheet/index.js";
|
|
4
4
|
export { type WriteOptions, writeXlsx } from "./write-xlsx.js";
|
|
5
|
-
export type { CellStyle } from "./styles/index.js";
|
|
5
|
+
export type { BorderStyle, Borders, CellStyle, HorizontalAlign, VerticalAlign, } from "./styles/index.js";
|
|
6
6
|
export { type Workbook, XLSX_MIME_TYPE } from "./workbook/index.js";
|
|
7
7
|
export type { Cell, CellObject, CellValue, Coerce, Column, Freeze, Register, Registered, Row, Sheet, TemporalInstantLike, TemporalLike, TemporalPlainDateLike, TemporalPlainDateTimeLike, TemporalZonedDateTimeLike, } from "./worksheet/index.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EACV,WAAW,EACX,OAAO,EACP,SAAS,EACT,eAAe,EACf,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpE,YAAY,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,UAAU,EACV,GAAG,EACH,KAAK,EACL,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAGL,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAqB,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAGL,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAqB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ/D,OAAO,EAAiB,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/styles/index.d.ts
CHANGED
|
@@ -1,12 +1,42 @@
|
|
|
1
|
+
/** Line style of a cell border. */
|
|
2
|
+
export type BorderStyle = "thin" | "medium" | "thick";
|
|
3
|
+
/** A border per side; a side left out has no border. */
|
|
4
|
+
export interface Borders {
|
|
5
|
+
readonly top?: BorderStyle;
|
|
6
|
+
readonly right?: BorderStyle;
|
|
7
|
+
readonly bottom?: BorderStyle;
|
|
8
|
+
readonly left?: BorderStyle;
|
|
9
|
+
}
|
|
10
|
+
export type HorizontalAlign = "left" | "center" | "right";
|
|
11
|
+
export type VerticalAlign = "top" | "middle" | "bottom";
|
|
1
12
|
/**
|
|
2
|
-
* How a cell looks. Set on a cell object or as a column's default; a cell's own properties win
|
|
13
|
+
* How a cell looks. Set on a cell object or as a column's default; a cell's own properties win,
|
|
14
|
+
* property by property. Colours are `#rrggbb`.
|
|
3
15
|
*
|
|
4
16
|
* @example
|
|
5
|
-
* const money: CellStyle = { numberFormat: '#,##0.00 "kr"' };
|
|
6
|
-
* const header: CellStyle = { bold: true };
|
|
17
|
+
* const money: CellStyle = { numberFormat: '#,##0.00 "kr"', align: "right" };
|
|
18
|
+
* const header: CellStyle = { bold: true, fill: "#d9e1f2", border: "thin" };
|
|
7
19
|
*/
|
|
8
20
|
export interface CellStyle {
|
|
9
21
|
readonly bold?: boolean;
|
|
22
|
+
readonly italic?: boolean;
|
|
23
|
+
/** Font size in points, from 1 to 409; the default is 11. */
|
|
24
|
+
readonly fontSize?: number;
|
|
25
|
+
/** Font colour as `#rrggbb`. */
|
|
26
|
+
readonly fontColor?: string;
|
|
27
|
+
/** Solid background colour as `#rrggbb`. */
|
|
28
|
+
readonly fill?: string;
|
|
29
|
+
/** One line style for all four sides, or a style per side. */
|
|
30
|
+
readonly border?: BorderStyle | Borders;
|
|
31
|
+
readonly align?: HorizontalAlign;
|
|
32
|
+
readonly verticalAlign?: VerticalAlign;
|
|
33
|
+
/** Wrap long text onto several lines inside the cell. */
|
|
34
|
+
readonly wrap?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Indent in Excel's indent steps, from 0 to 250. Excel indents left- or right-aligned text, so an
|
|
37
|
+
* indent without `align` aligns left, and an indent with `center` is an error.
|
|
38
|
+
*/
|
|
39
|
+
readonly indent?: number;
|
|
10
40
|
/** An Excel format string such as `"0.0%"` or `"yyyy-mm-dd"`, or a built-in format id from 0 to 49. */
|
|
11
41
|
readonly numberFormat?: string | number;
|
|
12
42
|
}
|
|
@@ -15,18 +45,20 @@ export interface StyleTable {
|
|
|
15
45
|
/**
|
|
16
46
|
* The index of the cell format for a cell style merged over a column style. `dateDefault` is the
|
|
17
47
|
* built-in number format a date-like value falls back to when neither style sets one, or 0.
|
|
48
|
+
* Throws with the offending property as the path, for the caller to prefix.
|
|
18
49
|
*/
|
|
19
50
|
indexFor(cell: CellStyle | undefined, column: CellStyle | undefined, dateDefault: number): number;
|
|
20
|
-
/** Throws
|
|
51
|
+
/** Throws for a value Excel would refuse, with the property name as the path, registering nothing. */
|
|
21
52
|
validate(style: CellStyle): void;
|
|
22
53
|
/** Renders the styles part. Call once, after every sheet has been rendered. */
|
|
23
54
|
render(): string;
|
|
24
55
|
}
|
|
25
56
|
/**
|
|
26
|
-
* Index 0 is always the default format. Fonts, custom number formats and cell
|
|
27
|
-
* registered once per distinct value. A style object seen again
|
|
28
|
-
*
|
|
29
|
-
*
|
|
57
|
+
* Index 0 is always the default format. Fonts, fills, borders, custom number formats and cell
|
|
58
|
+
* formats are each registered once per distinct value. A style object seen again, alone or over the
|
|
59
|
+
* same column style, is resolved through WeakMaps by identity, so a column or header style reused
|
|
60
|
+
* across thousands of cells costs lookups and no string per cell. Excel expects fill 0 to be
|
|
61
|
+
* `none`, fill 1 to be `gray125`, and a `Normal` cell style.
|
|
30
62
|
*/
|
|
31
63
|
export declare function createStyleTable(): StyleTable;
|
|
32
64
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"AAGA,mCAAmC;AACnC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtD,wDAAwD;AACxD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,gCAAgC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,uGAAuG;IACvG,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAED,2GAA2G;AAC3G,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAClG,sGAAsG;IACtG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,+EAA+E;IAC/E,MAAM,IAAI,MAAM,CAAC;CAClB;AAqED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAiT7C"}
|
package/dist/styles/index.js
CHANGED
|
@@ -1,32 +1,86 @@
|
|
|
1
|
-
import { XlsxMiniError } from "../errors/index.js";
|
|
1
|
+
import { XlsxMiniError, describeValue } from "../errors/index.js";
|
|
2
2
|
import { XML_DECLARATION, escapeXml } from "../xml/index.js";
|
|
3
3
|
const GENERAL = 0;
|
|
4
4
|
const MAX_BUILT_IN_FORMAT = 49;
|
|
5
5
|
const FIRST_CUSTOM_FORMAT = 164;
|
|
6
6
|
const MAX_FORMAT_LENGTH = 255;
|
|
7
|
+
const DEFAULT_FONT_SIZE = 11;
|
|
8
|
+
const MIN_FONT_SIZE = 1;
|
|
9
|
+
const MAX_FONT_SIZE = 409;
|
|
10
|
+
const MAX_INDENT = 250;
|
|
11
|
+
const COLOR = /^#[0-9a-fA-F]{6}$/;
|
|
12
|
+
const BORDER_STYLES = new Set(["thin", "medium", "thick"]);
|
|
13
|
+
const HORIZONTAL = new Set(["left", "center", "right"]);
|
|
14
|
+
const VERTICAL = new Set(["top", "middle", "bottom"]);
|
|
15
|
+
const SIDES = ["left", "right", "top", "bottom"];
|
|
16
|
+
const DEFAULT_FONT = '<font><sz val="11"/><name val="Calibri"/><family val="2"/></font>';
|
|
17
|
+
const DEFAULT_FILLS = '<fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill>';
|
|
18
|
+
const DEFAULT_BORDER = "<border><left/><right/><top/><bottom/><diagonal/></border>";
|
|
19
|
+
function invalid(property, message) {
|
|
20
|
+
return new XlsxMiniError("INVALID_STYLE", property, message);
|
|
21
|
+
}
|
|
22
|
+
/** The style itself must be an object; the path is empty because the whole value is wrong. */
|
|
23
|
+
function styleObject(style) {
|
|
24
|
+
if (typeof style !== "object" || style === null) {
|
|
25
|
+
throw invalid("", `A style is an object, not ${describeValue(style)}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function flag(property, value) {
|
|
29
|
+
if (value === undefined)
|
|
30
|
+
return false;
|
|
31
|
+
if (typeof value !== "boolean") {
|
|
32
|
+
throw invalid(property, `${property} is true or false, not ${describeValue(value)}`);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
/** `#rrggbb` as the ARGB hex Excel stores, or an error naming the property. */
|
|
37
|
+
function argb(property, color) {
|
|
38
|
+
if (typeof color !== "string" || !COLOR.test(color)) {
|
|
39
|
+
throw invalid(property, `Colours are written as #rrggbb, not ${describeValue(color)}`);
|
|
40
|
+
}
|
|
41
|
+
return `FF${color.slice(1).toUpperCase()}`;
|
|
42
|
+
}
|
|
43
|
+
function borderSide(property, style) {
|
|
44
|
+
if (style === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
if (typeof style !== "string" || !BORDER_STYLES.has(style)) {
|
|
47
|
+
throw invalid(property, `Border styles are thin, medium or thick, not ${describeValue(style)}`);
|
|
48
|
+
}
|
|
49
|
+
return style;
|
|
50
|
+
}
|
|
7
51
|
/**
|
|
8
|
-
* Index 0 is always the default format. Fonts, custom number formats and cell
|
|
9
|
-
* registered once per distinct value. A style object seen again
|
|
10
|
-
*
|
|
11
|
-
*
|
|
52
|
+
* Index 0 is always the default format. Fonts, fills, borders, custom number formats and cell
|
|
53
|
+
* formats are each registered once per distinct value. A style object seen again, alone or over the
|
|
54
|
+
* same column style, is resolved through WeakMaps by identity, so a column or header style reused
|
|
55
|
+
* across thousands of cells costs lookups and no string per cell. Excel expects fill 0 to be
|
|
56
|
+
* `none`, fill 1 to be `gray125`, and a `Normal` cell style.
|
|
12
57
|
*/
|
|
13
58
|
export function createStyleTable() {
|
|
14
59
|
const cellFormats = ['<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>'];
|
|
15
60
|
const byKey = new Map();
|
|
16
61
|
const bySingleObject = new WeakMap();
|
|
62
|
+
/** The same, per date default, for a lone style on date cells: no key string per cell. */
|
|
63
|
+
const bySingleDated = new WeakMap();
|
|
64
|
+
/** Cell style over column style, per date default, by the identity of both objects. */
|
|
65
|
+
const byPair = new WeakMap();
|
|
17
66
|
/** Cell-format index per built-in date format, for unstyled date cells: no key string per cell. */
|
|
18
67
|
const byDateDefault = [];
|
|
19
68
|
const customFormats = new Map();
|
|
20
|
-
|
|
69
|
+
const fonts = [DEFAULT_FONT];
|
|
70
|
+
const fontIds = new Map();
|
|
71
|
+
const fills = [];
|
|
72
|
+
const fillIds = new Map();
|
|
73
|
+
const borders = [];
|
|
74
|
+
const borderIds = new Map();
|
|
21
75
|
const formatId = (format) => {
|
|
22
76
|
if (typeof format === "number") {
|
|
23
77
|
if (!Number.isInteger(format) || format < 0 || format > MAX_BUILT_IN_FORMAT) {
|
|
24
|
-
throw new XlsxMiniError("INVALID_NUMBER_FORMAT", "", `Built-in number formats are the integers 0 to ${MAX_BUILT_IN_FORMAT}, not ${format}`);
|
|
78
|
+
throw new XlsxMiniError("INVALID_NUMBER_FORMAT", "numberFormat", `Built-in number formats are the integers 0 to ${MAX_BUILT_IN_FORMAT}, not ${format}`);
|
|
25
79
|
}
|
|
26
80
|
return format;
|
|
27
81
|
}
|
|
28
|
-
if (format.length === 0 || format.length > MAX_FORMAT_LENGTH) {
|
|
29
|
-
throw new XlsxMiniError("INVALID_NUMBER_FORMAT", "", `A number format string must be 1 to ${MAX_FORMAT_LENGTH} characters`);
|
|
82
|
+
if (typeof format !== "string" || format.length === 0 || format.length > MAX_FORMAT_LENGTH) {
|
|
83
|
+
throw new XlsxMiniError("INVALID_NUMBER_FORMAT", "numberFormat", `A number format string must be 1 to ${MAX_FORMAT_LENGTH} characters`);
|
|
30
84
|
}
|
|
31
85
|
const known = customFormats.get(format);
|
|
32
86
|
if (known !== undefined)
|
|
@@ -35,37 +89,192 @@ export function createStyleTable() {
|
|
|
35
89
|
customFormats.set(format, id);
|
|
36
90
|
return id;
|
|
37
91
|
};
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
92
|
+
const fontSize = (size) => {
|
|
93
|
+
if (size === undefined)
|
|
94
|
+
return DEFAULT_FONT_SIZE;
|
|
95
|
+
if (typeof size !== "number" || !(size >= MIN_FONT_SIZE) || size > MAX_FONT_SIZE) {
|
|
96
|
+
throw invalid("fontSize", `Font sizes run from ${MIN_FONT_SIZE} to ${MAX_FONT_SIZE} points, not ${describeValue(size)}`);
|
|
97
|
+
}
|
|
98
|
+
return size;
|
|
99
|
+
};
|
|
100
|
+
const fontId = (bold, italic, size, color) => {
|
|
101
|
+
const points = fontSize(size);
|
|
102
|
+
const rgb = color === undefined ? "" : argb("fontColor", color);
|
|
103
|
+
if (!bold && !italic && points === DEFAULT_FONT_SIZE && rgb.length === 0)
|
|
104
|
+
return 0;
|
|
105
|
+
const key = `${bold ? "b" : ""}${italic ? "i" : ""}|${points}|${rgb}`;
|
|
106
|
+
const known = fontIds.get(key);
|
|
107
|
+
if (known !== undefined)
|
|
108
|
+
return known;
|
|
109
|
+
fonts.push("<font>" +
|
|
110
|
+
(bold ? "<b/>" : "") +
|
|
111
|
+
(italic ? "<i/>" : "") +
|
|
112
|
+
`<sz val="${points}"/>` +
|
|
113
|
+
(rgb.length === 0 ? "" : `<color rgb="${rgb}"/>`) +
|
|
114
|
+
'<name val="Calibri"/><family val="2"/></font>');
|
|
115
|
+
const id = fonts.length - 1;
|
|
116
|
+
fontIds.set(key, id);
|
|
117
|
+
return id;
|
|
118
|
+
};
|
|
119
|
+
const fillId = (color) => {
|
|
120
|
+
if (color === undefined)
|
|
121
|
+
return 0;
|
|
122
|
+
const rgb = argb("fill", color);
|
|
123
|
+
const known = fillIds.get(rgb);
|
|
124
|
+
if (known !== undefined)
|
|
125
|
+
return known;
|
|
126
|
+
fills.push(`<fill><patternFill patternType="solid"><fgColor rgb="${rgb}"/><bgColor indexed="64"/></patternFill></fill>`);
|
|
127
|
+
const id = fills.length + 1;
|
|
128
|
+
fillIds.set(rgb, id);
|
|
129
|
+
return id;
|
|
130
|
+
};
|
|
131
|
+
const borderId = (border) => {
|
|
132
|
+
if (border === undefined)
|
|
40
133
|
return 0;
|
|
41
|
-
|
|
134
|
+
let sides;
|
|
135
|
+
if (typeof border === "string") {
|
|
136
|
+
const all = borderSide("border", border);
|
|
137
|
+
sides = { top: all, right: all, bottom: all, left: all };
|
|
138
|
+
}
|
|
139
|
+
else if (typeof border === "object") {
|
|
140
|
+
sides = {
|
|
141
|
+
top: borderSide("border.top", border.top),
|
|
142
|
+
right: borderSide("border.right", border.right),
|
|
143
|
+
bottom: borderSide("border.bottom", border.bottom),
|
|
144
|
+
left: borderSide("border.left", border.left),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
throw invalid("border", "A border is a line style or an object with a style per side");
|
|
149
|
+
}
|
|
150
|
+
const key = SIDES.map((side) => sides[side] ?? "").join("|");
|
|
151
|
+
if (key === "|||")
|
|
152
|
+
return 0;
|
|
153
|
+
const known = borderIds.get(key);
|
|
154
|
+
if (known !== undefined)
|
|
155
|
+
return known;
|
|
156
|
+
let xml = "<border>";
|
|
157
|
+
for (const side of SIDES) {
|
|
158
|
+
const style = sides[side];
|
|
159
|
+
xml +=
|
|
160
|
+
style === undefined
|
|
161
|
+
? `<${side}/>`
|
|
162
|
+
: `<${side} style="${style}"><color auto="1"/></${side}>`;
|
|
163
|
+
}
|
|
164
|
+
borders.push(`${xml}<diagonal/></border>`);
|
|
165
|
+
const id = borders.length;
|
|
166
|
+
borderIds.set(key, id);
|
|
167
|
+
return id;
|
|
168
|
+
};
|
|
169
|
+
const alignment = (align) => {
|
|
170
|
+
if (align === undefined)
|
|
171
|
+
return "";
|
|
172
|
+
if (!HORIZONTAL.has(align)) {
|
|
173
|
+
throw invalid("align", `Alignments are left, center or right, not ${describeValue(align)}`);
|
|
174
|
+
}
|
|
175
|
+
return align;
|
|
176
|
+
};
|
|
177
|
+
const verticalAlignment = (align) => {
|
|
178
|
+
if (align === undefined)
|
|
179
|
+
return "";
|
|
180
|
+
if (!VERTICAL.has(align)) {
|
|
181
|
+
throw invalid("verticalAlign", `Vertical alignments are top, middle or bottom, not ${describeValue(align)}`);
|
|
182
|
+
}
|
|
183
|
+
return align === "middle" ? "center" : align;
|
|
184
|
+
};
|
|
185
|
+
const indentation = (indent) => {
|
|
186
|
+
if (indent === undefined)
|
|
187
|
+
return 0;
|
|
188
|
+
if (!Number.isInteger(indent) || indent < 0 || indent > MAX_INDENT) {
|
|
189
|
+
throw invalid("indent", `Indents are whole numbers from 0 to ${MAX_INDENT}, not ${describeValue(indent)}`);
|
|
190
|
+
}
|
|
191
|
+
return indent;
|
|
192
|
+
};
|
|
193
|
+
/** Excel indents only left- or right-aligned text: an indent alone aligns left, with center it is an error. */
|
|
194
|
+
const indentedAlignment = (align, indent) => {
|
|
195
|
+
if (indent === 0)
|
|
196
|
+
return align;
|
|
197
|
+
if (align === "center")
|
|
198
|
+
throw invalid("indent", "An indent cannot go with center alignment");
|
|
199
|
+
return align.length === 0 ? "left" : align;
|
|
200
|
+
};
|
|
201
|
+
const register = (r) => {
|
|
202
|
+
const plain = r.fontId === 0 &&
|
|
203
|
+
r.fillId === 0 &&
|
|
204
|
+
r.borderId === 0 &&
|
|
205
|
+
r.align.length === 0 &&
|
|
206
|
+
r.verticalAlign.length === 0 &&
|
|
207
|
+
!r.wrap &&
|
|
208
|
+
r.indent === 0;
|
|
209
|
+
if (plain && r.numberFormat === GENERAL)
|
|
210
|
+
return 0;
|
|
211
|
+
const key = plain
|
|
212
|
+
? `${r.numberFormat}`
|
|
213
|
+
: `${r.numberFormat}|${r.fontId}|${r.fillId}|${r.borderId}|${r.align}|${r.verticalAlign}|${r.wrap ? 1 : 0}|${r.indent}`;
|
|
42
214
|
const known = byKey.get(key);
|
|
43
215
|
if (known !== undefined)
|
|
44
216
|
return known;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
217
|
+
const aligned = r.align.length > 0 || r.verticalAlign.length > 0 || r.wrap || r.indent > 0;
|
|
218
|
+
const applies = (r.numberFormat === GENERAL ? "" : ' applyNumberFormat="1"') +
|
|
219
|
+
(r.fontId === 0 ? "" : ' applyFont="1"') +
|
|
220
|
+
(r.fillId === 0 ? "" : ' applyFill="1"') +
|
|
221
|
+
(r.borderId === 0 ? "" : ' applyBorder="1"') +
|
|
222
|
+
(aligned ? ' applyAlignment="1"' : "");
|
|
223
|
+
let xml = `<xf numFmtId="${r.numberFormat}" fontId="${r.fontId}" fillId="${r.fillId}" borderId="${r.borderId}" xfId="0"${applies}`;
|
|
224
|
+
if (aligned) {
|
|
225
|
+
xml +=
|
|
226
|
+
"><alignment" +
|
|
227
|
+
(r.align.length === 0 ? "" : ` horizontal="${r.align}"`) +
|
|
228
|
+
(r.verticalAlign.length === 0 ? "" : ` vertical="${r.verticalAlign}"`) +
|
|
229
|
+
(r.wrap ? ' wrapText="1"' : "") +
|
|
230
|
+
(r.indent === 0 ? "" : ` indent="${r.indent}"`) +
|
|
231
|
+
"/></xf>";
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
xml += "/>";
|
|
235
|
+
}
|
|
236
|
+
cellFormats.push(xml);
|
|
50
237
|
const index = cellFormats.length - 1;
|
|
51
238
|
byKey.set(key, index);
|
|
52
239
|
return index;
|
|
53
240
|
};
|
|
241
|
+
const dateOnly = (numberFormat) => ({
|
|
242
|
+
numberFormat,
|
|
243
|
+
fontId: 0,
|
|
244
|
+
fillId: 0,
|
|
245
|
+
borderId: 0,
|
|
246
|
+
align: "",
|
|
247
|
+
verticalAlign: "",
|
|
248
|
+
wrap: false,
|
|
249
|
+
indent: 0,
|
|
250
|
+
});
|
|
54
251
|
const merge = (cell, column, dateDefault) => {
|
|
55
|
-
const bold = cell?.bold ?? column?.bold ?? false;
|
|
56
252
|
const format = cell?.numberFormat ?? column?.numberFormat;
|
|
57
|
-
|
|
253
|
+
const indent = indentation(cell?.indent ?? column?.indent);
|
|
254
|
+
return register({
|
|
255
|
+
numberFormat: format === undefined ? dateDefault : formatId(format),
|
|
256
|
+
fontId: fontId(flag("bold", cell?.bold ?? column?.bold), flag("italic", cell?.italic ?? column?.italic), cell?.fontSize ?? column?.fontSize, cell?.fontColor ?? column?.fontColor),
|
|
257
|
+
fillId: fillId(cell?.fill ?? column?.fill),
|
|
258
|
+
borderId: borderId(cell?.border ?? column?.border),
|
|
259
|
+
align: indentedAlignment(alignment(cell?.align ?? column?.align), indent),
|
|
260
|
+
verticalAlign: verticalAlignment(cell?.verticalAlign ?? column?.verticalAlign),
|
|
261
|
+
wrap: flag("wrap", cell?.wrap ?? column?.wrap),
|
|
262
|
+
indent,
|
|
263
|
+
});
|
|
58
264
|
};
|
|
59
265
|
return {
|
|
60
266
|
indexFor(cell, column, dateDefault) {
|
|
61
267
|
if (cell === undefined && column === undefined) {
|
|
62
268
|
if (dateDefault === GENERAL)
|
|
63
269
|
return 0;
|
|
64
|
-
return (byDateDefault[dateDefault] ??=
|
|
270
|
+
return (byDateDefault[dateDefault] ??= register(dateOnly(dateDefault)));
|
|
65
271
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
272
|
+
// Column styles were validated when the columns were collected; a cell style is met here first.
|
|
273
|
+
if (cell !== undefined)
|
|
274
|
+
styleObject(cell);
|
|
275
|
+
if (cell === undefined || column === undefined) {
|
|
276
|
+
const single = (cell ?? column);
|
|
277
|
+
if (dateDefault === GENERAL) {
|
|
69
278
|
const hit = bySingleObject.get(single);
|
|
70
279
|
if (hit !== undefined)
|
|
71
280
|
return hit;
|
|
@@ -73,12 +282,43 @@ export function createStyleTable() {
|
|
|
73
282
|
bySingleObject.set(single, index);
|
|
74
283
|
return index;
|
|
75
284
|
}
|
|
285
|
+
let dated = bySingleDated.get(single);
|
|
286
|
+
if (dated === undefined)
|
|
287
|
+
bySingleDated.set(single, (dated = []));
|
|
288
|
+
return (dated[dateDefault] ??= merge(single, undefined, dateDefault));
|
|
76
289
|
}
|
|
77
|
-
|
|
290
|
+
let columns = byPair.get(cell);
|
|
291
|
+
if (columns === undefined)
|
|
292
|
+
byPair.set(cell, (columns = new WeakMap()));
|
|
293
|
+
let dated = columns.get(column);
|
|
294
|
+
if (dated === undefined)
|
|
295
|
+
columns.set(column, (dated = []));
|
|
296
|
+
return (dated[dateDefault] ??= merge(cell, column, dateDefault));
|
|
78
297
|
},
|
|
79
298
|
validate(style) {
|
|
299
|
+
styleObject(style);
|
|
80
300
|
if (style.numberFormat !== undefined)
|
|
81
301
|
formatId(style.numberFormat);
|
|
302
|
+
flag("bold", style.bold);
|
|
303
|
+
flag("italic", style.italic);
|
|
304
|
+
fontSize(style.fontSize);
|
|
305
|
+
if (style.fontColor !== undefined)
|
|
306
|
+
argb("fontColor", style.fontColor);
|
|
307
|
+
if (style.fill !== undefined)
|
|
308
|
+
argb("fill", style.fill);
|
|
309
|
+
if (style.border !== undefined && style.border !== null) {
|
|
310
|
+
if (typeof style.border === "string")
|
|
311
|
+
borderSide("border", style.border);
|
|
312
|
+
else if (typeof style.border === "object") {
|
|
313
|
+
for (const side of SIDES)
|
|
314
|
+
borderSide(`border.${side}`, style.border[side]);
|
|
315
|
+
}
|
|
316
|
+
else
|
|
317
|
+
throw invalid("border", "A border is a line style or an object with a style per side");
|
|
318
|
+
}
|
|
319
|
+
flag("wrap", style.wrap);
|
|
320
|
+
verticalAlignment(style.verticalAlign);
|
|
321
|
+
indentedAlignment(alignment(style.align), indentation(style.indent));
|
|
82
322
|
},
|
|
83
323
|
render() {
|
|
84
324
|
let numberFormats = "";
|
|
@@ -88,14 +328,11 @@ export function createStyleTable() {
|
|
|
88
328
|
numberFormats += `<numFmt numFmtId="${id}" formatCode="${escapeXml(code)}"/>`;
|
|
89
329
|
numberFormats += "</numFmts>";
|
|
90
330
|
}
|
|
91
|
-
const fonts = boldFont === 0
|
|
92
|
-
? '<fonts count="1"><font><sz val="11"/><name val="Calibri"/><family val="2"/></font></fonts>'
|
|
93
|
-
: '<fonts count="2"><font><sz val="11"/><name val="Calibri"/><family val="2"/></font><font><b/><sz val="11"/><name val="Calibri"/><family val="2"/></font></fonts>';
|
|
94
331
|
return (`${XML_DECLARATION}<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">` +
|
|
95
332
|
numberFormats +
|
|
96
|
-
fonts +
|
|
97
|
-
|
|
98
|
-
|
|
333
|
+
`<fonts count="${fonts.length}">${fonts.join("")}</fonts>` +
|
|
334
|
+
`<fills count="${fills.length + 2}">${DEFAULT_FILLS}${fills.join("")}</fills>` +
|
|
335
|
+
`<borders count="${borders.length + 1}">${DEFAULT_BORDER}${borders.join("")}</borders>` +
|
|
99
336
|
'<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>' +
|
|
100
337
|
`<cellXfs count="${cellFormats.length}">${cellFormats.join("")}</cellXfs>` +
|
|
101
338
|
'<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>' +
|
package/dist/styles/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AA4B7D,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,WAAW,GAAa,CAAC,gEAAgE,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,OAAO,EAAqB,CAAC;IACxD,mGAAmG;IACnG,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,MAAM,QAAQ,GAAG,CAAC,MAAuB,EAAU,EAAE;QACnD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,mBAAmB,EAAE,CAAC;gBAC5E,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,EAAE,EACF,iDAAiD,mBAAmB,SAAS,MAAM,EAAE,CACtF,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC7D,MAAM,IAAI,aAAa,CACrB,uBAAuB,EACvB,EAAE,EACF,uCAAuC,iBAAiB,aAAa,CACtE,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,EAAE,GAAG,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC;QACpD,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,YAAoB,EAAU,EAAE;QAC9D,IAAI,CAAC,IAAI,IAAI,YAAY,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,IAAI,IAAI,QAAQ,KAAK,CAAC;YAAE,QAAQ,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GACX,CAAC,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9F,WAAW,CAAC,IAAI,CACd,iBAAiB,YAAY,aAAa,MAAM,qCAAqC,OAAO,IAAI,CACjG,CAAC;QACF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CACZ,IAA2B,EAC3B,MAA6B,EAC7B,WAAmB,EACX,EAAE;QACV,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,EAAE,YAAY,IAAI,MAAM,EAAE,YAAY,CAAC;QAC1D,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW;YAChC,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/C,IAAI,WAAW,KAAK,OAAO;oBAAE,OAAO,CAAC,CAAC;gBACtC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACrF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACvC,IAAI,GAAG,KAAK,SAAS;wBAAE,OAAO,GAAG,CAAC;oBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;oBAChD,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAClC,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QACD,QAAQ,CAAC,KAAK;YACZ,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;gBAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACrE,CAAC;QACD,MAAM;YACJ,IAAI,aAAa,GAAG,EAAE,CAAC;YACvB,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC3B,aAAa,GAAG,mBAAmB,aAAa,CAAC,IAAI,IAAI,CAAC;gBAC1D,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,aAAa;oBACpC,aAAa,IAAI,qBAAqB,EAAE,iBAAiB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChF,aAAa,IAAI,YAAY,CAAC;YAChC,CAAC;YACD,MAAM,KAAK,GACT,QAAQ,KAAK,CAAC;gBACZ,CAAC,CAAC,4FAA4F;gBAC9F,CAAC,CAAC,iKAAiK,CAAC;YACxK,OAAO,CACL,GAAG,eAAe,gFAAgF;gBAClG,aAAa;gBACb,KAAK;gBACL,0HAA0H;gBAC1H,yFAAyF;gBACzF,8FAA8F;gBAC9F,mBAAmB,WAAW,CAAC,MAAM,KAAK,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY;gBAC1E,sFAAsF;gBACtF,eAAe,CAChB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worksheet/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,YAAY,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,UAAU,EACV,GAAG,EACH,KAAK,EACL,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worksheet/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,YAAY,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,UAAU,EACV,GAAG,EACH,KAAK,EACL,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAqB1F"}
|
package/dist/worksheet/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { XML_DECLARATION, createXmlSink } from "../xml/index.js";
|
|
2
|
-
import { collectColumns, renderFreeze } from "./lib/layout.js";
|
|
2
|
+
import { collectColumns, collectRowHeights, renderFreeze, renderMerges } from "./lib/layout.js";
|
|
3
3
|
import { renderSheetData } from "./lib/render-rows.js";
|
|
4
4
|
export { columnLetter } from "./lib/cell-ref.js";
|
|
5
5
|
export { sheetFromObjects, } from "./lib/from-objects.js";
|
|
@@ -8,18 +8,20 @@ export { serialFromCivil, serialFromEpochMillis } from "./lib/serial.js";
|
|
|
8
8
|
export function renderWorksheet(sheet, context) {
|
|
9
9
|
const columns = collectColumns(sheet, context.sheetIndex, (style) => context.styles.validate(style));
|
|
10
10
|
const views = renderFreeze(sheet, context.sheetIndex);
|
|
11
|
+
const merges = renderMerges(sheet, context.sheetIndex);
|
|
12
|
+
const rowHeights = collectRowHeights(sheet, context.sheetIndex);
|
|
11
13
|
const sink = createXmlSink();
|
|
12
|
-
const range = renderSheetData(sheet.rows, columns.styles, context, sink);
|
|
13
|
-
const
|
|
14
|
-
const dimension =
|
|
15
|
-
const filterRange = sheet.autoFilter === true && !
|
|
14
|
+
const { range, hasRows } = renderSheetData(sheet.rows, columns.styles, context, sink, rowHeights);
|
|
15
|
+
const noCells = range.length === 0;
|
|
16
|
+
const dimension = noCells ? "" : `<dimension ref="${range}"/>`;
|
|
17
|
+
const filterRange = sheet.autoFilter === true && !noCells ? range : undefined;
|
|
16
18
|
const autoFilter = filterRange === undefined ? "" : `<autoFilter ref="${filterRange}"/>`;
|
|
17
19
|
const prefix = `${XML_DECLARATION}<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">` +
|
|
18
20
|
dimension +
|
|
19
21
|
views +
|
|
20
22
|
columns.cols +
|
|
21
|
-
(
|
|
22
|
-
const suffix = (
|
|
23
|
+
(hasRows ? "<sheetData>" : "<sheetData/>");
|
|
24
|
+
const suffix = (hasRows ? "</sheetData>" : "") + autoFilter + merges + "</worksheet>";
|
|
23
25
|
return { data: sink.finish(prefix, suffix), filterRange };
|
|
24
26
|
}
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worksheet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worksheet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhG,OAAO,EAAE,eAAe,EAAyB,MAAM,sBAAsB,CAAC;AAoB9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AASzE,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,OAAyB;IACrE,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/B,CAAC;IACF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,KAAK,CAAC;IAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,UAAU,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,WAAW,KAAK,CAAC;IACzF,MAAM,MAAM,GACV,GAAG,eAAe,6JAA6J;QAC/K,SAAS;QACT,KAAK;QACL,OAAO,CAAC,IAAI;QACZ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;IACtF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -5,8 +5,15 @@ export interface CollectedColumns {
|
|
|
5
5
|
readonly styles: readonly (CellStyle | undefined)[];
|
|
6
6
|
readonly cols: string;
|
|
7
7
|
}
|
|
8
|
-
/** Validates every column up front, so a bad width or
|
|
8
|
+
/** Validates every column up front, so a bad width or style is reported at the column. */
|
|
9
9
|
export declare function collectColumns(sheet: Sheet, sheetIndex: number, validateStyle: (style: CellStyle) => void): CollectedColumns;
|
|
10
10
|
/** The `<sheetViews>` element with a frozen pane, or an empty string when nothing is frozen. */
|
|
11
11
|
export declare function renderFreeze(sheet: Sheet, sheetIndex: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* The `<mergeCells>` element, or an empty string. Every range is validated as A1 form inside the
|
|
14
|
+
* sheet, larger than one cell, and overlapping no other: Excel repairs a file whose merges overlap.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderMerges(sheet: Sheet, sheetIndex: number): string;
|
|
17
|
+
/** Row heights validated up front: whole row numbers from 1, heights from above 0 to 409 points. */
|
|
18
|
+
export declare function collectRowHeights(sheet: Sheet, sheetIndex: number): Readonly<Record<number, number>> | undefined;
|
|
12
19
|
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/layout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/layout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAQxC,0FAA0F;AAC1F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GACxC,gBAAgB,CAgClB;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyBrE;AAiBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoDrE;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,GACjB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAuB9C"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { XlsxMiniError } from "../../errors/index.js";
|
|
1
|
+
import { XlsxMiniError, atPath, describeValue } from "../../errors/index.js";
|
|
2
2
|
import { columnLetter } from "./cell-ref.js";
|
|
3
3
|
const MAX_COLUMN_WIDTH = 255;
|
|
4
|
+
const MAX_ROW_HEIGHT = 409;
|
|
4
5
|
const MAX_ROWS = 1_048_576;
|
|
5
6
|
const MAX_COLUMNS = 16_384;
|
|
6
|
-
|
|
7
|
+
const RANGE = /^([A-Z]{1,3})([1-9]\d{0,6}):([A-Z]{1,3})([1-9]\d{0,6})$/;
|
|
8
|
+
/** Validates every column up front, so a bad width or style is reported at the column. */
|
|
7
9
|
export function collectColumns(sheet, sheetIndex, validateStyle) {
|
|
8
10
|
const columns = sheet.columns;
|
|
9
11
|
if (columns === undefined)
|
|
@@ -19,7 +21,7 @@ export function collectColumns(sheet, sheetIndex, validateStyle) {
|
|
|
19
21
|
}
|
|
20
22
|
catch (error) {
|
|
21
23
|
if (error instanceof XlsxMiniError) {
|
|
22
|
-
throw
|
|
24
|
+
throw atPath(error, `sheets[${sheetIndex}].columns[${i}].style`);
|
|
23
25
|
}
|
|
24
26
|
throw error;
|
|
25
27
|
}
|
|
@@ -55,4 +57,74 @@ export function renderFreeze(sheet, sheetIndex) {
|
|
|
55
57
|
const splits = (columns === 0 ? "" : ` xSplit="${columns}"`) + (rows === 0 ? "" : ` ySplit="${rows}"`);
|
|
56
58
|
return `<sheetViews><sheetView workbookViewId="0"><pane${splits} topLeftCell="${topLeft}" activePane="${activePane}" state="frozen"/></sheetView></sheetViews>`;
|
|
57
59
|
}
|
|
60
|
+
/** Zero-based column index of column letters such as `A`, `Z` or `AA`. */
|
|
61
|
+
function columnIndex(letters) {
|
|
62
|
+
let index = 0;
|
|
63
|
+
for (let i = 0; i < letters.length; i++)
|
|
64
|
+
index = index * 26 + (letters.charCodeAt(i) - 64);
|
|
65
|
+
return index - 1;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The `<mergeCells>` element, or an empty string. Every range is validated as A1 form inside the
|
|
69
|
+
* sheet, larger than one cell, and overlapping no other: Excel repairs a file whose merges overlap.
|
|
70
|
+
*/
|
|
71
|
+
export function renderMerges(sheet, sheetIndex) {
|
|
72
|
+
const merges = sheet.merges;
|
|
73
|
+
if (merges === undefined || merges.length === 0)
|
|
74
|
+
return "";
|
|
75
|
+
const boxes = [];
|
|
76
|
+
for (let i = 0; i < merges.length; i++) {
|
|
77
|
+
const ref = merges[i];
|
|
78
|
+
const path = `sheets[${sheetIndex}].merges[${i}]`;
|
|
79
|
+
const match = typeof ref === "string" ? RANGE.exec(ref) : null;
|
|
80
|
+
if (match === null) {
|
|
81
|
+
throw new XlsxMiniError("INVALID_MERGE", path, `A merge is a range in A1 form such as "A1:D1", not ${describeValue(ref)}`);
|
|
82
|
+
}
|
|
83
|
+
const left = columnIndex(match[1]);
|
|
84
|
+
const top = Number(match[2]);
|
|
85
|
+
const right = columnIndex(match[3]);
|
|
86
|
+
const bottom = Number(match[4]);
|
|
87
|
+
if (right >= MAX_COLUMNS || bottom > MAX_ROWS) {
|
|
88
|
+
throw new XlsxMiniError("INVALID_MERGE", path, `Range ${ref} lies outside the sheet`);
|
|
89
|
+
}
|
|
90
|
+
if (right < left || bottom < top) {
|
|
91
|
+
throw new XlsxMiniError("INVALID_MERGE", path, `Range ${ref} must run from its top-left cell to its bottom-right cell`);
|
|
92
|
+
}
|
|
93
|
+
if (right === left && bottom === top) {
|
|
94
|
+
throw new XlsxMiniError("INVALID_MERGE", path, `Range ${ref} is a single cell`);
|
|
95
|
+
}
|
|
96
|
+
const box = { ref, top, left, bottom, right };
|
|
97
|
+
for (const other of boxes) {
|
|
98
|
+
if (box.left <= other.right &&
|
|
99
|
+
other.left <= box.right &&
|
|
100
|
+
box.top <= other.bottom &&
|
|
101
|
+
other.top <= box.bottom) {
|
|
102
|
+
throw new XlsxMiniError("INVALID_MERGE", path, `Range ${ref} overlaps ${other.ref}; Excel refuses overlapping merges`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
boxes.push(box);
|
|
106
|
+
}
|
|
107
|
+
let xml = `<mergeCells count="${boxes.length}">`;
|
|
108
|
+
for (const box of boxes)
|
|
109
|
+
xml += `<mergeCell ref="${box.ref}"/>`;
|
|
110
|
+
return `${xml}</mergeCells>`;
|
|
111
|
+
}
|
|
112
|
+
/** Row heights validated up front: whole row numbers from 1, heights from above 0 to 409 points. */
|
|
113
|
+
export function collectRowHeights(sheet, sheetIndex) {
|
|
114
|
+
const heights = sheet.rowHeights;
|
|
115
|
+
if (heights === undefined)
|
|
116
|
+
return undefined;
|
|
117
|
+
for (const key of Object.keys(heights)) {
|
|
118
|
+
const row = Number(key);
|
|
119
|
+
const path = `sheets[${sheetIndex}].rowHeights[${key}]`;
|
|
120
|
+
if (!Number.isInteger(row) || row < 1 || row > MAX_ROWS) {
|
|
121
|
+
throw new XlsxMiniError("INVALID_ROW_HEIGHT", path, `Row numbers run from 1 to ${MAX_ROWS}, not ${key}`);
|
|
122
|
+
}
|
|
123
|
+
const height = heights[row];
|
|
124
|
+
if (typeof height !== "number" || !(height > 0) || height > MAX_ROW_HEIGHT) {
|
|
125
|
+
throw new XlsxMiniError("INVALID_ROW_HEIGHT", path, `Row heights run from above 0 to ${MAX_ROW_HEIGHT} points, not ${height}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return heights;
|
|
129
|
+
}
|
|
58
130
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/worksheet/lib/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/worksheet/lib/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,7 @@ export interface Freeze {
|
|
|
87
87
|
* name: "Orders",
|
|
88
88
|
* columns: [undefined, { style: { numberFormat: '#,##0.00 "kr"' } }],
|
|
89
89
|
* rows: [["Order", "Total"], ["A-1001", 1234.5]],
|
|
90
|
+
* merges: ["A1:B1"],
|
|
90
91
|
* };
|
|
91
92
|
*/
|
|
92
93
|
export interface Sheet {
|
|
@@ -99,6 +100,10 @@ export interface Sheet {
|
|
|
99
100
|
readonly freeze?: Freeze;
|
|
100
101
|
/** Filter dropdowns on row 1 across the used range. */
|
|
101
102
|
readonly autoFilter?: boolean;
|
|
103
|
+
/** Ranges to merge into one cell each, in A1 form such as `"A1:D1"`; the top-left cell keeps its value. */
|
|
104
|
+
readonly merges?: readonly string[];
|
|
105
|
+
/** Row heights in points by row number, counted from 1: `{ 1: 28 }` makes the first row 28 points. */
|
|
106
|
+
readonly rowHeights?: Readonly<Record<number, number>>;
|
|
102
107
|
}
|
|
103
108
|
/**
|
|
104
109
|
* Converts a value the writer does not handle natively, or overrides how it handles a `Date` or a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/model.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;GAQG;AAEH,MAAM,WAAW,QAAQ;CAAG;AAE5B,mEAAmE;AACnE,MAAM,MAAM,UAAU,GAAG,QAAQ,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AAE7E,yGAAyG;AACzG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wFAAwF;AACxF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,oGAAoG;AACpG,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAClD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,MAAM,YAAY,GACpB,qBAAqB,GACrB,yBAAyB,GACzB,yBAAyB,GACzB,mBAAmB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,YAAY,GACZ,IAAI,GACJ,SAAS,GACT,UAAU,CAAC;AAEf,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,sEAAsE;AACtE,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC;AAE1C,4CAA4C;AAC5C,MAAM,MAAM,GAAG,GAAG,SAAS,IAAI,EAAE,CAAC;AAElC,uGAAuG;AACvG,MAAM,WAAW,MAAM;IACrB,sGAAsG;IACtG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,8FAA8F;AAC9F,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iGAAiG;IACjG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACnD,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,2GAA2G;IAC3G,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,sGAAsG;IACtG,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,YAAY,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC"}
|
|
@@ -14,10 +14,16 @@ export interface WorksheetContext {
|
|
|
14
14
|
/** Zero-based position of the sheet in the workbook, for error paths. */
|
|
15
15
|
readonly sheetIndex: number;
|
|
16
16
|
}
|
|
17
|
+
/** What was written to the sink: the used range of cells, and whether any row element was emitted. */
|
|
18
|
+
export interface SheetData {
|
|
19
|
+
/** The used range such as `A1:C4`, or an empty string when no cell was written. */
|
|
20
|
+
readonly range: string;
|
|
21
|
+
/** True when at least one `<row>` was written, including rows that only carry a height. */
|
|
22
|
+
readonly hasRows: boolean;
|
|
23
|
+
}
|
|
17
24
|
/**
|
|
18
|
-
* Renders every row with at least one cell into the sink; positions survive
|
|
19
|
-
* cells carry `r`.
|
|
20
|
-
* written.
|
|
25
|
+
* Renders every row with at least one cell, or a height, into the sink; positions survive
|
|
26
|
+
* because rows and cells carry `r`.
|
|
21
27
|
*/
|
|
22
|
-
export declare function renderSheetData(rows: Iterable<Row>, columnStyles: readonly (CellStyle | undefined)[], context: WorksheetContext, sink: XmlSink):
|
|
28
|
+
export declare function renderSheetData(rows: Iterable<Row>, columnStyles: readonly (CellStyle | undefined)[], context: WorksheetContext, sink: XmlSink, rowHeights?: Readonly<Record<number, number>>): SheetData;
|
|
23
29
|
//# sourceMappingURL=render-rows.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-rows.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/render-rows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAoB,MAAM,EAAE,GAAG,EAAgB,MAAM,YAAY,CAAC;AAW9E,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,yGAAyG;IACzG,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CACN,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC;QACV,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"render-rows.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/render-rows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAoB,MAAM,EAAE,GAAG,EAAgB,MAAM,YAAY,CAAC;AAW9E,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,yGAAyG;IACzG,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CACN,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC;QACV,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,sGAAsG;AACtG,MAAM,WAAW,SAAS;IACxB,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EACnB,YAAY,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,EAChD,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC5C,SAAS,CAmDX"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { XlsxMiniError } from "../../errors/index.js";
|
|
1
|
+
import { XlsxMiniError, atPath, describeValue } from "../../errors/index.js";
|
|
2
2
|
import { columnLetter } from "./cell-ref.js";
|
|
3
3
|
import { serialFromCivil, serialFromEpochMillis } from "./serial.js";
|
|
4
4
|
const MAX_ROWS = 1_048_576;
|
|
@@ -9,14 +9,14 @@ const GENERAL = 0;
|
|
|
9
9
|
const DATE = 14;
|
|
10
10
|
const DATE_TIME = 22;
|
|
11
11
|
/**
|
|
12
|
-
* Renders every row with at least one cell into the sink; positions survive
|
|
13
|
-
* cells carry `r`.
|
|
14
|
-
* written.
|
|
12
|
+
* Renders every row with at least one cell, or a height, into the sink; positions survive
|
|
13
|
+
* because rows and cells carry `r`.
|
|
15
14
|
*/
|
|
16
|
-
export function renderSheetData(rows, columnStyles, context, sink) {
|
|
15
|
+
export function renderSheetData(rows, columnStyles, context, sink, rowHeights) {
|
|
17
16
|
let rowIndex = -1;
|
|
18
17
|
let lastRowWithCells = 0;
|
|
19
18
|
let maxColumn = -1;
|
|
19
|
+
let hasRows = false;
|
|
20
20
|
for (const row of rows) {
|
|
21
21
|
rowIndex++;
|
|
22
22
|
if (rowIndex >= MAX_ROWS) {
|
|
@@ -37,15 +37,45 @@ export function renderSheetData(rows, columnStyles, context, sink) {
|
|
|
37
37
|
if (column > maxColumn)
|
|
38
38
|
maxColumn = column;
|
|
39
39
|
}
|
|
40
|
-
if (cells.length === 0)
|
|
41
|
-
continue;
|
|
42
40
|
const rowNumber = rowIndex + 1;
|
|
43
|
-
|
|
41
|
+
const height = rowHeights?.[rowNumber];
|
|
42
|
+
if (cells.length === 0) {
|
|
43
|
+
if (height === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
sink.write(`<row r="${rowNumber}"${heightAttributes(height)}/>`);
|
|
46
|
+
hasRows = true;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
sink.write(`<row r="${rowNumber}"${height === undefined ? "" : heightAttributes(height)}>${cells}</row>`);
|
|
50
|
+
hasRows = true;
|
|
44
51
|
lastRowWithCells = rowNumber;
|
|
45
52
|
}
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
if (rowHeights !== undefined && renderTrailingHeights(rowHeights, rowIndex + 1, sink)) {
|
|
54
|
+
hasRows = true;
|
|
55
|
+
}
|
|
56
|
+
const range = lastRowWithCells === 0 ? "" : `A1:${columnLetter(maxColumn)}${lastRowWithCells}`;
|
|
57
|
+
return { range, hasRows };
|
|
58
|
+
}
|
|
59
|
+
function heightAttributes(height) {
|
|
60
|
+
return ` ht="${height}" customHeight="1"`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Heights of rows past the last row given are written as empty rows, in order, so they still
|
|
64
|
+
* apply. Returns true when any row was written.
|
|
65
|
+
*/
|
|
66
|
+
function renderTrailingHeights(rowHeights, rowsGiven, sink) {
|
|
67
|
+
const trailing = [];
|
|
68
|
+
for (const key of Object.keys(rowHeights)) {
|
|
69
|
+
const row = Number(key);
|
|
70
|
+
if (row > rowsGiven)
|
|
71
|
+
trailing.push(row);
|
|
72
|
+
}
|
|
73
|
+
if (trailing.length === 0)
|
|
74
|
+
return false;
|
|
75
|
+
trailing.sort((a, b) => a - b);
|
|
76
|
+
for (const row of trailing)
|
|
77
|
+
sink.write(`<row r="${row}"${heightAttributes(rowHeights[row])}/>`);
|
|
78
|
+
return true;
|
|
49
79
|
}
|
|
50
80
|
function renderCell(cell, column, columnStyle, rowIndex, context) {
|
|
51
81
|
let value = cell;
|
|
@@ -58,6 +88,14 @@ function renderCell(cell, column, columnStyle, rowIndex, context) {
|
|
|
58
88
|
}
|
|
59
89
|
}
|
|
60
90
|
const reference = columnLetter(column) + (rowIndex + 1);
|
|
91
|
+
if (value === null || value === undefined) {
|
|
92
|
+
// A cell object with a style and no value is a styled empty cell: a border or fill can run
|
|
93
|
+
// across a blank. A bare null stays nothing, even in a styled column.
|
|
94
|
+
if (cellStyle === undefined)
|
|
95
|
+
return "";
|
|
96
|
+
const style = styleAttribute(cellStyle, columnStyle, GENERAL, column, rowIndex, context);
|
|
97
|
+
return style.length === 0 ? "" : `<c r="${reference}"${style}/>`;
|
|
98
|
+
}
|
|
61
99
|
const style = cellStyle === undefined && columnStyle === undefined
|
|
62
100
|
? ""
|
|
63
101
|
: styleAttribute(cellStyle, columnStyle, GENERAL, column, rowIndex, context);
|
|
@@ -136,7 +174,7 @@ function styleAttribute(cellStyle, columnStyle, dateDefault, column, rowIndex, c
|
|
|
136
174
|
}
|
|
137
175
|
catch (error) {
|
|
138
176
|
if (error instanceof XlsxMiniError) {
|
|
139
|
-
throw
|
|
177
|
+
throw atPath(error, `${cellPath(context, rowIndex, column)}.style`);
|
|
140
178
|
}
|
|
141
179
|
throw error;
|
|
142
180
|
}
|
|
@@ -150,13 +188,7 @@ function isWrapper(value) {
|
|
|
150
188
|
return (prototype === Object.prototype || prototype === null) && "value" in value;
|
|
151
189
|
}
|
|
152
190
|
function describe(value) {
|
|
153
|
-
|
|
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";
|
|
191
|
+
return typeof value !== "object" || value === null ? typeof value : describeValue(value);
|
|
160
192
|
}
|
|
161
193
|
function cellPath(context, rowIndex, column) {
|
|
162
194
|
return `sheets[${context.sheetIndex}].rows[${rowIndex}][${column}]`;
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"render-rows.js","sourceRoot":"","sources":["../../../src/worksheet/lib/render-rows.ts"],"names":[],"mappings":"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"}
|