xlsx-mini 0.0.1 → 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 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,24 +435,28 @@ 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?: boolean; numberFormat?: string \| number }` |
374
- | `Column`, `Freeze` | `{ width?: number; style?: CellStyle }`; `{ rows?: number; columns?: number }` |
375
- | `Coerce`, `Register`, `Registered` | `(value: Date \| TemporalLike \| Registered, path: string) => CellValue`; the augmentation point and what it holds |
376
- | `sheetFromObjects(data, options)` | `Sheet`; options `{ name; columns?: ObjectColumn<T>[]; header?: CellStyle \| false; freeze?: boolean; autoFilter?: boolean }` |
377
- | `XlsxMiniError`, `ErrorCode` | `{ code: ErrorCode; path: string; message }` |
378
- | `XLSX_MIME_TYPE` | `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` |
379
- | `downloadXlsx(bytes, filename)` | from `xlsx-mini/browser`; adds `.xlsx` when the name lacks it |
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
 
458
+ Below 1.0.0 a minor version may change this API; 1.0.0 follows once it has survived real use unchanged, with no code change of its own.
459
+
383
460
  ## Security
384
461
 
385
462
  No runtime dependencies and no install scripts. The writer touches no file, network or global state; it reads what you give it and returns bytes. Text is escaped for XML and characters XML cannot carry are dropped, so cell content cannot break the file. Releases are published through npm trusted publishing with provenance, so every version on npm traces to a commit and a workflow run in this repository. To report a vulnerability, see `SECURITY.md`.
@@ -403,12 +480,13 @@ Each golden fixture is opened by hand in four applications before a release; `do
403
480
  | Fixture | Excel 16.114 (macOS) | Numbers 14.4 | Google Sheets | LibreOffice 26.8 |
404
481
  | -------------------------------- | :------------------: | :----------: | :-----------: | :--------------: |
405
482
  | Strings and numbers | clean | clean | clean | clean |
406
- | Every kind of cell value | clean | clean | pending | clean |
407
- | Deflated entries | clean | clean | pending | clean |
408
- | Several sheets, escaped names | clean | clean | pending | clean |
409
- | Styles and number formats | clean | clean | pending | clean |
410
- | Widths, frozen panes, autofilter | clean | clean | pending | clean |
411
- | Built from objects | clean | clean | pending | clean |
483
+ | Every kind of cell value | clean | clean | clean | clean |
484
+ | Deflated entries | clean | clean | clean | clean |
485
+ | Several sheets, escaped names | clean | clean | clean | clean |
486
+ | Styles and number formats | clean | clean | clean | clean |
487
+ | Widths, frozen panes, autofilter | clean | clean | clean | clean |
488
+ | Built from objects | clean | clean | clean | clean |
489
+ | Fonts, fills, borders, merges | clean | clean | clean | clean |
412
490
 
413
491
  LibreOffice also reads every fixture back cell for cell in CI, on every change.
414
492
 
@@ -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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;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,GAAG,OAAO,OAAO,IAAI,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
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
@@ -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,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,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"}
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;AAE/D,OAAO,EAAiB,cAAc,EAAE,MAAM,qBAAqB,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"}
@@ -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 `INVALID_NUMBER_FORMAT` for a format Excel would refuse, without registering anything. */
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 formats are each
27
- * registered once per distinct value. A style object seen again on its own is resolved through a
28
- * WeakMap, so a column or header style reused across thousands of cells costs one lookup per cell.
29
- * Excel expects fill 0 to be `none`, fill 1 to be `gray125`, and a `Normal` cell style.
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;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,uGAAuG;IACvG,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAED,2GAA2G;AAC3G,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAClG,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,+EAA+E;IAC/E,MAAM,IAAI,MAAM,CAAC;CAClB;AAOD;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CA2G7C"}
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"}
@@ -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 formats are each
9
- * registered once per distinct value. A style object seen again on its own is resolved through a
10
- * WeakMap, so a column or header style reused across thousands of cells costs one lookup per cell.
11
- * Excel expects fill 0 to be `none`, fill 1 to be `gray125`, and a `Normal` cell style.
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
- let boldFont = 0;
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 resolve = (bold, numberFormat) => {
39
- if (!bold && numberFormat === GENERAL)
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
- const key = bold ? `b${numberFormat}` : `${numberFormat}`;
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
- if (bold && boldFont === 0)
46
- boldFont = 1;
47
- const fontId = bold ? boldFont : 0;
48
- const applies = (numberFormat === GENERAL ? "" : ' applyNumberFormat="1"') + (bold ? ' applyFont="1"' : "");
49
- cellFormats.push(`<xf numFmtId="${numberFormat}" fontId="${fontId}" fillId="0" borderId="0" xfId="0"${applies}/>`);
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
- return resolve(bold, format === undefined ? dateDefault : formatId(format));
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] ??= resolve(false, dateDefault));
270
+ return (byDateDefault[dateDefault] ??= register(dateOnly(dateDefault)));
65
271
  }
66
- if (dateDefault === GENERAL) {
67
- const single = column === undefined ? cell : cell === undefined ? column : undefined;
68
- if (single !== undefined) {
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
- return merge(cell, column, dateDefault);
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
- '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>' +
98
- '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +
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>' +
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/styles/index.ts"],"names":[],"mappings":"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"}
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,CAmB1F"}
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"}
@@ -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 empty = range.length === 0;
14
- const dimension = empty ? "" : `<dimension ref="${range}"/>`;
15
- const filterRange = sheet.autoFilter === true && !empty ? range : undefined;
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
- (empty ? "<sheetData/>" : "<sheetData>");
22
- const suffix = (empty ? "" : "</sheetData>") + autoFilter + "</worksheet>";
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;AAE/D,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,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,KAAK,CAAC;IAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,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,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC;IAC3E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;AAC5D,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 format is reported at the column. */
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;AAMxC,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,2FAA2F;AAC3F,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GACxC,gBAAgB,CAoClB;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyBrE"}
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
- /** Validates every column up front, so a bad width or format is reported at the column. */
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 new XlsxMiniError(error.code, `sheets[${sheetIndex}].columns[${i}].style.numberFormat`, error.message.replace(/ at $/, ""));
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":"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"}
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":"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"}
@@ -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 because rows and
19
- * cells carry `r`. Returns the used range such as `A1:C4`, or an empty string when no cell was
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): string;
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;;;;GAIG;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,GACZ,MAAM,CAsCR"}
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 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.
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
- sink.write(`<row r="${rowNumber}">${cells}</row>`);
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 (lastRowWithCells === 0)
47
- return "";
48
- return `A1:${columnLetter(maxColumn)}${lastRowWithCells}`;
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 new XlsxMiniError(error.code, cellPath(context, rowIndex, column), error.message.replace(/ at $/, ""));
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
- 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";
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":"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"}
1
+ {"version":3,"file":"render-rows.js","sourceRoot":"","sources":["../../../src/worksheet/lib/render-rows.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xlsx-mini",
3
- "version": "0.0.1",
3
+ "version": "0.2.0",
4
4
  "description": "Zero-dependency .xlsx writer for TypeScript that runs everywhere.",
5
5
  "keywords": [
6
6
  "excel",