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

excel-html-converter

v1.0.9

Published

Convert Excel pivot tables, plain tables, and charts into browsable HTML reports, served through a small self-hosted Python web app.

Readme

excel-html-converter

Turn Excel pivot tables, plain tables, and charts into browsable HTML reports — no Excel and no plugins needed to view them, just a browser. A small self-hosted Python web app does the work: upload an .xlsx, get a shareable report page.

📺 Video walkthrough

Screenshots

| Report list | Table (sort & filter) | |---|---| | Report list | Table |

| Pivot grid | Line chart | |---|---| | Pivot grid | Line chart |

| Bar chart | Pie chart | |---|---| | Bar chart | Pie chart |

Quick start

npm install excel-html-converter
python node_modules/excel-html-converter/server/server.py

Open http://localhost:8000 in your browser.

What it does

  • Reads classic (worksheet-based) pivot tables, plain worksheet tables, and charts (line / bar / pie) directly from .xlsx files.
  • Respects what Excel already shows: hidden filter values, autofilter-hidden rows, and date groupings (Year / Quarter / Month) are read from the file, not re-derived.
  • Renders each as its own standalone page — a PivotGrid-based grid for pivot tables (with expand/collapse), a sortable/filterable table for plain data, and an SVG chart for line/bar/pie — all read-only snapshots of what was already built in Excel.
  • A tiny web UI lists all generated reports: create, open, update, delete. Report generation runs in a separate OS process, so a large file never blocks the server or takes the whole app down if it runs out of memory.
  • Update re-runs the conversion for an existing report from a newly uploaded .xlsx — the report's id, name, and position in the list stay the same, only its content is replaced.

Configuration

This project has two independent config files — nothing else. Changing one does not affect the other; if you want both the site and the reports in the same language, set LANGUAGE in both.

server/.env (copy from server/.env.example) — server-side settings, restart the server after changing:

  • PORT, HOST — where the server listens.
  • LANGUAGEru or en. Controls server error messages and everything baked into a generated report page: footers, the "back to reports" nav link, the table's sort/filter UI (search, "Contains"/"Starts with", column headers), and the pivot grid widget itself.
  • REPORTS_DIR — where uploaded files and generated reports are stored. Defaults to a reports/ folder next to wherever you run the server from — deliberately not inside the package itself, since node_modules gets wiped and recreated by npm install at any time, and that would take your reports with it.
  • TABLE_DEFAULT_ROW_LIMIT, PIVOT_DEFAULT_ROW_LIMIT — covered in their own section below.

client/js/config.js — client-side settings for the report-list website itself (index.html / new.html). Edited directly in the file, no .env involved on this side, and no restart needed — just reload the page:

  • LANGUAGEru or en. Controls only the site's own UI (the list page and the create-report form). Independent of the server's LANGUAGE above.
  • POLL_INTERVAL_MS (default 3000) — how often, in milliseconds, the report list re-checks /api/reports while at least one report is still "processing", so its status flips to "ready" on its own, without a manual page reload.

Keeping your config outside node_modules

npm install puts both files inside node_modules, which gets wiped on every reinstall. Keep your config elsewhere with two optional flags:

python node_modules/excel-html-converter/server/server.py \
  --server-config /path/to/your/server.env \
  --client-config /path/to/your/config.js

Both flags are optional and independent of each other — pass either one, both, or neither (falls back to the bundled files). --server-config takes a .env-style file; --client-config takes a config.js-style file (same const CONFIG = {...} format as the bundled one). Run with --help to see them listed.

Project layout

server/
  server.py        - REST API + static file serving
  converters/       - the actual xlsx -> html parsers/generators
  reports/          - generated reports (created automatically)
client/
  index.html, new.html, js/, css/  - the small report-list web UI
  table-tools/, chart-tools/       - vanilla-JS rendering libraries used by generated reports
  node_modules/pivotgrid-js/       - pivot grid rendering engine (npm dependency)

Excel file requirements

  • One kind of content per sheet. A sheet is either a plain table, or hosts pivot table(s), or hosts chart(s) — not a mix. Multiple pivot tables or charts can share one sheet (each becomes its own page in the report); a plain table cannot share a sheet with anything else.
  • Only classic (worksheet-based) pivot tables are supported. Pivot tables built on the Data Model / Power Pivot are skipped (with a message in the server log) — rebuild them as a regular pivot on a cell range if you need them in the report.
  • Supported chart types: line, bar (column), pie. Other chart types are skipped.
  • Excel's own hard ceiling is 1,048,576 rows per sheet — not something this tool adds, just a fact about .xlsx itself.

Limits & configuration

Two different kinds of limit, both configurable in server/.env (copy from server/.env.example), server restart required after changing:

  • TABLE_DEFAULT_ROW_LIMIT (default 5000) — a hard architectural ceiling, not just a nicety. Sorting/filtering a plain table happens directly on the DOM in the browser, with no virtualization; raising this a lot will make the browser itself noticeably slow on sort/filter, regardless of server power.
  • PIVOT_DEFAULT_ROW_LIMIT (default 500000) — a soft safety default, not a hard limit. It exists because decoding raw pivot cache rows takes real server time and memory. The pivot grid itself renders fine at any size — feel free to raise this if your server has the time/memory to spare.

If a file has more rows than the limit in effect, the generated report footer says so explicitly ("shown: first N, source may have more"); if everything fit, no such note appears.

License

Free for personal, educational, or non-commercial use — see LICENSE. For commercial use, see LICENSE.commercial or contact [email protected].