XLSX to CSV Converter — Extract Any Sheet as CSV
Anyone who receives a workbook and needs one sheet as plain text lands here: a developer pulling rows into a local script, a support rep handing data to a system that only accepts CSV, or an analyst checking what a tab contains before an import. The converter unzips the .xlsx container in the browser, lists the sheets it finds, and serializes the chosen sheet with the delimiter you pick. Dates stored as serial numbers can be turned into readable timestamps, and fields holding commas, quotes, or line breaks come out properly quoted. The parsing itself is local JavaScript built on JSZip and XML reading, so the workbook never gets uploaded.
No workbook loaded yet.
How the converter works
An .xlsx file is a zip package, and the first job is opening it. The reader loads the bytes with JSZip, finds the workbook part to list the sheet names, follows the relationships file to the worksheet itself, and pulls shared strings and styles when they exist. Sheet names are read from the workbook list, so the picker shows exactly what the file declares. None of that depends on a spreadsheet application being installed, because the same parts are parsed on every platform the browser runs on.
Inside a sheet, cells are matched by their reference, so a row that starts at column D still produces three empty leading fields and the column count stays aligned across rows. Shared strings resolve through their index, inline strings are read directly, booleans print as TRUE and FALSE, and Excel error values such as #N/A pass through as text. Rows where every cell is empty are filtered out unless the keep empty rows option is on, while a gap in the middle of a row still yields an empty field.
Dates are the part that surprises people. A date cell holds a serial number, and the style attached to it says how that number should read; builtin format ids 14 to 22 and 45 to 47 mark a date, as do custom format codes containing a y or a d. With the date option checked, those serials are rewritten as ISO timestamps and the stats line counts how many were converted. With it off, the raw serial reaches the output as written.
The writer then walks each row and wraps a field in double quotes whenever it contains the selected delimiter, a quote character, or a line break. Quotes inside a wrapped field are doubled, which is the rule every RFC 4180 reader expects. Switching on quote every field wraps all of them, and changing the delimiter re-runs the conversion immediately once bytes are loaded.
Before and after
workbook.xlsx [Sheet1] [Sheet2]
A B C
1 Name Department Years
2 Ada Lovelace Research 7
3 Grace, Hopper Engineering 12 Name,Department,Years
Ada Lovelace,Research,7
"Grace, Hopper",Engineering,12 Use cases
| Developer | Production | Workflow |
|---|---|---|
| Sheet data feeds a local script that writes test fixtures | Support exports a customer workbook to CSV for a one-off import | An agency merges 20 client sheets into a single loader file |
| A test reads rows from a fixture workbook without a spreadsheet library | Ops hands finance a semicolon CSV that matches their locale | Each client tab is converted and attached to the same ticket |
| A build step checks column counts before a schema migration | A stale archive is re-saved as .xlsx and split per tab | Weekly reports arrive as one workbook and leave as dated CSV files |
Common mistakes
- Treating an .xls file as loadable. The old format is a binary stream, so the zip signature check fails and the error line says so; re-save the workbook as .xlsx first.
- Reading a serial number as a date by eye. 45427 is a date only when the cell style says so, and the date option is what turns it into 2024-05-14.
- Leaving the delimiter at comma for a semicolon importer. The row arrives as one long field and the mapping step reports a column count of 1.
- Expecting every blank row to survive. Rows with no content at all are filtered by default, so switch the keep empty rows option on when positions matter.
- Downloading before checking the sheet picker. A workbook with three tabs exports the tab that is currently selected, not all three at once.
Best practices
- Match the delimiter to the importer rather than to the app you use locally; semicolon regions and comma regions both exist, and the receiving tool decides which one works.
- Read the stats line after each change. A row count that drops usually means empty rows were filtered, and a column count that collapses points at the delimiter.
- Leave date conversion on when the destination is a database or a script, and turn it off when the destination reads serial numbers itself.
- Copy for small snippets and download for anything you will re-import, because the saved file keeps the sheet name as its file name.
- Convert one tab per pass and name each download after its tab, which keeps the mapping obvious when the files meet a loader later.
Frequently Asked Questions
Can this convert an .xls file, or only .xlsx?
Only .xlsx and the other zipped spreadsheet formats are read here, because the converter opens the file as a zip and walks its XML parts. The older .xls format is a single binary stream with a different internal structure, so there is no zip signature to find and no sheet XML to parse. When an .xls is selected, the error line reports that the zip signature is missing. Save the workbook as .xlsx from your spreadsheet app first, then load it again.
Why do dates come out of my sheet as numbers?
Excel stores a date as a serial number counting days from 30 December 1899, and the cell style is what makes that number look like a date on screen. The converter reads those styles, and with the date option checked it rewrites serials in date-formatted cells as ISO timestamps such as 2024-05-14. When the option is off, or when a date-looking value carries a plain number format, the raw serial passes through unchanged. Builtin format ids 14 to 22 and 45 to 47 count as date formats, along with custom format codes that contain a y or a d.
My workbook has several sheets. Do I get them all at once?
No, one conversion produces one CSV, and the sheet picker chooses which tab is read. Load the workbook, pick a sheet from the list, and the output updates as soon as the selection changes. Repeat for each tab you need and download each result separately. The two-sheet preset on this page shows the picker in action, with Orders and Refunds available side by side.
Does my workbook leave this browser?
No, the file is read from your disk into page memory and never sent anywhere. The zip reader, the XML parsing, and the CSV writer are local JavaScript, so no request carries a row or a sheet name. The only network traffic on the page is the ordinary layout load and the analytics script, neither of which sees your file. Closing the tab releases the bytes that were held for conversion.
Why did empty rows disappear from the output?
Rows where every cell is empty are dropped by default, which removes the blank spacer lines spreadsheets often carry between sections. The keep empty rows option turns that filter off when the position of a row matters to the import on the other end. A missing cell in the middle of a row is treated differently, because a column gap still produces an empty field and keeps the column count stable. Both behaviours follow the option set at conversion time.
Which delimiter should I choose?
Comma is the default and matches what most importers expect, while semicolon is the usual separator in locales where the comma is the decimal mark. Tab and pipe are there for loaders that accept them, and the selected separator is written between every field in the output. A field containing the delimiter, a quote, or a line break is wrapped in quotes so the row keeps its shape. Match the choice to the importer you are feeding rather than to the app you open locally.
Where does the CSV go after conversion?
It sits in the output box on this page, where you can select it and copy it straight into another application. The copy button places the whole text on the clipboard, and it reverts to its normal label after a moment. The download button writes a Blob and saves a file named after the sheet, such as Orders.csv. Nothing is written to disk until you press download.
Related Tools
How to convert XLSX to CSV
- Load a workbook Pick an .xlsx file from disk or press a preset button; the bytes are read into this tab and the sheet list fills in.
- Choose a sheet Open the sheet picker and select the tab to export; the conversion runs again against the newly selected sheet.
- Set the output options Pick comma, semicolon, tab, or pipe as the separator, and switch quote every field, keep empty rows, or date conversion on or off.
- Copy or download the CSV Read the row and column counts in the stats line, then press Copy for the clipboard or Download for a file named after the sheet.