Tools
Guides

JSON to Excel Converter

JSON

Convert a JSON array into an Excel .xlsx workbook with SheetJS and download it.

100% client-side No backend

Remote URLs are not fetched; paste your JSON directly.

Input
Output
On this page

What is a JSON to Excel converter?#

A JSON to Excel converter takes a JSON document shaped like a table — typically an array of similar objects — and produces a real .xlsx workbook you can open in Excel, Google Sheets, or LibreOffice. Each object becomes a row, each top-level key becomes a column, and the first row of the sheet is the header. The output is a genuine binary spreadsheet file, not a renamed CSV.

This bridges the gap between systems that speak JSON (APIs, logs, NoSQL exports) and people who work in spreadsheets. A backend can dump a thousand records as JSON; a human analyst wants them in Excel to pivot, filter, and chart. The converter also handles the messiness real data brings: nested objects, fields present in some rows but not others, and array-valued fields that have nowhere natural to land in a grid.

Two conventions do the heavy lifting. Nested objects are flattened with dot-notation keys — {"address": {"city": "London"}} becomes a column named address.city. Array-valued fields (and any object that survives flattening) are stringified into their cell as JSON text, because a spreadsheet cell holds one value, not a nested structure. The result is a flat, rectangular table that spreadsheet software can open without complaint.

How to use it#

  1. Paste a JSON array of objects into the Input pane on the left. A lone object, or an object wrapping the rows under a single key like {"data": [...]}, is also accepted.
  2. Tick Flatten nested (on by default) to expand nested objects into dot-notation columns. Untick it if you want nested objects kept as JSON text in a single cell instead.
  3. The Output pane shows a tab-separated preview of exactly what will land in the sheet — the header row followed by the data rows. The status line reports how many rows were exported.
  4. Click Download .xlsx to save the workbook. The file is built in your browser and downloaded directly; there is no server.
  5. Sample loads a small employee dataset; Clear resets both panes and disables the download button.

Key features#

  • A real .xlsx file, not a renamed CSV. The workbook is built with SheetJS and downloaded as binary, so Excel opens it natively with proper columns, types, and sheet structure.
  • Stable column order on messy data. Columns are computed as the union of every row’s keys, in first-seen order. Heterogeneous rows do not shift or misalign columns — a missing field simply becomes an empty cell.
  • Dot-notation flattening. Nested objects expand into named columns (address.city, address.zip) so their inner values are individually filterable and sortable in the sheet.
  • Tab-separated preview. The output pane mirrors the sheet contents exactly, so you can verify the shape before downloading.
  • Pure client-side. Parsing, flattening, and workbook generation all run in your browser. The data never leaves the page.

Worked example#

Load Sample and the input is an array of three employee records:

[
  { "id": 1, "name": "Ada Lovelace", "role": "Engineer",  "salary": 95000,  "skills": ["math", "logic"] },
  { "id": 2, "name": "Bob",         "role": "PM",        "salary": 120000, "skills": ["docs", "plan"] },
  { "id": 3, "name": "Grace",       "role": "Architect", "salary": 150000, "skills": ["systems", "c", "cobol"] }
]

All three rows share the same keys, so the columns are id, name, role, salary, skills in that order. The skills field is an array, so it is stringified into each cell. The tab-separated preview is:

id	name	role	salary	skills
1	Ada Lovelace	Engineer	95000	["math","logic"]
2	Bob	PM	120000	["docs","plan"]
3	Grace	Architect	150000	["systems","c","cobol"]

Click Download .xlsx and you get a workbook whose first sheet has this exact content, with id / name / role / salary / skills as the header row. From there, Excel treats salary as numbers (so it sums and averages) and skills as text.

If a fourth row were added that omitted salary, the converter would still emit all five columns and simply leave that one cell empty — no column shifts, no misaligned data downstream.

FAQ#

Why does my nested object turn into columns with dots in their names?#

That is the Flatten nested option. A field like "address": {"city": "London", "zip": "NW1"} cannot fit into one cell usefully, so it is expanded into address.city and address.zip columns — each individually filterable and sortable in Excel. Turn the option off if you would rather keep the whole object as a JSON string in a single address cell.

Why is my array shown as ["math","logic"] in the cell?#

A spreadsheet cell holds one value, and a JSON array is a nested structure, so it is serialised back to JSON text and placed in the cell as-is. That keeps the data lossless — nothing is dropped — and you can still parse it later. If you want each array element on its own row, restructure the source JSON before converting (one record per element).

My rows have different fields. What happens to the columns?#

The converter takes the union of all keys across every row, in the order they first appear, and uses that as the header. A row that lacks a given field gets an empty cell for it. So adding a row with an extra manager field simply adds a manager column; rows without it stay blank, and nothing already present moves.

Is my data uploaded anywhere to build the .xlsx?#

No. Parsing, flattening, and the SheetJS workbook generation all run inside your browser. The download is produced from an in-memory buffer and handed straight to the browser’s save dialog — there is no backend and no network request.