npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

exceljs-community

v5.1.1

Published

Excel Workbook Manager - Read and Write xlsx and csv Files. Maintained drop-in replacement for exceljs.

Readme

exceljs-community

Read, manipulate and write spreadsheet data and styles to XLSX and JSON.

A maintained continuation of exceljs, which has received no commits since January 2024 and no release since 4.4.0 in October 2023. This package picks up where 4.4.0 left off, as a drop-in replacement.

npm install exceljs-community

Changes since 4.4.0 are listed in CHANGELOG.md, with the reasoning behind each in FORK.md.

Why this fork exists

The upstream project accumulated 650+ open issues and 140+ open pull requests with no maintainer to act on them. Several forks appeared (by MUI, protobi, nuvo, DevExtreme and others), but each was created to solve its owner's specific problems, and their maintainers stated publicly that they did not intend to take over maintenance of the library itself.

What was missing was not another set of patches. It was someone willing to say the fork is permanent, and to say so in a way you can hold them to.

Maintenance commitment

These promises are deliberately small, so that they hold even in a bad month:

  1. Security releases within 30 days of a disclosed vulnerability in a production dependency.
  2. A response to new issues within 14 days. A response is not a fix; it may be a question, a triage label, or an honest "not soon".
  3. No promises about features or bug-fix timelines. Anything beyond the two points above happens when it happens.
  4. If maintenance stops, it will be announced. Should this project become unmaintainable, that will be stated publicly in this README and in the issue tracker, along with an attempt to hand the repository to someone else.

The fourth point matters most. Upstream was not killed by a maintainer stepping away, which is normal and nobody's fault. It was killed by the silence that followed, which left users guessing for two years.

Compatibility

The public API is identical to [email protected]. Migration is one line in package.json, with no changes to your code:

- "exceljs": "^4.4.0"
+ "exceljs-community": "^5.0.0"

5.0.0 requires Node 22.12 or newer. That is the only reason for the major version; nothing in the API changed. If you are on an older Node, ^4.6.1 remains available and is a drop-in replacement for [email protected] down to Node 14.14.

const ExcelJS = require('exceljs-community');
// or
import ExcelJS from 'exceljs-community';
// or, since 4.6.0
import {Workbook, ValueType} from 'exceljs-community';

Named imports are new in 4.6.0. Before it, index.d.ts declared them and the package did not deliver them, so TypeScript accepted import {Workbook} and the built application got undefined, a mismatch that only appeared once bundled. Deep imports such as exceljs-community/lib/doc/workbook and the documented exceljs-community/dist/es5 path keep working unchanged.

No breaking change to the API is planned. 5.0.0 raised the Node requirement and changed nothing you call; any future major will exist for the same kind of reason, and will say so in the same place.

What the browser bundle does not have

dist/exceljs.min.js carries Workbook and the enums. ModelContainer and the whole stream namespace are missing from it, because the streaming reader and writer are built on Node streams and a Node zip library. index.d.ts describes one package rather than one per environment, so it declares both. In the browser they are undefined, and this has been true since long before the fork.

Nothing else differs: Workbook, xlsx.load, xlsx.writeBuffer, csv and every enum behave the same on either entry.

Test runners that resolve Node conditions

The exports map sends a bundler to dist/exceljs.min.js through the browser condition and Node to excel.js through require. A test runner is neither: Vitest and Jest resolve Node conditions even with environment: 'jsdom', so a test covering browser code takes the Node entry, reaches the streaming writer, and lands on archiver@8, which has been ESM-only since 5.0.0 and ships inside a CommonJS package:

SyntaxError: Cannot use import statement outside a module
 ❯ exceljs-community/lib/stream/xlsx/workbook-writer.js

The file fails while importing, so the runner reports no tests rather than a failed one, which reads like a mistake in your own code. Point the runner at the bundle the browser would have got anyway:

// vitest.config.ts
resolve: {alias: {'exceljs-community': 'exceljs-community/dist/exceljs.min.js'}}

test.server.deps.inline: ['archiver'], the fix the error message itself suggests, does not work. Verified on Vitest 4.1.10 with environment: 'jsdom'; the cause is how the resolver picks conditions, not anything specific to that version, so expect Jest to behave the same way.

Angular

allowedCommonJsDependencies in angular.json matches on the package name, and this package has a different one. An entry left saying exceljs still builds, which is the problem: the warning it was there to silence comes back, and nothing fails:

▲ [WARNING] Module 'exceljs-community' used by '...' is not ESM

Nothing about the bundle changes; the allow-list filters diagnostics, not bundling. What you lose is the warning itself, so the next CommonJS dependency to enter the build arrives silently.

Rename the entry as part of the migration.

Documentation

The full API reference lives in docs/api.md. It is inherited from upstream and has not yet been verified against the current code. Sections are reviewed as the areas they describe are worked on. If something there contradicts what you observe, that is worth an issue.

docs/model.md describes the plain object model behind a workbook, which is worth reading before manipulating one directly. docs/upgrade-4.0.md is the migration guide from the 3.x line, still accurate for anyone arriving from an old version.

Changes made here are listed in CHANGELOG.md; the upstream changelog up to 4.4.0 is archived in docs/history-upstream.md.

Contributing

Contributions are welcome, including bug reports with no fix attached: a failing test that demonstrates a problem is a genuinely useful contribution.

One firm rule: every fix ships with a regression test that fails before the change and passes after it. This library writes binary files, so "works on my machine" is not evidence.

See CONTRIBUTING.md for how to run the test suites.

Credits

This library was created by Guyon Roche and developed by many contributors over the years; their work is recorded in docs/history-upstream.md and in the commit history, which is preserved here in full.

License

MIT, unchanged from upstream. See LICENSE.