DevKitHub

JSON & Data

Excel to JSON Converter — XLSX to JSON in Your Browser

Choose an .xlsx file to get its rows as JSON, one object per row keyed by the header row. The workbook is unpacked by JavaScript in this page, so it never leaves your device.

or drop one here. The workbook is unzipped and read in your browser; it is never uploaded.

0 lines

Reads .xlsx, .xlsm and .xltx. Formulas give the result Excel last saved, and numbers are written to the 15 significant digits Excel shows. Going the other way? JSON to Excel writes a workbook from the same shape of JSON.

This tool runs entirely in your browser. Your input is never uploaded, stored or logged.

How it works

An .xlsx file is a ZIP archive of XML parts, and this page unpacks it itself: it finds the central directory at the end of the file, inflates each part with its own DEFLATE decoder, and checks each one against its CRC-32, so a download that was cut short is reported instead of half-read. The workbook part lists the sheets in order and marks the hidden ones. A worksheet part lists only the cells that hold something, each with its reference, so gaps cost nothing and the table starts at the first cell with a value. Text usually lives in a shared string table the cells point into, and rich text is joined back into its plain words. A formula cell carries the result Excel saved when it last calculated, and that result is what you get — so a file written by a program that never calculates, such as Python’s openpyxl, has formulas with no value at all, and the converter says so rather than guessing.

Dates are the hard part, because an .xlsx has no date type. A date is a number, the days since 1 January 1900, shown through a date number format, so each cell’s style is followed to its format code: built-in formats 14 to 22 and 45 to 47 are dates and times, and a custom code is one when it has d, m, y, h or s outside quoted text and brackets. The count has a famous flaw. Lotus 1-2-3 treated 1900 as a leap year, Excel kept serial 60 as 29 February 1900 for compatibility, and every serial after it is one more than the real number of days. Workbooks from older Mac Excel count from 1904 instead, marked by a flag in the workbook, and both systems are handled. ISO output is 2026-09-29 for a date, 2026-09-29T13:45:00 for a date and time, 13:45:00 for a time of day and 36:00:00 for elapsed time; the serial numbers, or the text Excel displays, are the alternatives.

With the first row as keys, each later row becomes an object, written in column order: a JavaScript object would move a key such as 2024 in front of the others, so the JSON text is built directly. A blank header takes its column letter, a repeated one gets a suffix, and wholly empty rows are skipped. Numbers are written to the 15 significant digits Excel keeps and shows, so a calculated 0.30000000000000004 arrives as 0.3. A merged range holds its value in the top-left cell only; Fill merged cells copies it across. Legacy .xls, .xlsb, .ods and password-protected workbooks are recognised from their bytes and refused with a message naming what they are.

Common problems

Every example below is run against this tool in our test suite, so what it says here is what the tool actually does.

This is a legacy Excel 97–2003 workbook (.xls), a binary OLE2 file rather than the ZIP of XML an .xlsx is

0M8R4KGxGuFXAG8AcgBrAGIAbwBvAGsA
Why:
A workbook saved by Excel 2003 or earlier is a binary compound file that begins D0 CF 11 E0 (the input above is such a start, in Base64), not a ZIP. Renaming it to .xlsx changes nothing inside.
Fix:
Open it in Excel and use File > Save As > Excel Workbook (.xlsx), then convert that file.

This is a web page (HTML) — many web apps export a table this way under an .xls name

PGh0bWw+PGJvZHk+PHRhYmxlPjx0cj48dGQ+MDA3PC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PjwvaHRtbD4=
Why:
Reporting and banking systems often send an HTML table named report.xls, which Excel opens after a warning about the format and extension not matching. It has no sheets, types or dates, only markup.
Fix:
Open it in Excel and save it as Excel Workbook (.xlsx), or copy the table into a new workbook.

Formula cells come out as null.

Why:
An .xlsx stores a formula and, separately, the result Excel last calculated. Files written by libraries that do not calculate, such as openpyxl, have the formula and no result, and the converter reports how many.
Fix:
Open the file in Excel (or LibreOffice) and save it once, so the results are stored, then convert it again.

A date column comes out as numbers like 46294.

Why:
The workbook stores every date as a serial number, and only its number format says it is a date. A column formatted as General or Number holds nothing that marks it as a date.
Fix:
Format the column as a date in Excel and save, or convert the serials yourself: 46294 is 2026-09-29, counting from 1900-01-01 as serial 1.

Most cells of a merged block are null.

Why:
Excel keeps a merged range’s value in its top-left cell and leaves the others empty, however the sheet looks on screen.
Fix:
Turn on Fill merged cells to copy the value into every cell of each merged range.

Frequently asked questions

Is my spreadsheet uploaded?
No. The file is read with the browser’s File API and unpacked by JavaScript in this page, including the ZIP decompression; nothing is sent to a server.
How do I convert every sheet at once?
Turn on All sheets. The result is one JSON object whose keys are the sheet names, in workbook order, and whose values are each sheet’s rows. Hidden sheets are included and named in the notes; chart sheets have no cells and are left out.
Why is 29 February 1900 in my JSON?
Excel counts a day that never existed. Serial 60 is 29 February 1900, kept for compatibility with Lotus 1-2-3, so a cell holding 60 as a date shows that date in Excel and is written the same way here, with a warning, because most date parsers reject it.
Can it read .xls, .xlsb or .ods files?
No. Those are different formats: .xls and .xlsb are binary, and .ods is OpenDocument. Each is recognised and refused with a message saying which it is. Save the file as .xlsx in Excel, LibreOffice or Google Sheets first.

Last updated