When to use it
A vendor sent an Excel sheet that needs to land in code (JSON, a database import). Or you have JSON / CSV data that an internal user wants as Excel.
Supported formats
- Reading —
xlsx,xls,xlsm,ods,csv. One file at a time. - Writing —
xlsx, single sheet. You name the sheet.
Cell types
- Numbers — preserved as-is. Integers, decimals, scientific notation.
- Dates — exported to JSON as ISO 8601 strings (e.g.
2026-04-29T00:00:00.000Z), not Excel serial numbers — so the round trip is lossless. - Blank cells —
nullin JSON, empty field in CSV. - Formulas — only the last computed value is read. The formula itself is dropped.
First-row-as-header
A toggle on the JSON output.
- On (default) — row 1 becomes keys.
{ "id": ..., "name": ... }. - Off — keys default to
col_1,col_2, ... For raw data dumps with no header row.
Large files
Up to 50MB is accepted. Anything over 10MB may briefly hang the tab during parse; over 100MB is not recommended on a laptop (the browser may show an unresponsive prompt).
Privacy
A vendor sales sheet, an internal HR table, a client roster — none of it leaves the page. The file lives briefly as an ArrayBuffer in memory and disappears when the tab closes.
Not the right tool when
- You need formulas to survive — only values come through. If the formulas, macros, charts, or conditional formatting must remain alive, use Excel itself.
- You want every sheet exported at once — one sheet per export. For multi-sheet files, switch the tab and download each one.
- You need a visual conversion (xlsx → pdf) — table styling, paper layout, headers/footers belong to Excel's PDF export.
Excel files stay in your browser
A vendor sales sheet, an internal HR table, a client roster — none of it is uploaded. SheetJS is dynamically imported into the client bundle, and the file lives only briefly in memory as an ArrayBuffer; it disappears when you close the tab.