Convert JSON to Excel — Free, Private, In-Browser
JSON is a document format — hierarchical, self-describing, and typed, with numbers, booleans, nulls, and arbitrarily nested objects and arrays. Excel is the far opposite: a flat grid of cells that someone opens by double-clicking. Converting JSON to Excel is almost never for another pipeline; it's for a person. You're handing a stakeholder or a non-technical colleague a workbook they can sort, filter, pivot, and chart without a JSON parser or a line of SQL. The shape that maps cleanly is a top-level array of objects: each object becomes a row, and the union of keys across every record becomes the header. Records don't have to agree on their keys — an object missing one just leaves that cell empty, not a zero or a literal null.
Several things get reshaped on the way into cells. A nested object or array has no cell equivalent, so a value like {"a":1} is serialized to a JSON string inside a single cell rather than exploding into its own columns — the same flattening the CSV path does. Numbers are where Excel bites: every cell number is an IEEE-754 double, so an integer past 2^53 can't be held exactly. Rather than let those IDs round silently, the converter writes out-of-range integers as text so every digit survives — they land as text cells, not numeric ones. Everything writes to a single worksheet named Sheet1 inside one .xlsx workbook, so the output is one tidy file to hand off.
A worksheet is hard-capped at 1,048,576 rows by 16,384 columns — feed it a bigger record set and the overflow simply won't fit, which makes Excel the wrong target for a full extract; export to CSV or Parquet for that. And because .xlsx is really zipped XML assembled in memory, very wide or very long inputs are slower to produce than a streaming CSV. Reach for this when a human is the consumer, not a machine. The JSON is parsed and the union of keys resolved with DuckDB-WASM, then the workbook is written with SheetJS — both run entirely in your browser, so the file is never uploaded to a server.
Drop a file or click to browse
Drop a JSON file — processed locally, never uploaded
Frequently asked questions
- What happens to nested objects and arrays in my JSON?
- Excel cells have no nested type, so any object or array value is serialized to a JSON string inside a single cell — {"a":1} lands as the literal text {"a":1} rather than expanding into its own columns. It's the same flattening the JSON-to-CSV path uses. If you need the structure kept as real objects, or split across separate columns, pre-flatten the keys before converting or keep the data as JSON/JSONL.
- How are large integer IDs handled?
- Excel stores every number as a 64-bit IEEE double, so integers beyond 2^53 can't be represented exactly. Instead of letting them round silently, the converter writes out-of-range integers as text cells — every digit is preserved, but the cell is text, not a number. Watch for this if a downstream formula needs to do arithmetic on those IDs; you'd have to coerce them back first.
- How many sheets does the workbook have, and is there a row limit?
- One sheet, named Sheet1, in a single .xlsx workbook. A worksheet is capped at 1,048,576 rows and 16,384 columns — that's Excel's own format ceiling, not a tool limit. If your array is larger than that, the overflow won't land in the sheet; export to CSV or Parquet instead, or filter the records down before converting.
- Is my file uploaded anywhere?
- No. The JSON→Excel 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.