CSV to Excel Converter

Upload or paste CSV and TSV text and get a genuine .xlsx workbook: the delimiter is detected, quoted fields parse right, and you name the sheet.

Parsing and workbook building happen locally in your browser. Nothing is uploaded.

CSV / TSV to XLSX

Click to choose a CSV file or drag a .csv or .tsv file here — you can also paste below

Delimiter

How It Works

Input text — from a file or your clipboard — runs through a small, strict CSV state machine, and the resulting grid is packed into a real OOXML workbook by SheetJS and offered as a local download. Both halves happen inside the tab.

A quoting-aware parser, not a split() call
Fields are walked character by character: quoted sections absorb delimiters, line breaks and doubled quotes, and CRLF/LF endings are both handled. That is what lets a cell containing She said "hi", loudly land in one Excel cell instead of bursting into three columns. A UTF-8 BOM on pasted text is ignored.
Auto-detection with an override
In Auto mode the first non-empty line is counted outside quoted areas for comma, semicolon and tab, the most frequent wins and its name is shown under the selector. Force any delimiter manually when the guess is wrong; the preview re-parses on every change.
What lands in the workbook
Every cell is written as a text cell — exact characters, no type guessing, leading zeros intact — under the sheet name you provide (Excel forbids \ / ? * [ ] : and caps names at 31 characters, so those are stripped automatically). You get a proper .xlsx container: a single zip of worksheet XML, the same thing desktop Excel writes.

Frequently Asked Questions

How many rows can it handle? Is the 1,048,576-row Excel limit an issue?

The .xlsx format itself caps a sheet at 1,048,576 rows by 16,384 columns, but you will hit a different wall first: this converter builds the workbook in your browser tab's memory. Plain-text inputs up to a few megabytes convert smoothly; the page deliberately rejects anything over 5 MB so a giant paste fails with a clear message instead of freezing the tab. Split very large exports and convert parts.

My numbers and dates came out as text. Is that a bug?

It is a deliberate, honest choice. CSV carries no type information — the characters 1,097 could be a thousands-separated number or a sentence fragment, and 01-02-2026 is ambiguous between two date formats. Guessing wrong silently corrupts data, so every parsed cell is stored as text exactly as written (this is also what protects zip codes like 00744 from losing their leading zeros). Excel will still offer its own conversion when you open the file.

So why convert to .xlsx at all if the values stay text?

Because the container already buys you a lot: one file instead of endless import dialogs, a named sheet, no delimiter ambiguity, no encoding guesswork, and a format Excel, Numbers and Google Sheets open by double-click. And the moment a cell is edited in Excel its type is back — the text storage only describes the starting point.

How does delimiter auto-detection work, and can I override it?

The first non-empty line is scanned outside quoted sections, and comma, semicolon and tab occurrences are counted; the winner is used and labeled under the selector. Detection is only a heuristic — a header like name,comment is fine, but a one-column file with stray commas is not — so the selector always lets you force comma, semicolon or tab and the preview re-parses instantly.

Is anything uploaded to a server?

No. The text is parsed and the workbook is assembled inside your browser tab; the .xlsx is handed back as a local download. The one-time load of the SheetJS library from its public CDN is the only network request involved — your data never leaves your device.