Excel to JSON Converter
Convert Excel (.xlsx) files to JSON instantly in your browser. Your file never leaves your device.
100% private
Your files are processed locally and never uploaded to our servers.
Convert Excel (.xlsx) files to JSON instantly in your browser. Your file never leaves your device.
100% private
Your files are processed locally and never uploaded to our servers.
This Excel to JSON converter turns one sheet or every sheet of an .xlsx workbook into JSON inside your browser, using the header row as keys. Numbers and booleans stay JSON types, and dates come out as ISO 8601 strings. The usual case: someone in operations keeps a 312-row store list in Excel, and the developer who needs it as stores.json for the website's locator map has to get it out without retyping anything.
In Array of objects mode, a sheet with the headers name, amount, joined, active and notes comes out like this:
[
{
"name": "Ann",
"amount": 1234.5,
"joined": "2026-03-04",
"active": true,
"notes": null
}
]
Raw mode keeps the header row as the first array, ["name", "amount", "joined", "active", "notes"], followed by one array per data row.
Each cell becomes the JSON type that matches what Excel stored, not what the cell displays.
| In Excel | In the JSON |
|---|---|
| $1,234.50 (currency format) | 1234.5 |
| 12.5% | 0.125 |
=0.1+0.2 | 0.3, not 0.30000000000000004 |
| TRUE | true |
| A date | "2026-03-04" |
| A date with a time | "2026-03-04T14:30:00" |
| A time on its own | "14:30:00" |
| An empty cell | null |
| A formula | Its last calculated result |
| A hyperlink | Its display text, not the URL |
| Rich text | The plain text |
| An error such as #N/A | The string "#N/A" |
The floating-point cleanup rounds numbers to Excel's own 15 significant digits, which strips the binary leftovers that turn 0.3 into 0.30000000000000004.
Watch the error row. A "#N/A" string sitting in a column of numbers will break code that expects a number. Wrap lookups in IFERROR before converting if the receiving system can't handle it.
Blank rows are skipped. Every object carries every key, with null where a row has no value, so row 1 and row 312 have the same shape. In Raw mode every array is padded to the same length for the same reason.
Excel has no date type on disk. A date is a day count formatted to look like a date: 4 March 2026 is stored as 46085. A converter that reads the stored value and ignores the format hands you 46085, and whoever reads the JSON has to know to add it to 30 December 1899. Python's pandas has its own version of the problem: to_json still defaults to epoch milliseconds, 1772582400000 for the same day, unless you pass date_format="iso".
This converter detects date cells and writes ISO 8601 strings instead. A date becomes 2026-03-04, a date with a time becomes 2026-03-04T14:30:00, and a time on its own becomes 14:30:00. The date and date-time forms parse directly with Date.parse() in JavaScript or datetime.fromisoformat() in Python.
The same stored-value rule explains the currency and percentage rows in the table above. $1,234.50 is the number 1234.5 wearing a format, so that's what the JSON gets. If an API needs the formatted string, build it in a helper column with TEXT, for example =TEXT(B2,"$#,##0.00"), and convert that column instead.
Header rows in real workbooks are messy, and a naive conversion loses data without saying so. A hand-written loop that sets row[header] = value over a plain range is the classic case: two columns headed "amount" share one key, so the second overwrites the first on every row, and a blank header produces an empty-string key.
This converter handles each case so no column disappears:
"Column B"."amount", then "amount_2". The match ignores case, so Amount and amount count as duplicates."Column F" and so on.null, and a header merged across two columns leaves the second one blank, so it gets a Column key.Keys are the header text as written, trimmed of surrounding spaces. "Order ID" stays "Order ID", with the space, so JavaScript has to read it as row["Order ID"]. If your code expects orderId, rename the headers in Excel before converting.
Excel has no built-in JSON export: File > Save As has no JSON option.
The closest route is Power Query. Select your data, go to Data > From Table/Range, then open Home > Advanced Editor and replace the query with:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content], // Table1 is your table's name
Json = Text.FromBinary(Json.FromValue(Source)) // table to array-of-objects text
in
Json
Close & Load puts the JSON text in a worksheet cell, which you copy into a text editor and save as .json. Microsoft documents that Json.FromValue writes tables as arrays of objects and dates as ISO 8601 text. The catch is size: a cell holds at most 32,767 characters, so only a small table fits.
Office Scripts is the other route: Automate > New Script > Create in Code Editor. Microsoft's own "Output Excel data as JSON" sample reads the first table on a sheet with getTexts(), so every value comes back as display text. A capacity of 10 arrives as "10", a string. The result goes to the script console or a Power Automate flow, not to a file, and the Automate tab isn't available on every Microsoft 365 plan.
Use one of these when the JSON has to refresh on a schedule, or when you need nested objects or renamed keys built in. For a one-off export, the converter above is faster.
Going the other way, JSON to Excel turns an API response back into a workbook. If the receiving system wants CSV rather than JSON, use Excel to CSV.
Not from Save As: Excel 365 has no JSON file type in its save list. You can build JSON with Power Query's Json.FromValue function or with an Office Script, but neither writes a .json file for you. This converter does, from an .xlsx file, in the browser.
Excel stores a date as a day count, so 4 March 2026 is the number 46085 underneath its date format, and many converters export that number. This converter recognizes date cells and writes them as ISO 8601 strings like 2026-03-04. Date-times come out as 2026-03-04T14:30:00 and times on their own as 14:30:00.
Pick All sheets from the sheet list after you drop the workbook, then click Convert. You get one JSON object whose keys are the sheet names and whose values are each sheet's rows. Hidden sheets are included, so delete any you don't want in the output first.
Store the codes as text in Excel before converting. A ZIP code typed as 02134 into a cell with a 00000 number format is really the number 2134, and that stored number is what gets exported. Text cells export exactly as typed.
No. The conversion runs in your browser with JavaScript, and the workbook never leaves your computer.
Yes. There is no daily limit and no sign-up, and files can be up to 50 MB.
No, the output is always pretty-printed with 2-space indentation. To minify it, parse the file and stringify it again without an indent argument in your own code, or run it through any JSON minifier. The data is identical either way.