Free, no signup. Change the text in any PDF.Edit a PDF
XLSX → JSON Converter

Convert XLSX to JSON - Turn an Excel Sheet into JSON Records

Upload an Excel workbook and get a JSON file, one record per row, with numbers, booleans and dates kept apart.

Select your file to convert

or drop your file here

Expert Tips

What the pros know

Pro Tip

Use real TRUE and FALSE cells for yes/no columns. They become JSON true and false, which your code can test directly. A cell that holds the text "true" stays a string.

Common Mistake

Leaving a title or notes above the table. The first row that isn't empty becomes the header, so a title row turns into the keys and the real headings become the first record. Put the headings in the first filled row.

Best For

A list kept by hand in Excel, like products, staff or settings, that an app, a script or an API needs to load. The types come across, so numbers can be added up and booleans tested without cleaning the data first.

Not Recommended

A formatted report rather than a plain table: merged title cells give their value in the top-left cell only, with "" in the rest, and a totals row at the bottom comes out as one more ordinary record. Tidy the sheet into a table first.

FAQ

Frequently Asked Questions

Upload the .xlsx in the box at the top of this page, keep JSON as the output, and download the result. Each row of your sheet becomes one JSON record, with the column headings as keys. If your file is an older .xls, use the XLS to JSON page instead.

Every sheet with data goes into the output, hidden sheets too. With one such sheet you get a plain array; with more than one you get an object keyed by sheet name, so the sheets stay apart. Empty sheets are left out.

No. Each record has one level of keys, taken from the header row, and a heading with a dot in it like address.city stays a single flat key. Our live run on 13 November 2026 confirmed that, so plan to nest the data in your own code if you need to.

As ISO text, because JSON has no date type. A date cell at midnight gives "2024-01-15", a date with a time gives "2024-01-15T09:30:00", and a time-only cell gives "14:05:00". You never get Excel's serial number.

Yes. The converter reads the cell type, so a ZIP code stored as text comes out as the string "01100", while a cell stored as a number comes out as a JSON number. If Excel has already turned 01100 into 1100 in the sheet, the zero is gone before we see it.

20 MB per file, up to 5 files at once. Past that, a sheet can hold up to 1,048,576 rows and 16,384 columns, and all sheets together up to 5,000,000 cells. A 380,000-row workbook converted in 48 seconds on our test server before launch.

Convert XLSX to JSON online free

Turn an Excel sheet into JSON records

This page converts XLSX to JSON. Upload an Excel workbook and you get back a .json file in which every row of your sheet is one record and every column heading is a key. If you searched for "Excel to JSON", this is the page: an XLSX file is what Excel has saved to since 2007, and the older .xls kind has its own page.

A spreadsheet is where people keep lists by hand. A program would rather read JSON, because it has types built in: a number is a number, true is true, and there's no guessing. The converter reads the value and the type of each cell, so the JSON it writes keeps numbers as numbers and text as text, and a date cell comes out as a readable date rather than Excel's serial number.

How to convert XLSX to JSON

  1. Upload your Excel file - Drag the .xlsx into the box at the top of this page, or browse for it. You can add up to 5 files at once.
  2. Check the output - JSON is already picked on this page, so there's nothing to change.
  3. Download your file - Save the .json file when it's ready. The download link works for 30 minutes.

The workbook is uploaded and converted on our servers, not in your browser, so there's nothing to install and no account to make. Our security page explains what happens to the file after that.

How your sheet becomes JSON

The converter has a fixed set of rules for sheets, headers and cell types. Knowing them tells you what the JSON will look like before you open it.

Sheets

  • When only one sheet has data, the output is a plain array of records.
  • When more than one sheet has data, the output is an object keyed by sheet name, like {"Orders": [...], "Customers": [...]}, so the sheets don't get mixed together.
  • Hidden sheets and hidden rows are included, because they still hold data. Empty sheets are left out. A workbook with no data at all is refused with the message This spreadsheet has no data to convert.

The header row

  • The first row that isn't empty is the header, so empty rows above the table are skipped. The keys in each record follow the header order.
  • Header text is trimmed. A number used as a header becomes text, so a column headed 5 gives the key "5".
  • A blank header cell gets the name column_N, where N is the column's position. A heading that appears twice gets _2 on the second one, so no value is lost.
  • A sheet with a header and no rows under it gives [].

Cell types

  • Numbers stay JSON numbers, rounded to the 15 digits Excel itself keeps. That's why a cell holding 0.1+0.2 comes out as 0.3 and not 0.30000000000000004. Whole numbers up to 15 digits are kept exactly, and a very large one like 1e16 is written as 1e+16.
  • TRUE and FALSE cells become true and false. Text that says "true" stays the string "true", because that's what the cell holds.
  • Text stays text, even when it looks like a number.
  • JSON has no date type, so a cell formatted as a date becomes ISO text, not Excel's serial number. A date at midnight gives just the date, "2024-01-15". Any other time gives both, "2024-01-15T09:30:00". A time-only cell gives "14:05:00".
  • A formula cell gives its result, never the formula text. If the workbook was saved without results, or asks to be recalculated on open, LibreOffice recalculates it on our server first.
  • An error cell such as #N/A comes out as that text.
  • In a merged range, the value sits in the top-left cell and the other cells give "", which is also what any empty cell gives. There's never a null.

