zero-dep-xlsx
v0.1.0
Published
Zero-dependency XLSX (OOXML SpreadsheetML) writer for Node — multiple sheets, column widths, number formats, and per-row font styling, built only with Node's built-in zlib.
Maintainers
Readme
zero-dep-xlsx
A tiny, zero-dependency XLSX (OOXML SpreadsheetML) writer for Node.
A .xlsx file is just a ZIP of XML parts. This library produces the ZIP and
DEFLATE streams with Node's built-in zlib — no exceljs, no jszip, no
native modules, nothing in node_modules.
Features
- Multiple worksheets in one workbook
- Per-column header text, width, and number format
- String, number, boolean,
Date, and empty cells - Per-row font styling (e.g. bold header)
- Dates written as Excel serial numbers using UTC components, so output is timezone-independent (no off-by-one local-timezone drift)
Install
npm install zero-dep-xlsxRequires Node.js >= 18. Ships both ESM and CommonJS builds plus TypeScript
type declarations — import and require both work, no extra @types
package needed.
Usage
ESM / TypeScript
import { writeFileSync } from 'node:fs'
import { buildXlsx } from 'zero-dep-xlsx'
const buf = buildXlsx({
creator: 'My App',
sheets: [
{
name: 'People',
columns: [
{ header: 'Name', key: 'name', width: 20 },
{ header: 'Score', key: 'score', width: 10, style: { numFmt: '0.00' } },
{ header: 'Joined', key: 'joined', width: 14, style: { numFmt: 'yyyy-mm-dd' } },
],
rows: [
{ name: 'Ada', score: 99.5, joined: new Date('2024-01-15') },
{ name: 'Linus', score: 88, joined: new Date('2023-08-02') },
],
// Make the header row (row 1) bold.
rowStyles: [{ row: 1, font: { bold: true } }],
},
],
})
writeFileSync('people.xlsx', buf)CommonJS
const { writeFileSync } = require('node:fs')
const { buildXlsx } = require('zero-dep-xlsx')
const buf = buildXlsx({
sheets: [
{
name: 'People',
columns: [{ header: 'Name', key: 'name', width: 20 }],
rows: [{ name: 'Ada' }],
},
],
})
writeFileSync('people.xlsx', buf)buildXlsx returns a Buffer containing the full .xlsx file, ready to write
to disk or stream as an HTTP response.
API
buildXlsx(options) => Buffer
| Option | Type | Default | Description |
| --------- | -------- | ---------------- | --------------------------------- |
| creator | string | "zero-dep-xlsx"| Document author metadata |
| created | Date | new Date() | Creation timestamp metadata |
| sheets | Sheet[]| — | One or more worksheets (required) |
Sheet
{
name: string
columns: Array<{
header: string
key: string
width?: number // Excel character units, default 10
style?: { numFmt?: string }
}>
rows: Array<Record<string, string | number | boolean | Date | null>>
rowStyles?: Array<{
row: number // 1-based; row 1 is the header
font?: { bold?: boolean; size?: number }
}>
}Cell values are mapped by column key. Number-format codes (numFmt) follow
the standard Excel format syntax ("0.00", "#,##0", "yyyy-mm-dd", etc.).
Throws if sheets is missing or empty.
License
MIT
