Excel to JSON
Excel to JSON reads real .xlsx workbooks (and .csv files) entirely in your browser — unzipping the file, parsing the SpreadsheetML, and emitting typed JSON with numbers as numbers, booleans as booleans, and dates as ISO strings. Pick a worksheet, choose objects or arrays, preview the grid, then copy or download. Nothing is ever uploaded.
Drop an .xlsx or .csv file here, or click to browse
or drop anywhere on this page · Choose a file · 100 MB
Accepted: XLSX, CSV
How does Excel to JSON work?
An .xlsx file is not a spreadsheet — it is a ZIP archive of XML documents, standardized as Office Open XML (ECMA-376). This tool parses that ZIP by hand: it locates the End of Central Directory record, walks the central directory entries, and inflates deflated parts with the platform's DecompressionStream — no bundled codec, no 500 KB library for a format that has not changed since 2006. The whole conversion happens in your browser tab; no bytes are ever uploaded.
To save space, Excel stores most text once in a shared string table and references it by index from cells, while other generators write inline strings — the reader handles both, plus rich-text runs whose fragments are concatenated, because JSON has no bold. Every cell carries a type attribute: booleans become true/false, numbers stay numbers, and truly empty cells and formula errors become JSON null — deliberately, since an empty string would claim the cell contains text. The grid is sparse, and the object/array builders fill gaps with null so every output row is rectangular.
Excel has no date type: a date is a floating-point serial (days since 1899-12-30, preserving Lotus 1-2-3's incorrect 1900 leap year for compatibility), and whether 45292means “the number 45292” or “2024-01-01” is decided entirely by the cell's number format. The reader checks the style index of every numeric cell against the built-in date formats and any custom format codes, heuristically detecting unquoted y/m/d/h/s tokens. Date-formatted serials become ISO 8601 UTC strings; everything else stays numeric.
In “array of objects” mode the first row becomes property names, deduplicated as Name, Name (2), Name (3) because real spreadsheets repeat headers — silently overwriting would lose columns. Blank header cells become column, column (2), and fully blank rows are dropped so trailing formatting rows don't become junk records. Three ceilings protect the tab: 8 MB input files, 64 MB of total inflated XML (a decompression-bomb guard), and 50 sheets. Formulas export their last calculated value, pivot tables and macros are ignored, and the legacy .xls binary format is rejected with an explicit message rather than a corrupt parse.
Spreadsheet grid
name age active Ada 36 true Grace 85 false
Array of objects
[
{ "name": "Ada", "age": 36, "active": true },
{ "name": "Grace", "age": 85, "active": false }
]What options and edge cases does Excel to JSON support?
| Parameter | Type | Default | Behaviour & edge cases |
|---|---|---|---|
| Sheet picker | Control | First sheet | Choose which worksheet of a multi-sheet workbook becomes JSON. CSV input exposes a single sheet named "CSV". |
| Output shape | Mode | Array of objects | Array of objects uses the first row as property names; array of arrays keeps the raw grid — smaller, and better for feeding table renderers. |
| Typed cells | Automatic | On | Numbers stay JSON numbers, booleans stay booleans, empty cells and formula errors become null. Formula cells export their last calculated value. |
| Dates as ISO | Automatic | On | Cells with date number formats (built-in or custom codes) become ISO 8601 UTC strings like "2024-01-15T00:00:00.000Z". Plain numbers that merely look date-like stay numeric. |
| Tab / Shift+Tab | Shortcut | — | Move through the drop zone, sheet picker and toggles without a mouse. |
| Enter on drop zone / Escape | Shortcut | — | Open the file picker keyboard-first; Escape starts over and clears the current file. |
Frequently asked questions
How does Excel to JSON handle my data privately?
The entire conversion runs in your browser tab. The .xlsx file is unzipped, its XML parts are parsed, and the JSON is built using only browser APIs (DecompressionStream for inflate, DOMParser for the SpreadsheetML). No bytes are uploaded to any server — you can verify this in the network tab, or disconnect from the internet after the page loads and convert anyway. Spreadsheets often contain the most sensitive data a business handles (salaries, customer lists, financials), which is exactly why a server-side converter is the wrong architecture for this task.
What is the difference between 'array of objects' and 'array of arrays' output?
Array of objects uses the first row as property names: [{"name": "Ada", "age": 36}, …]. This is what most APIs and JavaScript code expect — each row is self-describing. Array of arrays keeps the raw grid: [["name", "age"], ["Ada", 36], …], which is smaller and preserves the exact row/column structure, useful when the header row isn't meaningful or when you're feeding a table renderer. Duplicate header names are disambiguated automatically ("Name", "Name (2)", "Name (3)"), and completely blank rows are dropped so trailing empty spreadsheet rows don't become junk records.
How are Excel dates converted?
Excel stores dates as serial numbers (days since 1899-12-30, with the famous 1900 leap-year bug baked in). This tool reads each cell's number format — both the built-in date formats and custom format codes — and converts date-formatted serials to ISO 8601 strings like "2024-01-15T00:00:00.000Z". A plain number that merely looks date-like but has a numeric format stays a number. Times are included in the ISO string when the serial has a fractional part. If a date looks wrong, the usual cause is a spreadsheet where someone typed a date into a cell formatted as text — the tool faithfully reports what the format says.
Why isn't the legacy .xls format supported?
The .xls format (Excel 97–2003) is a proprietary binary format called BIFF — a completely different file structure from the modern .xlsx, which is just a ZIP of XML files. Writing a BIFF parser is a large, error-prone undertaking, and every copy of Excel made in the last 17 years can re-save .xls as .xlsx in two clicks (File → Save As → .xlsx). Rather than ship a half-working BIFF parser that silently mangles data, the tool rejects .xls immediately with a clear message telling you exactly how to convert it. Silent data corruption is worse than an honest error.
What are the file size and sheet limits?
Files up to 8 MB are accepted, workbooks inflate to at most 64 MB of XML in memory (a safety ceiling against decompression bombs — a 1 MB xlsx can expand enormously), and the first 50 sheets are read. In practice the binding constraint is browser memory for the JSON output: a 50,000-row sheet converts fine, but pretty-printing it with 2-space indentation roughly triples the string size. For very large workbooks, the 'array of arrays' output is leaner than 'array of objects' because it doesn't repeat property names on every row.
Do numbers, booleans and empty cells keep their types?
Yes — that is the point of parsing the real format instead of treating everything as text. A numeric cell becomes a JSON number (so 42 sorts and sums correctly downstream), a checkbox-style boolean becomes true/false, and empty cells become null rather than empty strings (which would be a lie: an empty string is a value, null is the absence of one). Formula cells export their last calculated value, since evaluating formulas would require a spreadsheet engine. Cells containing formula errors (#DIV/0!, #N/A) become null rather than leaking Excel's error tokens into your JSON.