Free online CSV to XLSX converter
CSV to Excel that keeps 007 as 007
This converter is free and needs no signup: paste delimited text and download a real .xlsx workbook, with every column typed the way you tell it to be. Numbers become numeric cells that SUM adds up, product codes with leading zeros and ids past 15 digits stay text, and ambiguous dates get a day-first / month-first switch instead of a silent guess. It reads up to 5 MB of comma, semicolon, tab or pipe separated text, and the workbook is assembled in the browser — no Excel, no Office licence, no upload.
- 100% free
- No signup
- Up to 5 MB
- Typed cells
- Real .xlsx output
Every column gets a type and a reason for it here, before anything is written.
Paste delimited text, or try the — five rows that Excel mangles four different ways when you double-click them. To go the other way, use Excel to CSV.
How to convert a CSV to Excel
Three steps, and you see what every column becomes before anything is written.
Drop the delimited text in
Paste rows into the left panel, drag a .csv or .tsv onto it, or paste with ⌘V, or Ctrl+V away from a Mac. The separator is sniffed by looking for the character that gives every row the same field count — not the most frequent one, which is how a description column full of commas beats a semicolon file. Override it in the toolbar if the sniff is wrong.
Check what each column is about to become
The right panel lists every column with the type it will be written as and one sentence explaining why: how many values parsed as numbers, which ones start with a zero, how many read as dates either way round. Change any column to Text, Number, Date or TRUE/FALSE with the dropdown beside it, and switch the day-first / month-first control when slashed dates are genuinely ambiguous.
Download the workbook
Press Download .xlsx and the package is assembled in the tab: five XML parts zipped with correct CRC-32 records, the header row frozen, filter dropdowns on row 1 and column widths taken from the longest value in each column. Open it straight in Excel, LibreOffice Calc, Numbers or Google Sheets — no Excel installation is involved anywhere in the process.
Technical specifications
| Accepted input | Comma, semicolon, tab or pipe separated text — .csv, .tsv, .txt — with RFC 4180 quoting, doubled quotes, embedded line breaks and an optional UTF-8 byte-order mark |
|---|---|
| Maximum input | 5 MB of text (5,242,880 characters); the first 2,000 data rows drive type inference |
| Output | A single-sheet .xlsx: [Content_Types].xml, _rels/.rels, xl/workbook.xml, xl/_rels/workbook.xml.rels and xl/worksheets/sheet1.xml, zipped store-only with CRC-32 records |
| Cell types written | Numbers as numeric cells, TRUE/FALSE as boolean cells, everything else as inline strings — leading zeros, +prefixes and runs past 15 digits are forced to text |
| Dates | Recognised as ISO, D/M/Y, M/D/Y and 12-Aug-2026 forms, then written as ISO 8601 text; two-digit years use the POSIX window (69–99 → 19xx, 00–68 → 20xx) |
| Measured speed and size | 1,000 rows × 8 columns: 8 ms, 0.46 MB. 5,000 rows: 21 ms, 2.31 MB. 20,000 rows: 143 ms, 9.35 MB |
| Not written | Cell styles, fonts, colours, number formats, formulas, a second worksheet, images and charts |
| Processing location | Your browser — the rows are never uploaded to a server |
Frequently asked questions
Why does Excel turn my product code into scientific notation?
Because Excel decided the value was a number, and any number over 11 digits gets displayed in scientific notation in a default-width column. A 17-digit order id like 90071992547409931 becomes 9.00720E+16 on screen and — worse — the underlying value is rounded to 9007199254740993000, because a spreadsheet stores every number as a 64-bit double and only 15 significant digits survive. This page checks digit length before it writes anything: any column with values past 15 digits is written as text, so the id you exported is the id you get back.
Can I keep the leading zeros on a zip code or an employee id?
Yes — a column containing values like 007 or 02138 is written as text automatically, and the panel says so before you download. There is no way to keep a leading zero on a numeric cell, because 007 and 7 are the same number and the padding lives only in the display format. Writing the column as text is the only lossless answer, and it is what the Text Import Wizard has always asked you to pick by hand.
Why does my CSV open with everything crammed into column A?
Because Excel splits a double-clicked .csv on the list separator from your Windows regional settings, not on the comma. On a machine set to German, French, Spanish or Dutch that separator is a semicolon, so a comma-separated file arrives as one long string per row. Building an .xlsx sidesteps the question entirely — the cells are already cells, so regional settings have nothing left to guess at.
Is 03/04/2026 the third of April or the fourth of March?
Nothing in the file can tell you, which is why this page asks instead of guessing. When a slashed-date column contains any value with a first or second component above 12 the order is proved and the panel says which, and when every value is ambiguous a day-first / month-first switch appears in the status bar. Whatever you pick, the cell is written as ISO 8601 text — 2026-04-03 — which sorts correctly and can never be re-read the other way round.
Why do gene names like SEPT2 and MARCH1 turn into dates?
Excel's autocorrect reads them as abbreviated dates on import and rewrites them as 2-Sep and 1-Mar, and once saved the original symbol is gone. It is not a rare curiosity: a 2016 survey found the error in roughly a fifth of published genomics papers with Excel supplements, and in August 2020 the HUGO Gene Nomenclature Committee renamed 27 human genes — SEPT2 became SEPTIN2 — because it was easier than fixing the spreadsheets. Nothing on this page autocorrects anything; a text column is written exactly as it arrived, character for character.
Why is the .xlsx larger than the CSV it came from?
Because the ZIP is written store-only, with no compression, and every text cell carries its own XML wrapper. A 5,000-row, 8-column table produces a 2.31 MB package in about 21 milliseconds; the same XML deflated the way Excel writes it would be roughly a tenth of that. Open the file in Excel or LibreOffice and save it once and it shrinks to a normal size — the trade is a simpler, verifiable writer against a file that is temporarily fat.
Do I need Excel installed for this to work?
No. The workbook is assembled by JavaScript in this tab and lands in your downloads folder as a finished .xlsx, so nothing about the conversion needs Microsoft Office, an account or a network connection. The resulting file opens in Excel 2007 and later, LibreOffice Calc, Google Sheets, Apple Numbers, pandas and anything else that reads OOXML.
About converting CSV to Excel
CSV has a specification — RFC 4180, published in 2005 — and almost nothing obeys it. The document is four pages long and says fields are separated by commas, records by CRLF, a field containing a comma, a quote or a line break must be wrapped in double quotes, and a literal quote inside such a field is written twice. It says nothing about character encodings, nothing about types, and nothing about what a program should do when the rows have different lengths. Everything a spreadsheet needs to know — is this column text or a number, is that a date, which century does 26 mean — has to be guessed at import, and the guessing is done by whichever program opened the file, using whichever locale that machine happens to be set to.
That is why double-clicking a .csv is the worst way to open one. Excel picks the separator from your regional list separator, reads UTF-8 without a byte-order mark as legacy ANSI so that café becomes café, strips leading zeros, converts anything longer than 15 digits to a rounded double, autocorrects strings that resemble dates, and treats a field beginning with = as a formula. Building the .xlsx yourself removes every one of those decisions from the importer, because an .xlsx cell already carries its own type. If all you want is to read the file rather than convert it, the CSV viewer puts the same parse into a sortable table without producing anything.
The one thing worth understanding about the output is why a number stays a number. In SpreadsheetML a numeric cell is <c r="D2"><v>19.99</v></c> and a text cell is the same element with t="inlineStr" and the characters wrapped in <is><t>…</t></is>. Writers that emit every cell as text produce a workbook where every formula returns zero and every column sorts alphabetically, which is the green-triangle sheet everyone has been sent at least once. Getting the type right per column is the whole job here, and it is the same decision the CSV to JSON converter makes when it chooses between a JSON string and a JSON number.
Where your rows are processed
The text you paste is parsed and the workbook is zipped by JavaScript inside this tab. Nothing is uploaded, nothing is logged, and the download comes from a Blob your own browser created — which matters, because the tables people convert here are payroll runs, customer lists and order exports. Close the tab and the data is gone with it.