Convert Excel to JSON — Free, Private, In-Browser
An .xlsx file is a zipped bundle of XML — sheets, formulas, cell styles, merged regions, and per-cell types packed together. JSON is a tree of records. Converting Excel to JSON pulls the tabular data out of the workbook and reshapes it into an array of objects, which is the shape most JavaScript, REST APIs, and document stores actually want to consume. This tool reads the first sheet only: SheetJS parses the workbook client-side, treats the first row as the header, and emits one object per data row keyed by those column names. A hundred-row, three-column sheet becomes an array of a hundred flat objects. If your file has multiple tabs, the rest are ignored — move the sheet you want to the front, or split it out, before converting.
Typing is where Excel to JSON beats a CSV round trip. A spreadsheet already stores a type per cell, and SheetJS carries that through: a clean numeric cell becomes a bare JSON number and a boolean becomes true or false, so you are not re-sniffing text after the fact. Formulas are the catch — each one is replaced by its last cached value, the result Excel stored when the file was saved, not a fresh recalculation, so a workbook saved with stale results emits stale numbers. Dates arrive as ISO-ish strings rather than Excel's underlying serial numbers, which sidesteps the 1900-versus-1904 epoch confusion entirely. Everything visual — merged cells, fonts, fills, number formats, conditional formatting — has no JSON representation and is dropped.
One thing this conversion never does is invent structure. A worksheet is a flat grid, so every object comes out flat: one key per column, no nesting and no arrays. If you need nested JSON, that shaping has to happen after this step, or upstream in whatever produced the file. A few edges to know — the first row is taken as the header, so blank header cells yield empty or auto-named keys, and empty data cells drop out rather than inventing a value. Watch size too: JSON repeats every key on every record and holds the whole array in memory, so the output routinely dwarfs the zipped .xlsx it came from. It all runs locally in your browser via SheetJS — the file is never uploaded and its contents never cross the network.
Drop a file or click to browse
Drop a Excel file — processed locally, never uploaded
Frequently asked questions
- My workbook has several tabs — which one becomes JSON?
- Only the first sheet. SheetJS reads the first worksheet in the workbook and turns it into the JSON array; the other tabs are ignored. If you need a different tab, move it to the front in Excel, or save each tab as its own file and convert them one at a time.
- Are numbers and dates properly typed, or is everything a string?
- Excel stores a type per cell, and that carries through: clean numeric cells become bare JSON numbers and true/false cells become JSON booleans — no re-sniffing of text required. Dates come out as ISO-ish strings rather than Excel's serial numbers, so you avoid the 1900-vs-1904 epoch offset. Text cells, and formulas that resolved to text, stay strings.
- What happens to my formulas?
- They're replaced by their last cached value — the result Excel stored when the file was saved, not a live recalculation. If the workbook held stale results, the JSON carries those stale values. Open and re-save the file in Excel first if you need the calculations refreshed before converting.
- Is my file uploaded anywhere?
- No. The Excel→JSON conversion runs entirely in your browser via DuckDB-WASM. Your file never leaves your device.
- How large a file can I convert?
- It's bounded by your browser's available memory rather than any server limit — files in the hundreds of MB are routine. DuckDB runs single-threaded here, so very large files just take a little longer.
- Do I need an account?
- No — it's free and requires no sign-up.