Turn a JSON file into an Excel 97-2003 workbook
Apps, websites and APIs send data as JSON because programs read it quickly. People don't, and you can't sort or filter it until it's in a spreadsheet. Convert JSON to XLS and you get the older Excel workbook format, the .xls file that Excel saved by default until Excel 2007 came out.
Most people don't need .xls anymore. Every Excel since 2007 opens .xlsx, which holds far more rows and columns, so XLSX is the better pick unless something forces your hand. Pick XLS when the file is going to Excel 2003 or earlier, or to an older system, a form or an upload page that only accepts .xls. This page reads your JSON file and writes an XLS workbook, with each record as a row and nested data split into its own columns.
How to convert JSON to XLS
- Upload your JSON file - Drag it into the box at the top of this page, or browse for it. You can add up to 5 files at once, and each one can be up to 20 MB.
- Check the output - XLS is already picked on this page, so there's nothing to change.
- Download your file - Save the .xls file when it's ready, then open it in Excel, LibreOffice or Google Sheets.
Your file is uploaded and converted on our servers, so you don't need to install anything or make an account. Our security page explains what happens to your file after that.
How your JSON becomes rows and columns
A JSON file can nest records inside records, but a spreadsheet is a flat grid, so the converter follows a few rules to decide where each value lands:
- Each record in a list becomes one row. The names in the records become the column headings, in the order they first appear in the file.
- A record inside a record is flattened, with the names joined by a dot. The city inside an address lands in a column called
address.city. - A list of plain values, like tags, shares one cell, with a semicolon and a space between the items.
- When a record holds a list of records, like an order with its items, the first such list becomes one row per item, and the rest of the order is repeated on each of those rows. A second list of records in the same record stays as JSON text in one cell, because one table can't split two lists at once.
- A file with a single record gives a one-row table. A record with exactly one list inside it uses the list's items as the rows.
- If two names would make the same column, the second one gets
_2added, so nothing is overwritten.
The table goes on a sheet named Data, with a bold header row frozen at the top, so the headings stay in view while you scroll. JSON numbers are stored as numbers and JSON text as text, which is why a ZIP code like "01100" is saved with its zero. Whole numbers with 15 or more digits are stored as text as well, so no digits get lost. Text that starts with = is stored as plain text, which stops Excel from running it as a formula.
What fits in an .xls file
The .xls format dates from the 1990s, and its limits are small by today's standards. A sheet holds 65,536 rows by 256 columns, and one of those rows goes to the header, which leaves room for 65,535 rows of data. The converter counts the table before it writes anything. If your JSON makes more rows or columns than that, no file is written, and you see this message:
This file makes more than 65,535 rows or 256 columns, which is more than an .xls file can hold. Choose XLSX instead.
Text has limits too. One cell holds at most 32,767 characters, so longer text is cut at that point. A workbook with more than 100 million characters of text in total is refused with the message This file has too much text for an .xls file. Choose XLSX instead.
Behind the scenes, the converter builds the workbook as .xlsx first and LibreOffice saves it as .xls, so the two formats get the same table. XLSX is the fallback the messages point to, because our JSON to XLSX converter takes up to 1,000,000 rows and 16,384 columns.
A real example from our tests
On 13 November 2026 we uploaded a small file we wrote ourselves to our live converter. It has a nested address, a list of tags, and a ZIP code that starts with a zero:
[
{"id": 1, "name": "Ana", "address": {"city": "Lisbon"}, "tags": ["a", "b"], "zip": "01100"},
{"id": 2, "name": "Zoë", "address": {"city": "Zürich"}, "tags": [], "zip": "8001"}
]
About 15 seconds after we started the upload, it came back as a 6,144-byte .xls file. You can download the JSON we uploaded and the XLS it produced and open it yourself. We didn't inspect the cells from this run. On our test server before launch, the same file gave a two-row table with the columns id, name, address.city, tags and zip, with id stored as a number and 01100 stored as text, and reading the .xls back through LibreOffice showed the same table as the XLSX version.
The test server also showed the row limit at work. A 19 MB file with 122,589 records converted to CSV in about 8 seconds, but the XLS run was refused with the message above, because 122,589 rows is nearly twice what an .xls sheet can hold.
Limits, and files that won't convert
- Each JSON file can be up to 20 MB. The upload box accepts bigger files, but the converter stops anything over 20 MB and asks you to split it.
- Data nested more than 64 levels deep is refused.
- JSON Lines, with one record on each line, isn't supported, because the file has to hold a single JSON value.
- The file must be UTF-8 text. UTF-16 and UTF-32 files with a BOM work too.
- NaN and Infinity aren't allowed in JSON, so a file that uses them is refused.
- A list inside another list is written into one cell as JSON text, not split up.
If your JSON has a mistake, like a comma after the last item, the error message says what's wrong and which line it's on, so you can fix it and upload the file again. To turn an .xls file back into JSON, use XLS to JSON.