JSON

Sheet preview

Your sheet appears here

Paste a JSON array on the left to see the columns before you download.

Handing an API response to someone who lives in Excel

This is the request that arrives on a Thursday afternoon: someone in finance, or operations, or your account team needs the data you already have as JSON, and they need it in a spreadsheet. You could paste it into a CSV and talk them through the import dialog. Or you paste the array here and send them an .xlsx that opens with the columns already the right width.

The interesting problem is not the layout, it is the numbers. Excel keeps about fifteen significant figures in a numeric cell, so a 19-digit ICCID or a long account number is rounded by Excel itself the moment the file opens — after everything upstream did its job correctly, and with no way to get the digits back. Microsoft documents this directly in last digits are changed to zeros when you type long numbers, and the answer they give is the one used here: the cell has to be text.

So any integer long enough to be at risk is written as a text cell, and the page tells you how many. Everything else stays a real number, because a column of readings you cannot sum is not a spreadsheet. The same limit exists on the JavaScript side and for the same reason — Number.MAX_SAFE_INTEGER is 9,007,199,254,740,991, and past that a JSON parser is already guessing. The JSON here is read with a parser that keeps the original digits rather than one that rounds them, which is what makes the rest possible.

The file itself is a genuine Office Open XML workbook — the format standardised as ECMA-376 — not a CSV with an .xlsx extension, and not an HTML table pretending to be one. It opens in Excel, LibreOffice, Numbers and Google Sheets without a warning dialog.

How to use it

  1. Paste your JSON – An array of objects is the usual shape. A lone object becomes a single row, and a {"results": [...]} wrapper is read through to the array inside it.
  2. Check the preview – The right-hand pane shows what the sheet will contain — the same columns, in the same order. Large documents are previewed in part; the download always holds everything.
  3. Name the sheet if you want to – It becomes the tab name in the workbook. Illegal characters are replaced rather than passed through, because Excel rejects them at open time and the file just looks corrupt.
  4. Download the .xlsx – The file is built in your browser and saved straight to your downloads folder. Nothing is uploaded at any point.

Pro tip: if a column arrives left-aligned in Excel with no green warning triangle, that is deliberate. Those are the cells too long to survive as numbers. You can sort and filter them normally — you just cannot sum them, which for an identifier was never something you wanted to do.

A worked example

Two subscriber records. The ICCID is nineteen digits: written as a number it would open in Excel as ...066000, four digits short of what you started with. Written as text it is exact, and the signal readings beside it are still numbers you can chart.

JSON array → .xlsx workbookConvert
subscribers.jsonJSON · 2 records
[
  {
    "msisdn": "447700900112",
    "iccid": 8944501012345678901,
    "device": { "model": "Pixel 9" },
    "rsrp": -97
  },
  {
    "msisdn": "447700900187",
    "iccid": 8944501019876543210,
    "device": { "model": "iPhone 17" },
    "rsrp": -103
  }
]
subscribers.xlsxExcel · 1 sheet · 4 columns
msisdn        iccid                device.model  rsrp
447700900112  8944501012345678901  Pixel 9        -97
447700900187  8944501019876543210  iPhone 17     -103

iccid is a TEXT cell in the workbook — written as a number,
Excel opens it as 8944501012345678000 and the last four
digits are gone. rsrp stays a number you can chart.

Where this actually gets used

Sending data to someone who does not use a terminal

Finance wants the billing export. Support wants the list of affected accounts. Neither of them is going to run a script, and a JSON file attached to an email is a file they cannot open. A workbook with sized columns and a filter row on the header is something they can work with immediately, and it takes you about fifteen seconds to produce.

Getting a bug report into a shape people can sort

You have four hundred records from a log query and you want to find the pattern. Excel's filter dropdowns and pivot tables are genuinely good at that, and they are on the header row of the downloaded file already. It is worth knowing the ceiling before you start: a worksheet holds 1,048,576 rows and 16,384 columns, per Microsoft's specifications and limits, and a browser will run out of memory well before that.

Producing an attachment for a ticket or an audit

Some processes need a file rather than a link — a compliance request, a change record, an invoice reconciliation. A workbook is the format those processes expect, and because it is generated in your browser the underlying data never travels anywhere it should not. That matters more than it sounds when the export contains customer identifiers.

What it handles

  • Long identifiers kept exact – anything Excel would round is written as text, and counted for you
  • Numbers stay numbers – readings, counts and amounts are still summable
  • Columns from every record – a field appearing only in later records still gets a column
  • Nested objects flatteneddevice.model as its own column
  • Column widths sized to content – no wall of #### on a date column
  • Filter row on the header – the dropdowns are already there when the file opens
  • Nothing leaves the browser – the workbook is written on your machine, with no upload

Questions people actually ask

Why is my long ID left-aligned in Excel?

Because it is a text cell, and that is what keeps every digit. Excel holds roughly fifteen significant figures in a numeric cell, so a 19-digit identifier written as a number loses its last few — silently, with the file looking perfectly normal. Text alignment is the visible sign that the digits are intact.

Is this a real Excel file or a renamed CSV?

A real one. It is an Office Open XML workbook, the same format Excel itself writes, so it opens with no import dialog and no "the file format does not match the extension" warning. If you would rather have a CSV, JSON to CSV is next door.

Why is the header not bold?

Cell styling is not something the spreadsheet library used here can write, so a bold header would have to be faked — and faking it produces a file that disagrees with itself. Column widths and the filter row are the two things that genuinely survive, and those are the two that make a downloaded sheet usable. Bolding a header takes one click at your end.

How many rows can I convert?

The limit is your browser's memory rather than anything in the format. Tens of thousands of rows is comfortable; hundreds of thousands will get slow and may not finish. The preview is capped so a large paste does not lock up the page — the downloaded file always contains every row regardless of what the preview shows.

What happens to arrays inside my records?

They go into one cell as compact JSON. A spreadsheet cell has no second dimension, and spreading a list into indexed columns would make the column count depend on whichever record was longest. One readable cell beats forty columns that are empty for most rows.

Related tools

Worth reading

  • SheetJS documentation – The spreadsheet library this page uses to write the workbook
  • RFC 4180 – The CSV format, for when a plain text file is the better answer