Convert JSON to Excel
Flatten a JSON or NDJSON export into a spreadsheet. Nested objects become dot-named columns and every record contributes its keys.
Drop your files here
.json, .ndjson, .txt · up to 300 MB
More settingsFewer settings
How to Convert to Excel
- 1
Drop a JSON file or paste the text
Plain JSON and newline-delimited NDJSON are both accepted, and a pasted response works just as well as a file.
- 2
Point at the array and pick how nesting is flattened
If the records sit under data.items, say so. Choose whether nested objects become columns and how arrays are represented.
- 3
Convert and download the XLSX
The workbook opens straight into a table with a frozen header row and column widths already sized to the content.
API responses are not tables
Almost no real payload is a bare array. It is wrapped in a status envelope, the records live under data.items or result.rows, and each record has nested objects inside it. That is why the path to the records is the first thing this tool asks for rather than something it guesses: guessing wrong produces a one-row spreadsheet describing the envelope, which looks like success and is not. If the path does not resolve, the error lists the keys that actually exist at the top level so the next attempt is informed rather than another guess.
Columns come from every record, not the first one
The single most common bug in hand-rolled JSON-to-table code is taking the column list from the first record. Records in a real export are ragged: an optional email field appears on the second entry, a discount only on the ones that had one. Here every record is scanned and the column list is the union of all their keys, in order of first appearance, so nothing silently disappears. Rows that lack a column get an empty cell rather than a shifted value. If you deliberately want only the first record's shape, that is a setting, but it is not the default, because losing data quietly is worse than a wide sheet.
Nesting, arrays and the limits of a cell
A nested object becomes columns named user.address.city up to the depth you allow; deeper branches are written as compact JSON rather than exploded, because a fully expanded GraphQL response can produce twenty thousand columns and Excel stops at 16,384. Arrays get three treatments: joined into one cell with a separator you choose, spread across tags.0 to tags.N, or written as a JSON string. Which of those is right depends entirely on what you plan to do next. Strings longer than 32,767 characters are truncated with a notice, because that is a hard ceiling of the cell itself.
Nothing leaves your browser
Parsing, flattening and workbook writing all run locally in this tab. An API dump often contains customer records or access tokens, so it is worth being explicit: there is no upload, no server-side processing and no retained copy.
Frequently asked questions
How do I handle nested objects?
By default they become dot-named columns such as user.address.city, down to the depth you set. Beyond that depth the remaining branch is stored as a compact JSON string so nothing is lost, and you can also force every object to be stored that way.
How do I point at the array of records?
Type its path with dots, for example data.items or result.rows.0. If it does not resolve, the error message lists the top-level keys of your file so you can see where the records really live.
What happens to arrays inside a record?
You choose. Joining puts them in one cell separated by a string you pick, columns spreads them across tags.0 to tags.N up to fifty, and JSON stores the array as text. Joining is the default because it reads best in a spreadsheet.
Why do my records have different fields?
That is normal in API exports, and it is handled: the column list is the union of the keys of every record, in order of first appearance. Records missing a field get an empty cell rather than a shifted row.
What are Excel's row and column limits?
1,048,576 rows and 16,384 columns. Exceeding either is refused with an explanation and a route to a CSV converter, which has no such ceiling.
Is NDJSON supported?
Yes. A file with the .ndjson extension is parsed one record per line, which also means a syntax error names the exact line rather than an offset in a hundred-megabyte string.
Does my file get uploaded?
No. Everything from parsing to writing the XLSX happens in your browser, with no server involved and nothing retained after the tab closes.