CSV to Excel Converter Guide
Convert .csv to .xlsx offline on your desktop. Files never leave your device. Handles million-row CSVs without crashing. Free for Mac and Windows.
What is CSV to Excel conversion?
CSV (Comma-Separated Values) is plain text — one row per line, columns separated by commas, no formulas, no formatting, no second sheet. Excel's .xlsx format is a zipped XML workbook that adds cell types, formulas, formatting, multiple sheets, charts, conditional rules, named ranges, and pivot tables. Converting CSV to Excel does NOT add any of those things on its own — it just stuffs the rows into a single sheet so Excel users can open the file in familiar tools and apply formatting, charts, or pivots themselves.
Almost every data pipeline (ETL, Postgres COPY, BigQuery, Spark, pandas, ClickHouse, DuckDB) emits CSV. Most business users open Excel. The conversion is the handoff between machine-format and human-format — what gets handed across is data, not the polish around it.
The non-obvious part is what gets ADDED, what gets LOST, and what gets STUCK. Added: nothing — no styling, no formulas, no charts. The output is a flat data dump waiting for the user to format. Lost: nothing intrinsic, but Excel's 1,048,576-row hard cap is a CLIFF — CSVs above the cap are silently truncated when written to .xlsx, with no warning. The natural answer for files above the cap is Parquet, not Excel. Stuck: column types depend on inference. Pure-numeric columns (zip codes, phone numbers, SKUs) lose leading zeros because they get typed as INTEGER; the only fix is to pre-quote the column or include any non-numeric value to force VARCHAR.
What survives the conversion (and what doesn't)
The single most useful thing to know before you convert. Three buckets: what makes it through cleanly, what converts but needs a second look, and what does not survive at all.
Survives cleanly
Reliable across all converters:
- ✓Cell values — numbers, text, booleans, ISO date strings
- ✓Header row (the CSV's first line becomes Excel's row 1)
- ✓UTF-8 text — accents, CJK characters, emoji
- ✓Commas inside quoted fields and the null vs empty-string distinction (DuckDB's RFC-4180 quoting handling)
FileHop handles all of these via DuckDB read_csv_auto.
Converts but watch the shape
Common surprises:
- ⚠Leading zeros in zip-code / phone / SKU columns — preserved IFF the column has any non-numeric value forcing VARCHAR; otherwise typed as INTEGER and the zeros are lost
- ⚠Date columns without explicit ISO formatting — epoch-style integer columns type as INTEGER and look like 1700000000 in Excel
- ⚠Rows above Excel's 1,048,576-row cap — will be truncated when written to .xlsx; recommend Parquet for files larger than this
- ⚠Auto-detected delimiters that guess wrong on exotic CSVs — read_csv_auto is fast but not always right; pre-clean if needed
FileHop follows DuckDB's defaults here — name these in your QA pass before sharing the workbook.
Does NOT survive
You need a different strategy:
- ✗Multi-CSV → multi-sheet rollup — FileHop writes one .xlsx per CSV; for folder rollups use Excel's Power Query (Get Data → From Folder), Microsoft Office Scripts, or python-openpyxl
- ✗Formulas, cell formatting, bold headers, column widths, charts, pivot tables, conditional formatting — Excel-specific structures the converter cannot synthesize from a CSV
- ✗Legacy .xls (Excel 97-2003) output — FileHop writes only .xlsx; for .xls use Vovsoft's CSV-to-XLS tool or LibreOffice Calc Save As
Surfacing this is the trust signal. No SERP competitor maps the terrain this honestly.
Most browser converters silently truncate above 1M rows and drop leading zeros without explanation. Naming what gets lost is what makes the conversion safe to automate.
How to convert CSV to Excel in FileHop
Four steps. Works on a 100-row .csv, a multi-million-row enterprise export, and CSVs that arrive with semicolons or tabs as the delimiter.
Open FileHop
Launch the FileHop desktop app on Mac or Windows. The data converter is on the home screen.
Drag your CSV file in
Drop the .csv file onto the data converter panel, or use File → Open. FileHop calls DuckDB's read_csv_auto, which detects the delimiter (comma / semicolon / tab / pipe), the quoting style, and the column types automatically — no manual delimiter or encoding selection needed.
Select Convert to Excel
Pick Excel from the output-format dropdown. FileHop types each column (numeric / boolean / VARCHAR / DATE / TIMESTAMP) and prepares the .xlsx via DuckDB's GDAL XLSX driver.
Click Convert
FileHop writes the .xlsx next to the source CSV file (single sheet, values only). If the target name already exists, the filename is auto-uniquified with _1, _2, etc., so you never silently overwrite a previous export.
Streaming write — no full-file load into RAM. Auto-uniquified filenames. Broad CSV variant tolerance. Single-sheet flat output. Mind the Excel 1M-row cap for large files.
Why offline beats online for CSV → Excel
Browser converters dominate the search results, but every one of them fails on at least one of the three things below. This is the editorial case for converting on your own machine.
Privacy: PII and sensitive CSVs
Financial exports, customer lists, HR rosters, M&A spreadsheets, healthcare data, internal forecasts — these are the CSVs people most often want to convert, and they are the same files that should never traverse a third-party server. CloudConvert, Convertio, FreeConvert, and Zamzar all upload the whole CSV to their infrastructure (their own privacy pages confirm this). 'Files deleted in 24 hours' is policy, not architecture. Offline desktop conversion has zero network surface. Disconnect from the internet and the conversion still runs. That is the only verifiable guarantee.
File size: streaming vs the upload queue
Most browser converters cap free uploads at 50 MB to 1 GB. Convertio caps at 100 MB. Zamzar at 50 MB. FreeConvert at 1 GB. CSVs in the multi-million-row range time out, queue, or silently fail. FileHop reads via DuckDB's streaming COPY pipeline — there's no upload, no rate limit, and the file size limit is your local disk. The Excel row cap of 1,048,576 still applies because that's a property of the .xlsx format itself, not the converter — for files above the cap, use Parquet.
Fidelity: real CSV parsing
Generic browser converters use ad-hoc CSV parsers that get RFC-4180 quoting, embedded newlines, and unusual delimiters wrong. DuckDB's read_csv_auto is the same parser used by data warehouses — it handles RFC-4180 quoting, multi-line cells, mixed delimiters, and trailing-comma irregularities cleanly. Type inference preserves numbers as numbers, booleans as booleans, NULLs as empty cells, and ISO date strings as text — which means downstream Excel users open a workbook with the right cell types out of the box.
If your CSV is bigger than Excel can comfortably hold, the related guides below go deeper:
FileHop vs the SERP: how the desktop converter compares
Eight tools, ten dimensions. FileHop is highlighted in blue. Honest about what we don't ship today.
| Tool | Type | Offline | Price | File-size limit | Multi-CSV → multi-sheet | Encoding handling | Delimiter handling | Type inference / leading zeros | Privacy |
|---|---|---|---|---|---|---|---|---|---|
| FileHop | Desktop (Mac, Windows) | Yes | Free | No limit (Excel caps at 1M rows) | Single-sheet only | UTF-8 input expected | Auto-detect (read_csv_auto) | VARCHAR for mixed columns | Fully local |
| FreeConvert | Browser | No | Free with caps | 1 GB upload | Single sheet | Advanced settings panel | Advanced settings panel | Mixed | Files traverse GCP |
| Convertio | Browser | No | Free with caps | 100 MB | Single sheet | Limited | Limited | Mixed | Files uploaded |
| CloudConvert | Browser | No | Free 25/day | Not stated | Single sheet | Configurable | Configurable | Yes | Files traverse cloud |
| Zamzar | Browser | No | Free with caps | 50 MB free | Single sheet | Limited | Limited | Mixed | 24h retention |
| csvtoexcel.top | Browser-local (claims) | Yes (in browser) | Free | Browser RAM-bound | Single sheet | Undocumented | Auto | SheetJS defaults | Browser-side (undocumented) |
| Vovsoft CSV→XLS | Paid Windows desktop | Yes | $19 lifetime | No limit | Single sheet | Configurable | Configurable | Stored values | Fully local |
| Withdata DataFileConverter | Paid desktop (cross-platform) | Yes | 30-day trial then paid | No limit | Multi-CSV → multi-sheet | Configurable | Configurable | Yes | Fully local |
| Excel (Power Query) | Desktop GUI | Yes | Paid (already-installed) | No upload (local) | Get Data → From Folder | File Origin dropdown | Detect / override | Text column override | Fully local |
If you need multi-CSV → multi-sheet rollup today, Excel's Power Query (Get Data → From Folder) is the honest recommendation — it's already installed and ships per-file sheet creation out of the box. Withdata DataFileConverter is the closest paid desktop alternative. For desktop GUIs that handle million-row CSVs with full DuckDB type inference, no upload step, and zero file-size cap, FileHop is free where Withdata is paid and Power Query requires the manual Get Data ritual.
Three pitfalls that bite every CSV-to-Excel conversion
Excel's 1,048,576-row hard cap (the silent truncation trap)
Excel itself caps a single sheet at 1,048,576 rows × 16,384 columns. Browser converters silently truncate CSVs above this cap (no warning, no error, just a partial file). FileHop's DuckDB pipeline writes the full row count it reads, but the .xlsx format itself caps at 1M rows, so for CSVs larger than that the workbook gets truncated. The real fix is to convert to Parquet instead — 10-100× smaller, columnar, query-friendly in DuckDB / Spark / pandas, and no row cap. The CSV is fine; Excel is the bottleneck. See /guides/csv-excel-parquet-guide for the format comparison and /tools/data/csv-to-parquet for the conversion.
Leading zeros disappearing from zip codes, phone numbers, SKUs
DuckDB's read_csv_auto types each column based on the values it sees. A column that's all-numeric ('12345', '00123', '99999') types as INTEGER and writes as a number — the leading zeros are lost. A column with any non-numeric value (a single dash, a single 'X', a header containing letters) types as VARCHAR and writes as text — the zeros are preserved. The fix: in the source CSV, pre-quote the column ('00123' instead of 00123) or include a non-numeric token in one row. Same trade-off as Excel's own Text Import Wizard 'Text column' override — the underlying type-inference mechanic is shared by every modern CSV parser.
Multi-CSV folders not rolling up into one workbook
The 'monthly_q1.csv, monthly_q2.csv, monthly_q3.csv → one workbook with three sheets' workflow is genuinely common. FileHop today writes one .xlsx per CSV (no folder-rollup option). For multi-sheet rollups use Excel's Power Query (Get Data → From Folder, then Combine & Load), Microsoft Office Scripts (sample at learn.microsoft.com), or python-openpyxl (writer.book.create_sheet per file). We are not hiding this — it's listed in the comparison table. Once FileHop adds folder-rollup support this guide will be updated.
Eight best practices before you convert
Most data-fidelity issues are upstream of the converter. Plan for them in the source CSV first.
- 1 For CSVs above 1M rows, convert to Parquet instead of Excel — Excel caps at 1,048,576 rows per sheet, Parquet has no row cap and is 10-100× smaller. See /guides/csv-excel-parquet-guide and /tools/data/csv-to-parquet.
- 2 To preserve leading zeros in zip-code / phone / SKU columns, pre-quote the column in the source CSV ('00123' instead of 00123) or add a non-numeric token to one row, so DuckDB types the column as VARCHAR.
- 3 For non-UTF-8 source CSVs (Latin-1, Windows-1252, UTF-16 — common from legacy ETL exports, especially European installs), pre-convert with iconv: iconv -f WINDOWS-1252 -t UTF-8 input.csv > clean.csv. DuckDB expects UTF-8.
- 4 For exotic CSVs where read_csv_auto guesses the wrong delimiter (records-per-line semi-structured, embedded JSON in a column, RFC-4180-non-compliant quoting), pre-clean in a text editor — there's no UI override yet for the auto-detect.
- 5 To merge a folder of CSVs into one Excel workbook with one sheet per CSV, use Excel's Power Query (Get Data → From Folder) — FileHop today writes one .xlsx per CSV without folder rollup.
- 6 To author formulas, charts, pivot tables, cell formatting, or column widths, do this in Excel itself once the workbook is open — the converter writes a flat data dump, and Excel applies the polish.
- 7 Sensitive CSVs (financial exports, HR rosters, customer lists, healthcare data, M&A) — always local desktop conversion. Never upload them to a hosted converter, regardless of stated retention policies.
- 8 Validate the output before sharing: open the .xlsx in Excel, spot-check the row count (does it match the source CSV?), the leading zeros in any text-formatted columns, the date columns, and any non-ASCII text. Cheap insurance against silent data loss.
Free. Offline. Handles million-row CSVs. Mac and Windows desktop app.
Open the CSV to Excel Converter