The file is written with 2-space indentation, as UTF-8 with no BOM. Accented and non-English text is written as it is, not as \u escape codes.

A real example from our tests

On 13 November 2026 we ran a small workbook through our live converter. It's the file our JSON to XLSX converter made from a two-record JSON file, so it has one sheet, named Data, with the id cells stored as numbers and everything else, the ZIP codes included, stored as text:

idnameaddress.citytagszip
1AnaLisbona; b01100
2ZoëZürich8001

About 10 seconds after we started the upload, the JSON came back:

[
  {
    "id": 1,
    "name": "Ana",
    "address.city": "Lisbon",
    "tags": "a; b",
    "zip": "01100"
  },
  {
    "id": 2,
    "name": "Zoë",
    "address.city": "Zürich",
    "tags": "",
    "zip": "8001"
  }
]

The ids are numbers 1 and 2, the ZIP code "01100" kept its zero because the cell was text, and the empty tags cell became "". Notice that the column named address.city stayed a flat key with a dot in it, because the converter doesn't rebuild dotted column names into nested objects, so a round trip from JSON to Excel and back flattens the data. You can download the workbook we uploaded and the JSON it produced to check them yourself.

The backend team's production test on the same day used a richer workbook, with three sheets. The sheet Orders has a blank header cell, the heading qty twice, date-time cells, and a total column of formulas saved without their results:

orderIddateqtyqtytotal
A-10012026-11-11 00:00gift23=D2*12.5
A-10022026-11-12 14:3051=D3*1

A second sheet, Customers, holds three columns (name, city, since) with plain dates, and a third sheet, Empty, has no cells. The output:

{
  "Orders": [
    {
      "orderId": "A-1001",
      "date": "2026-11-11",
      "column_3": "gift",
      "qty": 2,
      "qty_2": 3,
      "total": 25
    },
    {
      "orderId": "A-1002",
      "date": "2026-11-12T14:30:00",
      "column_3": "",
      "qty": 5,
      "qty_2": 1,
      "total": 5
    }
  ],
  "Customers": [
    {
      "name": "Ana",
      "city": "Lisbon",
      "since": "2020-05-01"
    },
    {
      "name": "Ben",
      "city": "Lagos",
      "since": "2021-08-09"
    }
  ]
}

Orders and Customers each got their own key, and the empty sheet was left out. The blank header became column_3, the second qty became qty_2, midnight dates lost their time part, and the formula =D2*12.5 was recalculated to 25.

Before launch, a bigger workbook of 380,000 rows was run on our test server. The conversion itself took 48 seconds.

Things to know before you convert

  • Only cell values come across, so colours, bold and column widths are not in the output, and a column you expect to be all numbers can hold a string when one of its cells is an error like #N/A.
  • Numbers of 16 or more digits lose precision in Excel itself, which keeps 15 significant digits. Store a long ID as text in the sheet if every digit matters, and it'll come through as a string.
  • A CSV file renamed to .xlsx is read as a CSV. A CSV has no cell types, so in that case every value stays a string, numbers included. If that's your file, CSV to JSON is the right page for it.

Limits, and files that won't convert

  • Each workbook can be up to 20 MB. The upload box takes bigger files, but the converter stops anything over 20 MB with the message This file is larger than 20 MB. Try splitting it into smaller files. A 0-byte file gets This file is empty.
  • A password-protected workbook can't be read, and neither can a cut-off or damaged one. Both give We couldn't read this spreadsheet. The file may be damaged or password-protected. Remove the password in Excel first, then upload again.
  • A sheet can have up to 1,048,576 rows and 16,384 columns, which are Excel's own limits, and all sheets together can have up to 5,000,000 cells with data in them. A workbook over any of these gets a message naming the limit it hit.
  • The converter reads at most 50,000,000 cells, empty ones included, and an .xlsx that unpacks to more than 1 GB is refused. Both messages say the spreadsheet is too large and ask you to split it.
  • Reading has a time limit of 90 seconds, or 180 seconds when LibreOffice has to recalculate the workbook first, and the whole conversion has 960 seconds. The JSON itself can't be larger than 200 MB.

Last updated: 13 November 2026 · ChangeMyFile

What changed: New page, added when JSON support launched.

Tested: 13 November 2026, on our live converter: a one-sheet workbook with id, name, address.city, tags and zip columns became the JSON shown above in about 10 seconds. The ids came back as numbers, the ZIP code as text with its leading zero, the empty cell as "", and the dotted column name stayed a flat key.

RelatedAlso convert to JSON from