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.
| Row | Order ID | Customer | Ordered | Qty | Unit price | Paid | |
|---|---|---|---|---|---|---|---|
| 2 | Order ID | Customer | Ordered | Qty | Unit price | Paid | |
| 3 | TX-4101 | Ines Duarte | ines.duarte@toolexe.com | 14 Sep 2026 | 3 | 18.50 | TRUE |
| 4 | TX-4102 | Tomasz Wrona | tomasz.wrona@toolexe.com | 14 Sep 2026 | 1 | 249.00 | TRUE |
| 5 | TX-4103 | Priya Nambiar | priya.nambiar@toolexe.com | 16 Sep 2026 | 12 | 4.75 | FALSE |
| 6 | TX-4104 | Kofi Mensah | kofi.mensah@toolexe.com | 19 Sep 2026 | 2 | 62.90 | TRUE |
| 7 | TX-4105 | Hana Sato | (blank) | 21 Sep 2026 | 5 | 31.00 | TRUE |
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
| Shape | Looks like | Fits | Costs you |
|---|---|---|---|
| Objects | [{"Qty":3}] | REST bodies, test fixtures, NoSQL imports | Every key repeats on every row, so the file grows fast |
| Arrays | [["Qty"],[3]] | Chart libraries, compact payloads, sheets with unreliable headers | The reader must know the column order by heart |
| Columns | {"Qty":[3,1,12]} | Plotting, column-wise math | Row 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
AmountandAmount_2. Nothing is dropped. - Spaces in keys
- Headers like
Unit priceneed bracket access in JavaScript. Set Spaces in keys to_or-and you getUnit_priceorUnit-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.18for 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
- Password-protected workbooks are refused. Remove the password in Excel first.
- Macros, pivot definitions, charts, and images are ignored. Pivot tables arrive as the cells they display.
- Nothing writes back to xlsx. This is a one-way read.
- The whole workbook is decoded in memory. Past a few tens of megabytes, a mid-range laptop pauses. Split the file before that point.
- The JSON pane previews the first 200,000 characters. Copy and Download use the full output.
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.