An Excel to JSON converter turns the rows of a spreadsheet into data that code, APIs and databases can read directly. Teams use one to seed a database or a mock API from a product list, to turn a translation or configuration table that lives in a spreadsheet into a JSON file, to import business data into tools that accept only JSON, and to feed price or product sheets to a web app. This page reads .xlsx, .xlsm, .xls, .ods and .csv files in your browser, so your spreadsheet never leaves your browser. You choose the sheet and the header row, and how dates, formulas, empty cells and merged cells are written.
How do I convert an Excel file to JSON?
Choose your Excel file or drop it on the upload box, or load the sample workbook. The sheets appear in a list, the first visible sheet is converted straight away, and the JSON shows on the right. Change any option to update it, then copy the result, download it as a .json file, or send it onward.
How to use this Excel to JSON converter
- Choose a file: use the upload box or drag it on. The sheet list shows each sheet's rows, columns and whether it is hidden.
- Pick a sheet: choose one sheet, or All sheets to get an object keyed by sheet name.
- Set the header and range: First row is header gives one object per row; off gives arrays. Type a Range such as A1:D50 to read part of a sheet.
- Choose how cells are written: empty cells, dates, formulas and merged cells each have an option.
- Copy, Download or Send: copy the JSON, save a .json file, or send it to another tool.
The JSON Formatter can already export your JSON as an Excel file, and this page goes the other way. Afterwards, the JSON Sorter orders keys, the JSON Schema Validator checks the rows, and the Mock Data Generator builds more test records. For a CSV file, the CSV to JSON converter adds type inference, and our guide to converting JSON to CSV, XML and YAML covers the other formats.
Is my Excel file uploaded anywhere?
No. Your spreadsheet never leaves your browser. It is read and converted by a script running on this page, using a copy of the open-source SheetJS library served from this site, and nothing you choose is uploaded. The page uses Google Analytics for anonymous usage counts that never include your data, sheet names or file names.
The spreadsheet library loads only after you choose a file or the sample. Macros in .xlsm files are never run, and links to other workbooks are never fetched.
How are dates, formulas and empty cells handled?
Dates become ISO text such as 2026-10-11 by default, or Excel serial numbers if you choose. Formulas give the result Excel saved in the file, or the formula text if you prefer. Empty cells are left out of each row by default, or written as null or as an empty string.
Numbers, booleans and text keep the type the cell has in the workbook, with no guessing from how a value looks. Text such as 007 stays the string 007.
How do I convert several sheets at once?
Pick All sheets in the sheet list. The output becomes an object whose keys are the sheet names and whose values are arrays of rows. Hidden sheets are skipped unless you tick Include hidden sheets, and every sheet follows the same header, range and cell options you set.
A sheet named __proto__ or constructor stays an ordinary key and cannot change how other objects behave.
What does the output look like for a real workbook?
The sample workbook has two sheets. Here is the first, Products, and the exact JSON this tool writes for it with the default options. The output was produced by running this page's own conversion code on the sample, and a test re-checks it.
Products sheet, as Excel shows it (the Region cell is merged across two rows)| sku | name | price | in_stock | added | qty | stock_value | supplier | region |
|---|
| 007 | Desk lamp | 24.5 | TRUE | 2026-09-14 | 10 | 245 | Northwind | North |
| 008 | Notebook | 3.2 | TRUE | 2026-09-15 09:30 | 200 | 640 | |
| 009 | Standing desk | 389 | FALSE | 2026-09-16 | 0 | 0 | Contoso | South |
JSON for the Products sheet
[
{
"sku": "007",
"name": "Desk lamp",
"price": 24.5,
"in_stock": true,
"added": "2026-09-14",
"qty": 10,
"stock_value": 245,
"supplier": "Northwind",
"region": "North"
},
{
"sku": "008",
"name": "Notebook",
"price": 3.2,
"in_stock": true,
"added": "2026-09-15T09:30:00",
"qty": 200,
"stock_value": 640
},
{
"sku": "009",
"name": "Standing desk",
"price": 389,
"in_stock": false,
"added": "2026-09-16",
"qty": 0,
"stock_value": 0,
"supplier": "Contoso",
"region": "South"
}
]
The sku column was typed as text, so 007 keeps its zeros. The added column holds real dates, written as ISO text, with the time only on the row that has one. The stock_value column is a formula, and the saved result comes out. The supplier cell on the second row is empty, so the key is left out. The Region cell is merged over two rows and holds its value only in the top-left cell, so the second row gets no region unless you choose to repeat merged values.
Excel to JSON gotchas
Dates are numbers underneath
Excel stores a date as a count of days and shows it through a number format. This converter reads the format to spot dates, including workbooks that use the 1904 date system, and writes 2026-09-14, or 2026-09-15T09:30:00 when the cell has a time. There is no time zone, because Excel has none. A time on its own becomes 09:30:00, and a duration such as 36:15 stays a number. Choose Excel serial number to keep the raw value.
Formulas return cached values
A formula cell holds the result Excel saved the last time the file was calculated, and that is what you get. A formula that has no saved result, for example from a file written by a script, is left empty and a warning says how many. Cells with an error such as #DIV/0! are written as that text. Choose Formula text to get the formula itself, with a leading equals sign.
Long numeric IDs and 15 digits
Excel keeps every number as a 64-bit float with 15 significant digits. A 20-digit number typed into a number cell is already rounded inside the file and comes out as 12345678901234567000. An ID stored as text keeps all its digits, so format ID columns as Text in Excel before you type or paste into them.
Leading zeros
A text cell holding 007 stays "007". A number cell that merely displays 007 through a number format such as 000 holds the number 7, and 7 is what comes out, because the stored value is the only thing a file keeps.
Merged cells
Only the top-left cell of a merge holds a value, so the other rows look empty. Choose Repeat the value to copy it across the merge instead. A merge that is too big to repeat keeps its value in the top-left cell and a notice says so.
Hidden sheets
Hidden sheets appear in the sheet list, marked Hidden, but All sheets leaves them out unless you tick Include hidden sheets.
Duplicate and empty headers
Two columns called name become name and name_2, and an empty header becomes column_N, where N is the column's place in the range. A notice lists every rename, so you can fix the sheet if you prefer.
.xls, .xlsx, .ods and .csv
All of them read the same way in our tests, including the older .xls format. A .csv file has no cell types, so every value stays text. Password-protected workbooks are not supported: the tool says so, and removing the password in Excel fixes it.
What are the limits of this converter?
Files above 50 MB are refused, and so is a sheet that declares more than 1,000,000 rows or 1,000 columns, because a small file can claim a huge empty range; a Range reads just the part you need. Output above about 20 MB stops with a message, and above about 2 MB only a preview is shown while Copy and Download use the full result.