Toolvore

JSON to Excel Converter

Turn a JSON array of objects into a spreadsheet, with the keys as column headings.

This tool runs entirely in your browser. Your data is never uploaded, never stored, and never leaves your device.

Turns a JSON array of objects into a spreadsheet, using the keys as column headings and one row per object, including keys that only some of the objects have.

How to use it

  1. 1Paste an array of objects — press Use an example if you want to see the shape.
  2. 2Press Create Excel file.
  3. 3Download data.xlsx.

Example

Input
[{"name":"Ada","born":1815},{"name":"Alan","born":1912}]
Output
data.xlsx, about 2.7 KB, with name and born as bold headings and two rows beneath them.

The column list is the union of every object's keys, so an object missing a field leaves that cell empty rather than shifting the row. Nested objects and arrays are written as text, because a cell holds one value — flatten them first if you need them as columns. Anything that is not an array of objects is refused with a message saying what shape is expected.

What happens to your data

The JSON never leaves the page: it is parsed here, turned into rows here, and written into the .xlsx here. API responses and database dumps are the usual input for this, and those are exactly the things that should not be pasted into someone else's server to be converted.

Last updated August 2026

Someone has asked for the data in Excel, and what you have is JSON — an API response, an export from an admin panel, a query result someone dumped to a file. Nobody in that conversation wants to discuss JSON. They want a file that opens with headings across the top and one row per record.

The thing to settle before you paste anything is shape. What converts is a top-level array of objects: an opening square bracket, then a run of records, each one a set of key and value pairs. That is not how most API responses arrive. The common shape is a wrapper — a status, a count, a page number, and the records themselves tucked under a key such as data or results. Paste the whole response and it is refused, and correctly so, because a wrapper object is one record rather than a list of them. Copy out the inner array, brackets included, and paste that.

The second thing is what a cell can hold, which is one value. JSON nests and a spreadsheet does not. A record whose address is itself an object, or whose tags are a list, has no honest column to sit in. If those inner fields are the ones you need to sort or filter on, flatten them into top-level keys first — address_city, address_postcode — and convert after that. Doing it the other way round means unpicking it by hand in Excel, which is the job you came here to avoid.

How it works

Toolvore reads what you pasted with the browser's own JSON parser, then walks the array twice: once to collect the column headings, once to fill the rows. The headings are the union of every object's keys in the order each key is first seen, so a field that appears only in the last record still gets a column, and a record missing a field leaves that cell blank rather than shifting its neighbours left. Every value is then converted to text before it is written, and that is the honest weakness: numbers, true and false, and dates that were only ever strings in JSON all land in the workbook as text cells. Excel will display them and sort them alphabetically, but will not total them until the column is converted. Nested values fare worse — an object becomes the literal text [object Object] and an array becomes its items joined by commas, a note of what was there rather than the thing itself. The first row is written in bold, the sheet is always named Sheet1, and the file is always data.xlsx.

Common use cases

  • Sending an API response to a colleague who only works in Excel
  • Turning a database query exported as JSON into a sheet for filtering
  • Getting webhook payloads out of a log and in front of an ops team
  • Building a quick pivot table from records an application exported as JSON
  • Spotting which records are missing a field, by looking at the blank cells
  • Preparing JSON records for a portal or form that accepts only a spreadsheet
  • Handing a finance team figures that exist nowhere but an API

Frequently asked questions

How do I convert a JSON file to Excel?

There is no file picker on this page — the input is a text box, so open the .json file in an editor or a browser tab, select all of it, and paste. Press Create Excel file and a download link for data.xlsx appears beneath the button. While the box is still empty, a link reading Use an example fills it with two records, which is the fastest way to see the shape being asked for before you go hunting through your own file. Editing the box afterwards clears the result, so the file you download always matches the text on screen rather than something you changed since.

My JSON starts with a curly brace and the records are inside it — what do I do?

That is the usual shape of an API response: an outer object carrying a status, a count and paging information, with the records under a key such as data, results, items or rows. Only that inner array converts here, so select from its opening square bracket to its closing one and paste that alone. A formatter makes this far easier than reading minified text — collapse the outer object, find the one key whose value is a list, copy it. At a terminal, jq .data file.json prints the same thing. Paste the wrapper as it stands and you are told plainly that it is not an array.

Why do my numbers show up as text in Excel?

Because every value is turned into text before it is written, so a cell holding 1815 is four characters as far as the workbook is concerned. Excel usually marks these with a green triangle and a note that a number is stored as text. Clearing it takes a moment: select the column and either use that warning menu's convert option, or Data, then Text to Columns, then Finish on the first screen, which re-reads every cell. Dates deserve more care than numbers, because a value written as 07/08/2026 is read according to your regional settings and can quietly become a different day.

Can I convert nested JSON into spreadsheet columns?

Not into columns, no — and no converter can manage it without inventing a rule about how deep to go and what to call the results. A cell holds one value, so a key whose value is another object comes out as the literal text [object Object], and a key whose value is a list comes out as its items joined with commas. One of those is still useful: a list of tags reads perfectly well as a comma-joined string. An object does not. Flatten before converting, giving each inner field a top-level key of its own, and what you get back is a sheet you can sort and filter.

How do I convert JSON Lines or NDJSON?

A JSON Lines file holds one complete object per line, with no commas between them and no brackets around the whole thing — a common shape for logs and for anything written as it happens, because a writer can append a line without rewriting the file. As a document it is not valid JSON, so it is refused here. The conversion is mechanical: a square bracket at the top, a comma at the end of every line except the last, a closing bracket at the bottom. Any editor with multiple cursors does it in a few keystrokes, and at a terminal jq -s . file.jsonl performs the same wrap.

Does my JSON get uploaded anywhere?

No. The text is parsed in the page by the browser's own JSON parser, the rows are assembled there, and the .xlsx is written there too, by a library the tab fetches and runs itself. The download link points at data held in your browser's memory rather than a file on a server, and it is released when you leave. That matters more here than for most conversions, because what people convert is API responses, database dumps and export files — customer records, order histories, email addresses. There is no account, no server-side limit on how much you paste, and no copy of the data anywhere but your own machine.

Why did my long ID numbers lose their last digits?

Two separate places do this, and both are worth knowing about. JSON is parsed by JavaScript, which holds numbers as doubles and carries only about fifteen or sixteen significant digits exactly, so a nineteen-digit order id written as a bare number is rounded before anything else touches it. Excel then applies a fifteen-digit limit of its own, and will show a long run of digits in scientific notation once it decides the cell is a number. The remedy is the same in both cases: long identifiers should travel as strings, in quotation marks, in the JSON that produced them. If you control the export, quote them at source.

Why is my JSON rejected as invalid?

The parser is the browser's own, which follows the specification strictly and forgives nothing. The recurring causes are a trailing comma after the last item in a list or object, keys and strings wrapped in apostrophes instead of quotation marks, comments, and an unescaped line break inside a string. Anything copied out of a JavaScript file usually fails on the first two, because JavaScript allows both and JSON does not. Copying from a terminal brings its own hazard: a response wrapped across lines by the terminal, or cut off where the scrollback ran out. When the message says the JSON is invalid, a formatter will point at the exact character.