Excel to JSON Converter

Upload an XLSX, XLS or CSV file and get clean JSON. Choose your output shape, pick the sheet, and control how headers are handled. Runs entirely in your browser — nothing is uploaded.

Supports .xlsx, .xls and .csv up to 10 MB. Dates are preserved as ISO strings.

Choose a spreadsheet above to see the JSON output here.

Going the other direction? Convert JSON to Excel →

How to convert Excel to JSON

  1. Click Choose spreadsheet and pick an .xlsx, .xls or .csv file.
  2. If the workbook has several sheets, choose the one you want from the dropdown.
  3. Pick the output shape — array of objects for most uses, array of arrays to keep the raw grid.
  4. Toggle whether the first row is a header, whether to skip empty rows, and whether to pretty print.
  5. Copy the JSON or Download .json.

Nothing is uploaded — the file is parsed in your browser, so this works on confidential exports as well as sample data.

XLSX, XLS and CSV to JSON

All three formats are handled by the same parser. XLSX to JSON is the common case — the modern Excel format, with full multi-sheet support. XLS to JSON works for legacy files from Excel 2003 and earlier. CSV to JSON is treated as a single-sheet workbook, so the same header and output-shape options apply.

Google Sheets to JSON

There is no direct upload from Google Sheets, but the round trip is quick: in Sheets choose File → Download → Microsoft Excel (.xlsx), then upload that file here. If you would rather pull JSON into Sheets, or keep a sheet synced with an API, that is covered in using JSON data in Google Sheets.

Can Excel open JSON files directly?

No — double-clicking a .json file will not open it in Excel, and renaming the extension does not help. Excel needs the data converted into a grid first, either through Power Query or a converter. The five approaches that do work are compared in how to open a JSON file in Excel.

Choosing an output shape

The same spreadsheet can become two quite different JSON documents, and which one you want depends entirely on what reads it next.

Array of objects uses the header row as keys:

[
  { "name": "Alice", "role": "admin", "active": "true" },
  { "name": "Bob", "role": "editor", "active": "false" }
]

This is what almost every API, database importer and JavaScript application expects. Choose it unless you have a specific reason not to.

Array of arrays keeps the raw grid, header row included:

[
  ["name", "role", "active"],
  ["Alice", "admin", "true"],
  ["Bob", "editor", "false"]
]

Useful when column order matters, when your sheet has no header row, or when you are feeding a charting library that wants positional data.

Why every value comes out as a string

You will notice numbers and booleans appear quoted. This is deliberate. Excel stores a surprising amount of ambiguity in cells — a value that displays as 00721 may be text, a number formatted with leading zeros, or a custom format. Converting aggressively would silently destroy product codes, postcodes and account numbers.

Reading cells as formatted text preserves exactly what you see in the spreadsheet. If you need real numbers, cast them where you consume the data — that way you decide which columns are genuinely numeric:

const rows = data.map(r => ({
  ...r,
  qty: Number(r.qty),
  active: r.active === "true"
}));

Things that trip people up

Merged cells

A merged cell holds its value in the top-left position only; the other cells in the merge are genuinely empty. In the JSON you get one populated field and several nulls. Unmerge before exporting if you need the value repeated across rows.

Formulas

You get the calculated result, not the formula, which is almost always what you want. If a formula has never been recalculated — common in files generated by scripts rather than by Excel — the cached value may be stale or missing. Open and re-save the file in Excel to refresh it.

Duplicate column headers

Two columns both called Name cannot become two keys in the same object — JSON objects require unique keys, so one silently wins. Rename the columns in your spreadsheet, or use the array-of-arrays output which preserves every column.

Dates

Excel stores dates as numbers counting from 1900. Left alone they would export as values like 45231. This converter reads them as dates and emits readable strings instead.

Hidden rows and columns

Hidden data is still data — it appears in the output. If a sheet has filters applied, the rows hidden by the filter are included too. Delete rather than hide anything you do not want exported.

Doing this in code instead

For a repeatable job, Python is three lines:

import pandas as pd

df = pd.read_excel("data.xlsx", dtype=str)
df.to_json("data.json", orient="records", indent=2, force_ascii=False)

dtype=str is the equivalent of the string-preserving behaviour described above, and force_ascii=False keeps non-English characters readable. The full walkthrough is in how to convert Excel to JSON.

Frequently asked questions

Is my spreadsheet uploaded anywhere?

No. The file is read with the browser's File API and parsed in memory using SheetJS, which is bundled with this page. No network request carries your data. See our privacy policy.

Can it handle multiple sheets?

Every sheet in the workbook appears in the dropdown, and you convert one at a time. To combine several into one document, convert each and merge the arrays.

What about very large spreadsheets?

The limit here is 10 MB. Beyond that, browser memory becomes the constraint — see working with large JSON files for streaming approaches.

Does it work with Google Sheets?

Yes — in Google Sheets choose File → Download → Microsoft Excel (.xlsx), then upload the result here. For pulling JSON into Sheets in the first place, see using JSON data in Google Sheets.