XLSX to CSV Converter

Drop an Excel workbook and export each sheet as CSV — individually or all at once as a .zip. Runs in your browser — no upload.

Drop a spreadsheet here or
  1. Drop an XLSX (or XLS / XLSM / ODS) or click "browse for one".
  2. Pick a sheet from the dropdown.
  3. Click "Convert & Download" for one sheet, or "All sheets as .zip" for the whole workbook.
  4. Output is RFC 4180 CSV — UTF-8, comma-separated, double-quote-escaped where needed.
What does it do?

Reads Excel and OpenDocument spreadsheets via SheetJS (Apache-2.0 fork) and emits each sheet as CSV using SheetJS’ sheet_to_csv. Cell values are coerced to text per the workbook’s native type — numbers stay numbers, dates render in the workbook’s display format, formulas use their cached computed values. Charts, images, and conditional formatting are dropped — CSV cannot represent them.

Common gotchas

XLSX → CSV is mostly mechanical, but a few patterns produce surprising output.

  • Date formatting. Excel stores dates as serial numbers; the displayed format depends on the cell’s number format. The CSV uses whatever Excel renders — `2026-04-26`, `4/26/2026`, or a serial number depending on how the cell is set up. To force ISO 8601, change the cell formatting in Excel before export.
  • Formula results vs. formulas. CSV cannot represent formulas. The output uses each cell’s cached computed value as of the last save. If the workbook was edited and not re-saved, cached values may be stale.
  • Merged cells. Merged cells emit the value in the top-left of the merge; the other merged cells become empty. This is the SheetJS default and matches what most CSV consumers expect.
  • Numbers vs. text. Excel stores `00123` as the number 123 unless the cell type is explicitly Text. The CSV reflects the underlying type. To preserve leading zeros, format the cell as Text in Excel before exporting.
  • Encrypted XLSX. SheetJS Community does not decrypt password-protected XLSX. Open the file in Excel, remove protection, save, then re-drop here.
  • Very large workbooks. Workbooks above ~50 MB can take noticeable time to parse and may strain browser memory. Consider splitting into smaller files or using SheetJS on the command line for large jobs.
Frequently asked questions

Why is the first conversion slow?

SheetJS is ~190 KB gzipped and loads on the first file pick. Subsequent conversions in the same session reuse the cached module — instant.

Are XLS (legacy) files supported?

Yes — SheetJS Community parses .xls (BIFF8), .xlsx, .xlsm, and .ods. Encrypted variants of any of these are not supported.

Does the CSV use my locale’s decimal separator?

No — output is always RFC 4180 with `.` as the decimal point and `,` as the field separator. To get European-style `;`-separated CSV, post-process the output.

Is my workbook uploaded?

No. Everything runs in your browser — your spreadsheet is parsed by SheetJS on this page and never sent to any server.

How are formulas exported?

CSV cannot represent formulas. The output uses each cell’s cached computed value. If you need the formula text itself, that is a different export — open the file in Excel and copy formula columns separately.

Why doesn’t the CSV match what I see in Excel exactly?

Excel’s display layer applies number formatting, conditional rules, and locale settings on top of the raw value. CSV is plain text, so some of that visual styling is intentionally lost. Cell content is preserved; cell appearance is not.