CSV to Excel Converter
CSV to XLSX and back without Excel's mangling — leading zeros, IDs and dates survive, entirely on this device.
Text cells keep leading zeros — 00501 stays 00501 instead of becoming 501.
The preview grid appears here as you type.
Press ? for shortcuts
Do it offline:$ libreoffice --headless --convert-to xlsx data.csv
How to use it
- Pick a direction — CSV → Excel by default; the s key flips it.
- Paste CSV or drop a file — .csv, .tsv or .txt here, .xlsx or .xls opposite; dropped files are read in place, never sent.
- Delimiter and header row are detected; cells stay text unless you enable Detect types. Workbooks get a sheet picker and an all-sheets .zip.
- Check the preview and the chips, then download, copy or share.
Open a CSV directly in Excel and the damage is immediate: 007 turns into 7, 00501 into 501, long identifiers collapse into scientific notation. This converter writes a real .xlsx that stores every cell as text, so nothing gets reinterpreted — and it reads workbooks back out as clean RFC 4180 CSV. Everything runs on this device; no file is uploaded.
Examples
id,zip
007,00501id,zip
007,00501
The money demo: opened straight in Excel, 007 reads as 7. Written as text cells, nothing shifts — this output is the tool's own Excel → CSV read-back of the produced binary workbook: 007 and 00501 return byte for byte, and every row ends in RFC 4180's CRLF.
id,zip
007,00501
008,00544id,zip
7,501
8,544
Detect types rewrites both columns — "types detected — column "id": 2 number; column "zip": 2 number." — and the ZIPs read back as 501 and 544: fine as quantities, wrong as postal codes. That trade is why text is the default.
name,link
Q3 report,"=HYPERLINK(""https://evil.example"",""open"")"name,link
Q3 report,"=HYPERLINK(""https://evil.example"",""open"")"
A cell beginning with = could execute on open — the OWASP CSV-injection attack. It is written as literal text, the chip says so — "1 cell starts with =, +, - or @ and was written as literal text — never as a formula." — and the workbook XML holds no formula element.
workbook.xlsx — 3 sheets: "Data" 3×3 · "Dates" 4×2 · "Ops|Data<1>" 1×1 → sheet "Dates"2026-01-15,
2026-01-15T12:30:00,
2,
merged,
Sheet 2 of a three-sheet workbook, picked by name — the input line is the tool's sheet census, since the workbook is binary. The midnight-exact cell prints date-only, per the chip: "1 midnight-exact date exported as date-only (no 00:00:00 time part)." The 12:30 timestamp keeps its time.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Excel dates are serial numbers — bug included
A date cell counts days since the 1900 epoch, and serial 60 is 1900-02-29, a day that never existed — kept for Lotus 1-2-3 compatibility. Dates written here skip it: 1900-02-28 is 59, 1900-03-01 is 61. 1904-epoch workbooks are recognized on read.
Merged ranges flatten to the top-left
CSV has no merge concept, so a merged range exports its top-left value and empty cells for the rest — a chip counts them.
Formats drop; midnight-exact dates shorten
Currency signs and separators live in the number format, which CSV cannot carry — values export bare. Timestamps print as ISO 8601; midnight-exact ones print the date alone, and a toggle emits raw serials.
Formula cells export their cached values
Nothing is evaluated: a formula cell contributes the value stored at last save, and a chip counts them. Files saved without recalculation can carry stale caches.
Legacy .xls parses with a fidelity warning
The pre-2007 binary format converts — values come through — but formatting and newer features may not survive; saving as .xlsx first removes the caveat.
The 50 MB workbook ceiling is a memory guard
A workbook decompresses entirely in RAM: past 50 MB the tool refuses rather than freeze the tab; from 20 MB it warns first. The CSV side takes 100 MB — export CSV from your spreadsheet app instead.
Excel's grid has hard edges
At most 1,048,576 rows, 16,384 columns, 32,767 characters per cell — input past any of these is refused whole, never trimmed. Short rows pad to the widest and are listed by number — 20, then an exact count.
What the produced .xlsx leaves out
Column widths are sized to content, capped at 60 characters; the header row has no bold font and no frozen pane, because SheetJS Community Edition emits neither. Data, types and sheet name travel.
Common errors
Not a valid .xlsx workbook — the file starts with bytes 69 64 2C 6E instead of the ZIP signature 50 4B 03 04 or the legacy .xls signature D0 CF 11 E0.- The hex evidence names what was dropped: an .xlsx is a ZIP archive and must begin with PK; these bytes spell "id,n" — plain CSV, which belongs on the other tab.
Workbook is password-protected (reader: File is password-protected). Remove the password in your spreadsheet app and convert again.- Encrypted workbooks refuse up front with the reader's own reason. In-browser decryption is not offered today — save an unprotected copy and convert that.
CSV has more than 1,048,576 rows — an .xlsx worksheet holds at most 1,048,576 rows. Split the file and convert the parts separately.- The ceiling is Excel's format, not this tool's budget: a longer CSV cannot become a valid worksheet. Nothing was truncated — the refusal covers everything.
Unclosed quote: the quoted field opened at line 2, column 4 never closes — this usually breaks every following row. Close the quote, or write a literal " inside a quoted field as "".- The position names the quote that opened the runaway field, caret frame included. One stray quote swallows the rest of the file into one cell; fix that line and the rest usually recovers.
FAQ
Is my CSV file or workbook uploaded anywhere?
No. Conversion happens in this tab: a dropped file is read locally and never enters a network request — the browser's network panel confirms it; the only fetches are this site's own scripts.
Why does every cell arrive in Excel as text?
Because automatic typing corrupts data: leading zeros vanish, digits round past the fifteenth, 1E5 becomes 100000. A text cell shows exactly what the CSV held; Detect types converts numbers, booleans and dates only when asked.
How do I convert one sheet out of a multi-sheet workbook?
Drop it and pick from the labeled sheet list — only that sheet becomes CSV. A missing sheet name refuses with the names that exist; All sheets (.zip) packs one CSV per sheet.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Run the conversion again.
- ⌘/Ctrl + S
- Download the result — .xlsx, .csv or .zip.
- ⌘/Ctrl + C
- Copy the CSV output while nothing is selected.
- ⌘/Ctrl + Shift + C
- Copy the output even over a selection.
- s
- Swap the direction.
- t
- Cycle the theme.
- ? or ⌘/Ctrl + /
- Open the shortcut overlay.
- Esc
- Close the overlay; panes stay put.