Check the current contract and validator results before you build on this.
SheetJS, ExcelJS, and Runstamp solve different XLSX jobs in Node.js. Use SheetJS to parse uploaded spreadsheets across many formats. Use ExcelJS to write styled workbooks with formulas and streaming. Use Runstamp when the deliverable needs native editable Excel charts from JSON. The chart gap is the key split: ExcelJS is excellent for cells, but it still does not create charts.
Overview comparison
| Decision | SheetJS CE | ExcelJS | Runstamp |
|---|---|---|---|
| Primary fit | Read and exchange spreadsheet data across many formats | Cell-oriented XLSX authoring and streaming | Typed XLSX operations and recurring document workflows |
| Existing XLSX | Read and write through its data model | Read and modify supported workbook features | xlsx.parse and bounded xlsx.transform |
| New XLSX | Data-oriented workbook export | Styled cells, formulas, validation, and conditional formatting | xlsx.render with cells, formulas, validation, formatting, tables, and charts |
| Charts | Check the current Community Edition and commercial feature boundary | No chart-creation API documented in the current project README | Native chart objects in the qualified render contract |
| Streaming | Streaming exports for supported data formats | Streaming XLSX writer | No general streaming-writer claim |
| Runtime | Browser and server options | Browser and Node.js options with documented limits | Use the declared execution surfaces for each operation |
The xlsx package on the public npm registry is not the maintained SheetJS build. SheetJS documents cdn.sheetjs.com as the source for current releases. Many tutorials still reference the stale registry package.
What is SheetJS good for?
SheetJS CE focuses on reading, transforming, and exporting spreadsheet data across several file formats.
SheetJS CE is primarily a spreadsheet data toolkit. Its documentation covers parsing and writing spreadsheet data across many formats. That breadth makes it a practical choice when an application must ingest files from several spreadsheet families before normalizing the values.
What it does best: reading uploaded spreadsheets. When a user uploads an XLS, XLSX, XLSB, ODS, or Numbers file, SheetJS parses it into a common in-memory representation that your code can process. This is its core design purpose: format-agnostic data extraction.
Writing boundary: SheetJS CE can write workbook data, while advanced template editing and presentation features have different CE and Pro support. Check the vendor's current feature documentation for the exact requirement instead of assuming that a parsed feature will round-trip unchanged.
Distribution: SheetJS's official Node.js installation guide identifies its CDN as the authority, states that the npm registry copy is out of date, and gives direct package-manager and vendoring instructions. Pin the authoritative tarball or vendor it according to that guide.
What is ExcelJS good for?
writer · styled cells · MIT
ExcelJS is a workbook manager with a cell-oriented API. Its project documentation covers reading and writing XLSX, styles, formulas, data validation, conditional formatting, images, and streaming writers.
What it does best: generating Excel reports with rich formatting. Cell colors, font styles, borders, number formats, conditional formatting, data validation, merged cells, images, and streaming writes for large files. ExcelJS gives you the most control over what each cell looks like.
Chart boundary: the current project documentation does not describe a chart-creation API. If charts are required, verify the current issue and release state with a representative file rather than assuming an old workaround still applies. The current ExcelJS comparison records that narrower decision.
Review the dependency tree in the version you plan to ship. A repository issue or audit warning is evidence about that version and installation, not a permanent security conclusion.
Where does Runstamp fit?
Runstamp exposes XLSX work through named operations with typed results.
Runstamp exposes named XLSX operations through one result contract. xlsx.render creates a workbook from a typed model; xlsx.parse reads supported workbook structures; xlsx.transform applies bounded changes to an existing workbook; validation and repair have separate contracts.
Runstamp fits document workflows that need explicit inputs, errors, losses, diagnostics, and artifact receipts across local, CLI, MCP, or managed execution. The checked xlsx.render input includes cells, formulas, formatting, validation, conditional formatting, tables, and a native chart. See the JSON to XLSX chart guide and operation page.
Operation boundary: Runstamp ships stable xlsx.parse, xlsx.inspect, xlsx.transform, xlsx.repair, xlsx.convert, xlsx.render, and xlsx.validate operations. Those schemas support reading and modifying the workbook structures they define. It is an operation-level document processor rather than an unrestricted cell-by-cell editor or a streaming dataset API.
Current packaging and commercial terms belong on the pricing page, where they can be updated without making this technical comparison stale.
Disclosure: Runstamp is our product. This comparison evaluates all three libraries on their merits, including Runstamp's limitations.
Compare the programming models
The three tools expose different abstraction levels:
SheetJS: file -> workbook data model -> data exchange or workbook export
ExcelJS: workbook -> worksheet -> row/cell objects -> XLSX bytes or stream
Runstamp: named operation + typed input -> result, losses, diagnostics, receipt
SheetJS is convenient when the central problem is reading or transforming tabular data. ExcelJS is convenient when application code needs direct control over rows and cells. Runstamp is useful when the operation boundary, existing-file preservation, validation, retries, and evidence need to remain consistent across execution surfaces.
For executable examples, use the vendors' current documentation. Runstamp publishes a hash-bound XLSX render input and result and a separate existing-workbook mutation example. Those examples prevent this comparison from becoming a second, stale API reference.
How wide is the chart gap?
Chart support changes by version and edition, so test the exact dependency you will ship. For Runstamp, the current xlsx.render contract and its checked artifact are the authority. For SheetJS and ExcelJS, use their current official documentation and release notes. Do not infer support from a stale npm package, an old issue title, or a library's ability to read an existing chart.
The chart landscape is fragmented. Evaluate creation, preservation, data binding, editability, and cross-viewer rendering as separate capabilities. Runstamp's current checked example creates a native XLSX chart through xlsx.render; that evidence does not imply that every chart feature or viewer is supported. For the focused decision, see the JSON-to-XLSX chart implementation and ExcelJS comparison.
Decision framework
| If the main requirement is… | Evaluate first |
|---|---|
| Read many spreadsheet formats into a common data model | SheetJS CE |
| Author or stream XLSX through a detailed cell API | ExcelJS |
| Generate a typed XLSX artifact with a native chart and operation receipt | Runstamp xlsx.render |
| Apply a declared change to an existing workbook and verify preservation | Runstamp xlsx.transform, then compare with the library already used by your application |
| Run entirely in a browser | SheetJS CE or ExcelJS, subject to feature and bundle testing |
| Support workbook features outside these public contracts | Evaluate a broader commercial spreadsheet SDK |
The libraries are complementary, not competitive. A common production pattern: SheetJS parses an uploaded spreadsheet, your code transforms the data, ExcelJS generates a styled export for simple tables, and Runstamp generates a report with charts. The choice depends on the specific task, not on which library is "best" in the abstract.
Keep the document workflow in your product.
Pick an operation, run it on a real file, then embed review and release where your customers work.