Excel to JSON

Convert Excel files to JSON

Supports workbooks up to 150,000 rows across all sheets (files up to 90 MB). The conversion runs in your browser; the Cancel button stops it.

Click or drop an Excel, ODS, or CSV file hereChoose an Excel, ODS, or CSV file

About Excel to JSON

Excel to JSON reads an .xlsx, .xls, or .ods workbook, or a .csv file, and writes one JSON object whose keys are the sheet names, hidden sheets included. Each sheet becomes an array of row objects whose keys come from the sheet's first row, and every row has the same keys: an empty cell gives null. Date cells become ISO 8601 text, a number typed in a Text cell (a ZIP code such as 02134) stays a string, formulas give their saved result, and a formula error such as #N/A gives null. Emoji are kept, including in files written by Python (pandas, openpyxl). A .csv file is read as plain text, so every value stays a string and its sheet is called Sheet1. Conversion starts when you choose the file, in your browser.

Example

A workbook with two sheets: Orders (a date cell, a date-and-time cell, ZIP codes in Text cells, a percentage, a #N/A formula error, two columns headed Note) and Rates (year headers). This is the JSON the tool returns for it:

Workbook

Sheet Orders:
Order | Customer | Ordered | Zip | Discount | Note | Note
1001 | Ann Lee | 2024-01-15 (date cell) | 02134 (Text cell) | 10% | (empty) | gift
1002 | Bob Ruiz | 2024-02-29 13:45 (date cell) | 94110 (Text cell) | =VLOOKUP(…) → #N/A | rush | (empty)

Sheet Rates:
Region | 2023 | 2024
West | 1.25 | 1.5

JSON

{
  "Orders": [
    {
      "Order": 1001,
      "Customer": "Ann Lee",
      "Ordered": "2024-01-15",
      "Zip": "02134",
      "Discount": 0.1,
      "Note": null,
      "Note_1": "gift"
    },
    {
      "Order": 1002,
      "Customer": "Bob Ruiz",
      "Ordered": "2024-02-29T13:45:00",
      "Zip": "94110",
      "Discount": null,
      "Note": "rush",
      "Note_1": null
    }
  ],
  "Rates": [
    {
      "2023": 1.25,
      "2024": 1.5,
      "Region": "West"
    }
  ]
}

How to convert Excel to JSON

  1. 1Choose an .xlsx, .xls, .ods, or .csv file in the upload area; the conversion starts on its own.
  2. 2If the workbook has several sheets, their names appear while it is read, and "Cancel" stops the work.
  3. 3Click "Download" to save converted.json, indented with two spaces.

Formats and limits

Input
XLSX, XLS, ODS, or CSV file
Output
JSON object with one array of row objects per sheet
On a computer
up to 90 MB and 150,000 rows across all sheets
On phones and tablets
up to 30 MB and 50,000 rows across all sheets

Common uses

Seeding a database or a mock API
A developer receives a product list as a workbook and turns it into converted.json, one array per sheet, ready for a seed script, with every date already written as ISO 8601 text.
Feeding a web page from a spreadsheet
A team keeps store hours or a price list in a shared workbook; the JSON gives a static site one object per row, with the same keys on every row even where a cell was left blank.
Checking an export before an import
Before importing a CRM or online store export, converting it shows the exact keys and values a script will receive: duplicate headers renamed name_1, empty cells as null, and dates as text instead of serial numbers.

Which tool to use

  • Excel to CSV: one CSV file per sheet, zipped when there are several, with a choice of separator; percentages and dollar amounts are written as Excel shows them, where this tool writes the stored number.
  • CSV to JSON: for a .csv file you want typed: columns made only of numbers become JSON numbers, and it can also write arrays of arrays or JSON Lines. Here a .csv is read as text and every value stays a string.
  • JSON to CSV: the way back, from JSON to a CSV file with a header row, nested objects flattened to dotted column names.

Where your file is processed

Your spreadsheet is read in your browser with the SheetJS library and is not uploaded. What can reach us is an error report: the error text after file names and quoted text are removed, the tool name, and the name and version of your browser.

Frequently asked questions

Are empty cells included?

Yes, as null. Every row of a sheet has the same keys, so code that reads a Note property finds null instead of a missing key. Rows that are completely empty are skipped.

Are dates converted to text?

Yes, to ISO 8601: 2024-01-15, or 2024-02-29T13:45:00 when the cell has a time, with no time zone added. Without this step an Excel date would come out as a serial number such as 45306.

Can I choose which sheets to convert?

No. Every sheet is converted, hidden ones included, each under its own name in the JSON. Delete the arrays you do not need afterward, or save the sheets you want as a separate workbook first.

Are duplicate column headers kept?

Yes. When two columns share a header such as name, the second one becomes name_1 in each row object, so no value is overwritten.

Does the header row have to be the first row?

Yes. The first row of the sheet's used area gives the keys, so a title such as Sales report 2024 typed above the table becomes a key and the real headers turn into a data row. Delete the rows above the headers before converting.

What happens to a column whose header cell is empty?

It is kept under the key __EMPTY, then __EMPTY_1 and __EMPTY_2 for the next ones, so no value is lost. Type a header in that cell first if your code needs a meaningful name.

Are percentages and currency amounts kept as displayed?

No, the stored number is written: a cell showing 50% gives 0.5, and one showing $9.99 gives 9.99. TRUE and FALSE cells become true and false, and a number typed in a Text cell, such as 007, stays a string.

What happens to merged cells?

The value goes to the first row of the merged area, and the other rows it covers get null. Unmerge the cells and fill them down in Excel first if every row needs the value.

What do formula errors such as #N/A or #DIV/0! give?

null, the same as an empty cell, so the error text is not in the JSON. A formula saved without its result, as in a file written by Python's openpyxl and not yet opened and saved in Excel, gives null too. Search the sheet for # before converting if an error must not go unnoticed.

Why do columns headed 2023 and 2024 come first in each object?

JavaScript lists keys that are whole numbers first, in ascending order, whatever the column order: Region | 2023 | 2024 is written "2023", "2024", "Region". The values stay under the right keys; only their order in the file changes. Rename such headers, for example FY2024, if a reader depends on key order.

Does a header such as user.name make nested objects?

No. Each key is the header text exactly as typed, so user.name and user.age are two flat keys of the same row object. Spaces are kept too: a header typed as "Name " with a trailing space gives the key "Name ", which code looking for Name will not find.

Are hidden sheets, rows, and columns included?

Yes. Hidden sheets, hidden rows, hidden columns, and rows hidden by a filter are converted like visible ones. Delete them in the workbook first if they must not be in the JSON.

What does a sheet with only a header row give?

An empty array, like an empty sheet: with no data row under them, the header names are not written anywhere in the JSON.

Can I get minified JSON or an array of arrays?

Not from this page: the file is always one object of sheet arrays, indented with two spaces. Paste it into JSON Minifier to remove the spaces. For an array of arrays or JSON Lines, save the sheet with Excel to CSV and convert that file with CSV to JSON.

How big can the file be?

90 MB and 150,000 rows, counting all sheets, on a computer; 30 MB and 50,000 rows on phones and tablets. Split a larger workbook into several files and convert them one by one.

Tips and tricks

  • ✓Before converting, look at the header row: a trailing space or a repeated name changes the keys your code will see, and a year used as a header moves that key to the front.
  • ✓For CSV files instead of JSON, one per sheet, use Excel to CSV.