Excel to CSV Converter Guide
Convert .xlsx, .xls, .xlsb, and .ods to CSV offline on your desktop. Files never leave your device. No upload limit. Free for Mac and Windows.
What is Excel to CSV conversion?
Excel files (.xlsx, .xls, .xlsb, .ods) are binary spreadsheet workbooks. They hold cell values, but also formulas, number and date formats, multiple sheets, charts, conditional rules, named ranges, and pivot tables. CSV (Comma-Separated Values) is plain text — one row per line, columns separated by commas, no formatting, no formulas, no second sheet. Converting Excel to CSV strips everything except the cell values from the first sheet.
Almost every data pipeline expects CSV, not native Excel. Postgres COPY, BigQuery LOAD, Spark spark.read.csv, pandas read_csv, MySQL LOAD DATA INFILE, ClickHouse, DuckDB, and most ETL tools accept CSV directly but cannot ingest .xlsx without a converter step. Excel is the human-authoring format. CSV is the wire format that downstream systems consume. The conversion sits between the two.
The non-obvious part is what gets LOST. Multi-sheet structure flattens to one CSV per sheet (and most converters silently drop everything after the first sheet). Cell formatting is display-only — a number stored as 1234567 with display format '#,##0' shows as '1,234,567' in Excel but the CSV correctly writes 1234567. Formulas are replaced by their evaluated values; the formula source text is gone. Charts, conditional formatting, comments, named ranges, pivot tables, and data validation rules — all stripped. The CSV is the data, not the presentation.
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 (Excel row 1 becomes the CSV header line)
- ✓The FIRST sheet's data, formula evaluations, text-formatted leading zeros
- ✓UTF-8 text — accents, CJK characters, emoji
FileHop handles all of these via calamine + the Rust csv crate.
Converts but watch the shape
Common surprises:
- ⚠DateTime cells emit Excel's serial number (e.g. 45292.0) — not '2024-01-01'. Only DateTimeIso source cells round-trip as ISO strings.
- ⚠Formula errors — #REF!, #DIV/0!, #N/A become literal 'ERROR: <kind>' strings, not empty cells
- ⚠Merged cells flatten to top-left value only; continuation cells become empty
- ⚠Empty trailing rows / columns are not auto-trimmed — Excel's used range is preserved verbatim
FileHop follows calamine's defaults here — name these in your QA pass before piping to a warehouse.
Does NOT survive
You need a different strategy:
- ✗Multi-sheet workbooks — FileHop writes ONLY the first sheet today. For all sheets, use xlsx2csv --all-sheets, LibreOffice Calc with a macro, or convert each sheet manually.
- ✗Charts, images, shapes, conditional formatting, cell colors, borders — CSV has no concept of these
- ✗Comments, named ranges, pivot tables, data validation, formula source text — Excel-specific structures the CSV format cannot represent
Surfacing this is the trust signal. No SERP competitor maps the terrain this honestly.
Most browser converters silently drop everything in the second category and pretend the third doesn't exist. Naming what gets lost is what makes the conversion safe to automate.
How to convert Excel to CSV in FileHop
Four steps. Works on a 10-row .xlsx, a multi-gigabyte enterprise export, and the legacy .xls or .xlsb files calamine still reads.
Open FileHop
Launch the FileHop desktop app on Mac or Windows. The data converter is on the home screen.
Drag your Excel file in
Drop the .xlsx, .xls, .xlsb, or .ods file onto the data converter panel, or use File → Open. FileHop calls calamine::open_workbook_auto, which detects the workbook format automatically — broader format coverage than the .xlsx-only browser tools.
Select Convert to CSV
Pick CSV from the output-format dropdown. FileHop reads the FIRST sheet, evaluates every formula, and prepares the CSV.
Click Convert
FileHop writes the .csv next to the source Excel file (UTF-8, comma-delimited). If the target name already exists, the filename is auto-uniquified with _1, _2, etc., so you never silently overwrite a previous export.
Formulas evaluate to values. First sheet only. UTF-8 output. Auto-unique filenames. The workbook never leaves your device.
Why offline beats online for Excel → CSV
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 workbooks
Financial models, customer lists, HR rosters, M&A spreadsheets, healthcare data, internal forecasts — these are the Excel files people most often want to convert, and they are the same files that should never traverse a third-party server. CloudConvert, Convertio, FreeConvert, and Aspose all upload the whole workbook 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 100 MB to 1 GB. CloudConvert's free tier limits 25 conversions per day. Convertio caps at 100 MB. Multi-million-row enterprise exports never complete — they queue, time out, or hit a paywall. FileHop reads the workbook with calamine (a fast Rust XLSX/XLS reader) and streams the rows out via the csv crate. There's no upload step, no rate limit, and the file size limit is your local disk.
Fidelity: real formula evaluation
Generic browser converters often skip the formula engine. They either ship the formula source verbatim (=SUM(A1:A10) appears literally in your CSV, breaking downstream consumers) or they emit blank cells where the formulas should have computed. FileHop runs calamine's full evaluator — every formula resolves before the CSV is written, exactly like Excel's own Save As → CSV. And the broader format coverage (.xlsx, .xls, .xlsb, .ods) means legacy files still convert.
If your downstream is bigger than CSV can comfortably hold, two related guides go deeper:
FileHop vs the SERP: how the desktop converter compares
Eight tools, eight dimensions. FileHop is highlighted in blue. Honest about what we don't ship today.
| Tool | Type | Offline | Price | File-size limit | Multi-sheet | Encoding choice | Delimiter choice | Formula eval | Privacy |
|---|---|---|---|---|---|---|---|---|---|
| FileHop | Desktop (Mac, Windows) | Yes | Free | No practical limit | First sheet only | UTF-8 only | Comma only | Full eval (calamine) | Fully local |
| CloudConvert | Browser | No | Free 25/day | ~1 GB | Single sheet | UTF-8 / UTF-16 / Latin-1 | Comma / semicolon / tab | Yes | Files traverse cloud |
| Convertio | Browser | No | Free with caps | 100 MB | Single sheet | Limited | Comma only | Yes (mostly) | Files uploaded |
| FreeConvert | Browser | No | Free with caps | 1 GB | Single sheet | Advanced settings panel | Advanced settings panel | Yes | 24h retention |
| Aspose Apps | Browser | No | Free funnel for SDK | ~100 MB | Single sheet | Configurable | Configurable | Yes | Files uploaded |
| LibreOffice Calc | Desktop (cross-platform) | Yes | Free OSS | No practical limit | All sheets via macro | Save As dialog | Save As dialog | Full eval | Fully local |
| xlsx2csv (Python) | CLI | Yes | Free OSS | Streaming, no limit | --all-sheets flag | --encoding flag | --delimiter flag | Stored values | Fully local (needs Python) |
| in2csv (csvkit) | CLI | Yes | Free OSS | No practical limit | --sheet flag (one at a time) | --encoding flag | Default comma | Yes | Fully local (needs Python) |
| Excel (Save As) | Desktop GUI | Yes | Paid (already-installed) | No practical limit | Active sheet only | UTF-8 / Comma-delimited / Macintosh | Locale-dependent | Full eval | Fully local |
If you need multi-sheet output today, xlsx2csv --all-sheets and LibreOffice Calc are the honest recommendations. If you need a delimiter or encoding choice, FreeConvert's Advanced Settings or in2csv cover it. For desktop GUIs that read .xlsx, .xls, .xlsb, AND .ods with no file-size cap and full local processing, FileHop is free where Easy Data Transform is paid and LibreOffice requires a macro for batch sheet export.
Three pitfalls that bite every Excel-to-CSV conversion
Leading zeros in zip codes, phone numbers, SKUs
Excel stores numbers as numbers. If your zip-code column shows '00123' but is formatted as Number, the underlying value is 123 — the leading zeros only existed in the display. Every CSV writer (FileHop, Excel, xlsx2csv, all of them) correctly writes 123. The fix is upstream: in Excel BEFORE saving, format the column as Text (right-click → Format Cells → Text) and re-enter the value, or use =TEXT(A1,'00000'). Only then does the cell store the literal string '00123' and survive the conversion. Most browser converters do not explain this, so users blame the converter.
Date columns turning into 5-digit numbers
Excel stores dates as days-since-1900 (so '2024-01-01' is internally the integer 45292). When calamine reads a DateTime cell that doesn't carry an explicit ISO datetime tag, the CSV gets the serial '45292.0' instead of '2024-01-01'. The fix: in Excel BEFORE converting, change the date column to a Text format with =TEXT(A1,'yyyy-mm-dd') and copy → paste-as-values, or post-process the CSV (in Python: pd.to_datetime(df['col'], unit='d', origin='1899-12-30')). DateTimeIso cells — which Excel produces from explicit ISO formulas, or from data sources that round-trip ISO strings — are unaffected.
Multi-sheet workbooks silently lose every sheet after the first
This is the most common 'where did my data go' question. FileHop today writes only the first sheet — the _sheet parameter in the converter is a documented TODO. For multi-sheet exports, use xlsx2csv with --all-sheets (one CSV per sheet, named after each sheet), LibreOffice Calc with a small Basic macro, or open each sheet in Excel and Save As → CSV manually. We are not hiding this — it's listed in the comparison table with a yellow warning. Once the underlying converter ships sheet selection, this guide will be updated.
Eight best practices before you convert
Most data-fidelity issues are upstream of the converter. Fix them in Excel first.
- 1 If your data has any non-ASCII text (accents, CJK, emoji), UTF-8 is the right output. If you'll re-open the CSV in Excel itself, you may need a UTF-8 BOM for Excel to detect the encoding correctly. FileHop writes UTF-8 without BOM today — fine for most pipelines, may show mojibake if the file is reopened directly in Excel.
- 2 Format zip-code, phone, and SKU columns as Text in Excel BEFORE saving. Leading zeros only survive if the cell stores them as a string.
- 3 For columns that contain real dates, store them as text in an explicit ISO format (=TEXT(A1,'yyyy-mm-dd') and paste-as-values) before converting if your downstream consumer expects ISO 8601 strings.
- 4 Prefer comma-delimited CSV for cross-tool compatibility (US/UK locale default). Use semicolon-delimited only when sharing with European Excel installs (where Excel defaults to ; because the comma is the decimal separator). FileHop writes commas only today.
- 5 For multi-sheet workbooks, use xlsx2csv --all-sheets or LibreOffice Calc — FileHop writes the first sheet only.
- 6 For files larger than 1 GB or 5M rows, consider Parquet instead of CSV — same data, 10-100× smaller, columnar, and queryable without loading into memory. See /guides/csv-excel-parquet-guide.
- 7 Sensitive workbooks (financial, HR, healthcare, M&A) — always local desktop conversion. Never upload them to a hosted converter, regardless of stated retention policies.
- 8 Validate the output before piping it into your warehouse. Open the CSV in a text editor and spot-check the first 100 rows for encoding, dates, and leading zeros. Cheap insurance against silent corruption.
Free. Offline. No file-size limit. Mac and Windows desktop app.
Open the Excel to CSV Converter