JSON to Excel Converter

Convert JSON to an Excel .xlsx file in your browser: nested keys, typed cells and one sheet per key.

Or drag and drop a file onto this box. Files up to 100 MB.
Options

One sheet per key applies when the top level is an object whose values are all arrays.

Numbers stay numbers. Numbers with more than 15 significant digits, and every string, including ones with leading zeros, are written as text.

Excel preview

    A JSON to Excel converter writes JSON data into a real .xlsx workbook, so the result opens in Excel, LibreOffice or Google Sheets without a text import step. This page flattens nested objects into dotted column names, keeps numbers as numbers and text as text, and can write one sheet per top-level key. You set the sheet name, whether a header row is written, and how arrays are handled. The workbook is built in a background worker with the open-source SheetJS library served from this site, so large files do not freeze the page.

    How do I convert JSON to an Excel file?

    Put your JSON in the box by pasting it, picking a .json file or loading the sample. The preview lists the first 100 rows of each sheet with counts of sheets, rows and columns. Adjust the options, then press Download .xlsx to save the workbook.

    How to use this JSON to Excel converter

    • Add your data: paste it, drop a file on the upload box, or arrive from the JSON Formatter with a document it passed along. If the JSON is invalid you get the line and column to fix.
    • Name the sheet: the Sheet name option sets the name of the single sheet. If your JSON is an object of arrays, One sheet per key uses each key as a sheet name instead.
    • Handle arrays: one cell with the values joined, one column per position, or the array as JSON text.
    • Header row: on by default; switch it off to write only the data rows.
    • Download: the .xlsx file is written when you press the button, from every row, not only the preview.

    If a plain text file suits you better, the JSON to CSV converter offers delimiters, a byte order mark and quoting rules. To read a workbook back into JSON, use the Excel to JSON converter.

    How is each JSON value stored in the workbook?

    Each JSON value gets the cell type that matches it. Numbers become number cells, true and false become boolean cells, and every string becomes a text cell. A key that is missing from a row, or a null, leaves the cell empty.

    How each kind of JSON value is stored
    In the JSONIn the workbook
    A number with up to 15 significant digitsA number cell, so you can sum, sort and format it
    A number with more than 15 significant digitsA text cell holding the exact digits, with a warning, because Excel keeps only 15 digits of a number
    A string, including "007" or "1E5"A text cell, so the leading zeros and the letters stay exactly as written
    A string that starts with =, +, - or @A text cell. It is stored as text and never as a formula
    true and falseA boolean cell, shown as TRUE or FALSE
    null or a missing keyAn empty cell
    A nested objectFlattened into columns named with dots, such as address.city
    An arrayJoined into one cell, expanded to indexed columns, or kept as JSON text, as you choose
    A string longer than 32,767 charactersCut to Excel's cell limit, with a warning

    A date in JSON is only a string, so 2026-10-18 is stored as text. Because every string is stored as text and never as a formula, this converter has no formula-injection switch like the CSV page does.

    How do I write one sheet for each key?

    When the top level of your JSON is an object and every value is an array, each key becomes its own sheet, named after the key. The option is on by default and only applies to data of that shape, otherwise one sheet is written.

    Here is an object with two arrays. The converter writes a customers sheet and an orders sheet.

    JSON input

    {
      "customers": [
        {
          "id": 1,
          "name": "Ada Lovelace",
          "zip": "02134",
          "active": true
        },
        {
          "id": 2,
          "name": "Grace Hopper",
          "zip": "10001",
          "active": false
        }
      ],
      "orders": [
        {
          "order": "A-1001",
          "customer": 1,
          "total": 24.5
        },
        {
          "order": "A-1002",
          "customer": 2,
          "total": 3.2,
          "account": 12345678901234567890
        }
      ]
    }
    Sheet "customers", with the cell type of each value
    idnamezipactive
    1 (number)Ada Lovelace (text)02134 (text)true (boolean)
    2 (number)Grace Hopper (text)10001 (text)false (boolean)
    Sheet "orders", with the cell type of each value
    ordercustomertotalaccount
    A-1001 (text)1 (number)24.5 (number)
    A-1002 (text)2 (number)3.2 (number)12345678901234567000 (text)

    The orders sheet has an account column because one row has that key, and the other row leaves it empty. The zip values 02134 and 10001 are text, the ids and totals are numbers, active is a boolean, and the 20-digit account number is written as text so every digit survives.

    More worked examples

    1. A flat array of objects with a nested object and an array

    One array of objects gives one sheet, named Sheet1 unless you change it. The nested address becomes address.city, and the tags array is joined, so the second row, whose tags array is empty, gets an empty cell. These are the cells the workbook holds:

    JSON input

    [
      {
        "id": 1,
        "name": "Ada",
        "address": {
          "city": "London"
        },
        "tags": [
          "math",
          "poetry"
        ]
      },
      {
        "id": 2,
        "name": "Grace",
        "address": {
          "city": "New York"
        },
        "tags": []
      }
    ]
    Sheet "Sheet1", with the cell type of each value
    idnameaddress.citytags
    1 (number)Ada (text)London (text)math; poetry (text)
    2 (number)Grace (text)New York (text)

    2. Expanding arrays into columns

    Choose Indexed columns when a spreadsheet user wants each array element in its own cell. The same input then gets the columns tags.0 and tags.1, and the second row has none of them. With Keep as a JSON string the array is written as the text ["math","poetry"].

    3. An array of arrays

    An array such as [["name","score"],["Ada",91]] keeps its rows as they are. Turn the header row off if the first inner array already holds the column names, because the header row option adds column_1, column_2 and so on.

    Sheet names, widths and Excel limits

    A sheet name can have at most 31 characters and cannot contain the characters [ ] : * ? / \ or begin or end with an apostrophe. The converter replaces those characters with a space, cuts long names, and adds a number such as (2) to a name that repeats, ignoring case, so two keys called Orders and orders do not clash. A blank name becomes Sheet1. A notice tells you when a name was changed.

    Column widths are set automatically from the longest value among the first 1,000 rows, between 8 and 60 characters. The cells are plain: the converter writes values, not colours, fonts or formulas. An Excel sheet holds at most 1,048,576 rows and 16,384 columns, and this tool stops with a message if your data needs more rows than that, or more than 255 sheets. For data that large, the JSON to CSV converter has no row limit.

    Common problems and how to fix them

    An ID shows as 1.23457E+19

    Excel displays a long number in scientific notation and keeps only 15 digits of it. Here a number with more than 15 significant digits is written as text with its exact digits, so it shows in full, and a warning tells you how many there were. If you need a real number, shorten it in the source.

    Leading zeros are lost

    Zip codes and product codes are usually strings in JSON, and every string is written as a text cell, so 02134 stays 02134. A value that is a JSON number, such as 2134, was already a number before it reached this page.

    Dates look like text

    A date string is stored as text because JSON does not mark it as a date. In Excel, select the column and use Data, Text to Columns, or the DATEVALUE function, to turn it into real dates.

    Too many columns

    Indexed columns create one column for every array position, which can multiply fast. If the preview shows hundreds of columns, switch to Join or Keep as a JSON string.

    Excel or CSV: which one should I export?

    An .xlsx file keeps the type of every cell and can hold several sheets, so it suits data that a person will open and read. A CSV is smaller and easier for programs and version control to read, but Excel must guess its encoding and column types when it opens the file. The JSON to CSV converter uses the same flattening rules, so you can try both on the same data.

    What are the limits of this converter?

    Input can be as large as 100 MB. Anything over roughly 1.5 MB stays out of the text box and is read from the file by the worker. The worker enforces a time limit that grows with the size of the input, reports progress and can be stopped with Cancel. Only one sheet is previewed at a time, with its first 100 rows and at most 60 columns, but the download holds all of the data. The SheetJS library is requested only when you press Download .xlsx.

    Related tools

    Frequently Asked Questions

    How do I convert JSON to an Excel file?

    Paste your JSON, choose a .json file or load the sample. The preview shows the first 100 rows of each sheet. Set the sheet name and the array option if you need them, then press Download .xlsx to save a workbook that opens in Excel, LibreOffice or Google Sheets.

    How are numbers, long IDs and leading zeros stored?

    Numbers with up to 15 significant digits are written as number cells. A number with more digits is written as text with its exact digits, because Excel keeps only 15, and every JSON string is written as text, so 007 stays 007.

    Can I get one sheet for each key of my JSON object?

    Yes. When the top level is an object and every value is an array, tick One sheet per key and each key becomes a sheet named after it. Sheet names are cut to 31 characters, characters Excel forbids are replaced with a space, and repeats get a number.

    Is my JSON uploaded anywhere?

    No. The JSON is converted by a script running in your browser tab, and the converter does not send it anywhere. The spreadsheet library is loaded from this site only when you press Download .xlsx. The page uses Google Analytics for anonymous usage counts, which never include your JSON.

    What are the limits of an Excel sheet?

    A sheet holds at most 1,048,576 rows and 16,384 columns, a sheet name is at most 31 characters, and a cell holds at most 32,767 characters. This tool refuses data with more rows than a sheet allows, refuses more than 255 sheets, and cuts longer text with a warning.

    Why choose .xlsx instead of CSV?

    An .xlsx file keeps types, so numbers stay numbers, text stays text, and one JSON object can fill several sheets. A CSV is smaller and easier for programs to read, but Excel has to guess its encoding and column types when it opens it.

    Built and maintained by Deepak Kumar.