
Executive Board Pack
Two stacked tables per sheet, grouped headers, portfolio totals and averages.
Open in playgroundType-safe schemas that render polished XLSX reports for TypeScript apps. Buffered or streamed, with zero runtime dependencies.
createWorkbook()bufferedcreateWorkbookStream()streamingschema: invoiceSchemaunchanged11 columns with styles, dates, formats and summaries, inline strings, 5,000-row batches. Node 24, Apple M5. Time and peak memory; 200k is the median of three runs.
Badges, sparklines, images, validation, grouped headers, totals. Every one is a schema field, so every report your app ships looks the same way.
Accessors, formula references and summaries are checked against your row type. A typo fails in your editor, not in someone's spreadsheet.
'"untiPrice"' is not assignable to parameter of type '"customer" | "qty" | "unitPrice"'. customerstringqtynumberunitPricenumberPick columns per audience, generate columns from runtime data, switch to a native Excel table, change the theme. The schema stays one file.
const deals = createExcelSchema<Deal, Ctx>({ mode: ,}) .column("account", { accessor: "account" }) .column("owner", { accessor: "owner.name" }) .column("stage", { type: "badge", accessor: "stage" }) .dynamic("regions", (b, { ctx }) => ctx.regions.forEach((r) => b.column(r, { accessor: (d) => d.byRegion[r] }))) .column("total", { accessor: "total", summary: (s) => [s.formula("sum")], }) .build() workbook.sheet("Deals").table("deals", { title: "Q3 deals by region", rows, schema: deals, context: { regions: [, , , ] }, // audience // no select: every column ships theme: ,})
Every example in the playground is generated by typed-xlsx, with the schema that produced it right next to the file.

Two stacked tables per sheet, grouped headers, portfolio totals and averages.
Open in playground
Thousands of shipment rows committed in batches, with totals and a fill-rate average at the end.
Open in playground
Multi-line quotes expanded into sub-rows, with margin math and approval flags.
Open in playground
Unlocked inputs with validation, while formulas and logic columns stay protected.
Open in playgroundNo SheetJS, no ExcelJS. typed-xlsx writes the OOXML parts and the ZIP container itself, so there is nothing else to audit or patch.