Excel to JSON Converter

Row one is a title banner. The last row is a total. Drop the workbook, click the real header row, and get JSON without the clutter.

Drop a workbook anywhere on this card

.xlsx, .xls or .csv. The file is read inside this tab and never uploaded.

What the sample workbook turns into

Load the sample above. Row 1 is a merged banner, row 2 holds the headers, row 8 is a total line. The header row lands on 2 without help, and Last row stops at 7 so the total never becomes an object.

Orders sheet, rows 2 to 7
RowOrder IDCustomerEmailOrderedQtyUnit pricePaid
2Order IDCustomerEmailOrderedQtyUnit pricePaid
3TX-4101Ines Duarteines.duarte@toolexe.com14 Sep 2026318.50TRUE
4TX-4102Tomasz Wronatomasz.wrona@toolexe.com14 Sep 20261249.00TRUE
5TX-4103Priya Nambiarpriya.nambiar@toolexe.com16 Sep 2026124.75FALSE
6TX-4104Kofi Mensahkofi.mensah@toolexe.com19 Sep 2026262.90TRUE
7TX-4105Hana Sato(blank)21 Sep 2026531.00TRUE

Row 3 and row 7 come out like this:

[
  {
    "Order ID": "TX-4101",
    "Customer": "Ines Duarte",
    "Email": "ines.duarte@toolexe.com",
    "Ordered": "2026-09-14",
    "Qty": 3,
    "Unit price": 18.5,
    "Paid": true
  },
  ...
  {
    "Order ID": "TX-4105",
    "Customer": "Hana Sato",
    "Email": null,
    "Ordered": "2026-09-21",
    "Qty": 5,
    "Unit price": 31,
    "Paid": true
  }
]

Hana has no email on file. A blank cell becomes null by default.

Pick the shape by who reads it next

ShapeLooks likeFitsCosts you
Objects[{"Qty":3}]REST bodies, test fixtures, NoSQL importsEvery key repeats on every row, so the file grows fast
Arrays[["Qty"],[3]]Chart libraries, compact payloads, sheets with unreliable headersThe reader must know the column order by heart
Columns{"Qty":[3,1,12]}Plotting, column-wise mathRow identity lives only in list position

Objects win for most API work. Switch to arrays when a 40,000-row export repeats the same eleven key names until the payload is mostly punctuation.

The header row is a click, not a setting

Spreadsheets built for people start with a logo, a title, or a note about the quarter.

The converter scans the first 50 rows and picks the first one where at least half of the widest row's cells hold something. A merged banner fails that test, so the real headers win. The guess is wrong when a header row is sparse, or when a notes block with several filled cells sits above the table. Then click the row number in the preview. The highlighted row moves, rows above it dim, and the JSON rebuilds on the spot. Last row works the same from the bottom, which is how you drop a Total line before it turns into an object.

Got a file like that right now? Drop it on the card above, find the true header in the preview, and click its number. Watch the JSON change before you touch any other option.

Edge cases, in the order they tend to bite

Duplicate headers
Two columns named Amount become Amount and Amount_2. Nothing is dropped.
Spaces in keys
Headers like Unit price need bracket access in JavaScript. Set Spaces in keys to _ or - and you get Unit_price or Unit-price. The swap runs before duplicates are numbered.
Blank header over real data
The key takes its column number, so data under an unnamed column D arrives as column_4. A blank header over an empty column is dropped.
Leading zeros
A ZIP code typed as text stays 02134. Stored as a number, Excel already lost the zero before you saved. Format the column as Text in the original, then export.
Long IDs
Excel stores 15 digits of precision. A 19-digit order number was rounded the moment someone typed it, and no converter brings the digits back.
Percent and currency
Typed mode gives 0.18 for a cell showing 18%. As displayed gives the string "18%". Pick by what the next parser accepts.
Numeric headers
Headers such as 2024 and 2025 sort ahead of text keys, because JavaScript orders integer-like keys first. Values stay correct. Only the key order changes.
Hidden rows and columns
Still exported. The file records them as hidden, and this page ignores the flag. Delete them in Excel if they should not ship.

Where this page stops

Going the other way? JSON to Excel writes an xlsx from an array. A database import wants INSERT statements, so route the same rows through JSON to SQL. XML consumers need Excel to XML, and a quick table for a wiki page is Excel to HTML. Once the JSON exists, JSON Viewer collapses it so you spot a wrong shape in seconds.

Questions people ask with a workbook open

Blank cells, dates, and size limits.

Is my spreadsheet uploaded anywhere?

No. A JavaScript library reads the file inside your tab. The page fetches that library from a CDN once, and nothing about your workbook leaves the device. Close the tab and the data is gone.

Why did a cell come out as null?

The cell was blank, part of a merge but not its top-left corner, or a formula with no saved result. Check the preview first. If null breaks the next step, set Empty cells to Empty string or Leave the key out.

Does it export every sheet in one file?

Tick Every sheet, keyed by name. The output becomes an object with one array per sheet. Each sheet keeps its own header row and last row, set from its tab. The preview still shows one sheet at a time.

Why is a date 2026-09-14 and not 14/09/2026?

Typed mode writes dates as ISO text because every language parses it the same way. Cells with a time part get a T and the clock time. Choose As displayed to copy the exact text Excel shows, locale format included.

How big a workbook is safe?

Anything under about ten megabytes converts in a second or two. Larger files load, but the tab pauses while the library decodes them. Split the workbook by sheet or date range when the pause turns into a freeze.

Will 00123 keep its leading zeros?

Yes when the cell holds text. A CSV file turns numeric-looking text into numbers on read, so 00123 becomes 123 in Typed mode. Switch Values to As displayed to keep the original string.

Does it open password-protected files?

No. Encrypted workbooks fail with a read error. Remove the password in Excel, save a copy, and drop that copy here.