Excel to CSV
Get a plain text file out of a binary workbook
Workbook
No workbook open
Drop an .xlsx, .xlsm or .xls file here
Choose a file to get started. It is read in this browser tab and never uploaded.
CSV Output
What happens to a spreadsheet on the way to JSON
A worksheet already looks like the thing you want: a header row, then records. Most of converting it is mechanical — read the cells, key each row by its column name, write it out. The interesting part is what a cell actually contains, because that is rarely what it appears to show.
Dates are the clearest example. Excel does not store a date; it stores a number counting days from an epoch, and applies a display format on top. Read that cell naively and you get 46243. Read the displayed text instead and you get 8/9/26, which is either August 9th or September 8th depending on whose machine opened it. This page reads the underlying value and writes ISO 8601 — 2026-08-09T12:34:56.000Z — which means one thing everywhere.
Long identifiers are the harder problem, and this is where being honest matters more than sounding capable. A cell stored as text comes through byte-for-byte: 8901240544102066246 stays exactly that, and 007 keeps its zeros. A cell stored as a number is a different story. Excel keeps roughly 15 significant figures in a numeric cell, so a 19-digit account number lost its tail before the file was ever written — and reading it in JavaScript, where every number is an IEEE-754 double, cannot bring it back.
So this page does the one useful thing available: it counts those cells and tells you. Most converters hand you 8901240544102066000 with no indication anything happened, and you find out weeks later when a lookup fails. A warning is not as good as a guarantee, but it beats a silent wrong answer — and once you know, the fix upstream is simple.
Converting a workbook
- Choose or drop your file – .xlsx, .xlsm and the older .xls all work. The file is read in this browser tab — it is never uploaded, which is the point when the spreadsheet is a customer list.
- Pick the sheet – Workbooks usually hold more than one. Only the selected sheet is read, so a file with twenty tabs costs nothing extra to open.
- Say whether the first row is a header – On gives you an array of objects keyed by column name. Off gives you an array of arrays, which is what you want when the sheet starts straight into data or the header is merged across cells.
- Check the warning if one appears – An amber badge means at least one numeric cell held more digits than a spreadsheet can keep. It names the cells so you can go back and check them in the source.
- Copy or download – Two-space indented JSON. From here JSON to Table and the rest of the site are one click away.
If a column of IDs matters, format it as Text in Excel before anyone types into it. Formatting an existing numeric column as Text does not restore the lost digits — it only changes how what is left is displayed, which is exactly the trap that makes people think the problem is fixed.
Four columns, four different outcomes
The first two hold identical digits. The only difference is that one cell was formatted as Text and the other as a number — and that difference decides whether the value survives.
| iccid_text | iccid_num | postcode | activated |
|---|---|---|---|
| 8901240544102066246 | 8901240544102066246 | 007 | 09/08/2026 |
Column 1 formatted as Text · column 2 as a number
iccid_text,iccid_num,postcode,activated 8901240544102066246,8901240544102066000,007,2026-08-09T00:00:00.000Z # iccid_num flagged: digits lost before the file was saved
When you would use this
Loading a spreadsheet into an API or database
Somebody maintains the source of truth in Excel and the system that needs it speaks JSON. This is the single most common reason people convert, and the precision warning matters most here, because a mangled identifier will not fail loudly — it will just quietly match the wrong record.
Turning a hand-maintained sheet into fixtures
A worksheet is a pleasant way to write test data and an unpleasant way to store it. Convert once, commit the JSON, and the tests stop depending on a binary file nobody can diff.
Auditing what a workbook really holds
Formatting hides a lot. Converting to JSON strips the presentation away and shows the values underneath, which is often the fastest way to find out why two columns that look identical do not compare equal.
Getting out of a binary format
An .xlsx is a zip full of XML — you cannot diff it, grep it, or review it in a pull request. JSON, or CSV, gives you something a text tool can work with.
What this converter does carefully
- Text cells are passed through byte-for-byte. Leading zeros, long ICCIDs and account numbers stored as text arrive exactly as typed.
- Dates become ISO 8601, not serial numbers or locale strings. No guessing whether
8/9/26is August or September. - Lossy numeric cells are counted and named. This is the honest limit of what a converter can do about a spreadsheet, and it is more than the alternatives offer.
- Displayed text is never used as the value. Excel would render that same 19-digit cell as
8.90124E+18— six significant figures — and plenty of converters take it at face value. - Every sheet in the workbook is available, and only the one you pick is read.
- Blank cells stay blank rather than collapsing the grid, so a row keeps its shape.
- Nothing is uploaded. No server sees the file.
Questions people actually ask
Why is my ID wrong by a few digits?
Because it was stored as a number. A spreadsheet keeps about 15 significant figures in a numeric cell, so a 19-digit value lost its tail when it was entered — not when it was converted. The amber warning on this page tells you which cells it happened to. The fix has to happen in the source file: format the column as Text first, then enter the values.
Can you not just read the raw digits out of the file?
For a file Excel wrote, there are no extra digits left in it to read. A file produced by another tool sometimes does hold them, but the underlying spreadsheet library parses that value into a JavaScript number before we ever see it — verified rather than assumed. Rather than promise a fix that works only occasionally, this page reports the loss.
Why is my date a long ISO string instead of what the cell showed?
Because what the cell showed depends on the regional settings of whoever opened it. ISO 8601 is unambiguous and sorts correctly as text, which is what you want in JSON. If you need a friendlier format, do the formatting where the data is displayed, not where it is stored.
What happens to formulas?
You get the last calculated result, which is what the file stores alongside the formula. If a workbook was saved without recalculating, that value can be stale — a good reason to open and re-save before converting anything important.
Does it handle .xls as well as .xlsx?
Yes, along with .xlsm. The modern .xlsx format is a zip of XML defined by ECMA-376; the older .xls is a binary format. Both are read here.
My sheet has merged header cells and the columns look wrong.
Merged cells report their value once, in the top-left cell of the merge, and empty everywhere else — so a merged header produces one named column and several blank ones. Turn off the header option to get plain arrays, or unmerge the header row in the source.
Related tools
Worth reading
- SheetJS documentation – The library that reads the workbook here, including how cell types and dates are modelled
- RFC 8259 §6 — JSON numbers – Why implementations disagree about large integers, and what to do instead