Spreadsheet in, clean data out
Drop a spreadsheet above and get JSON or CSV you can feed straight into a script, an API, or a database seed. The converter handles multi-sheet workbooks (one tab per sheet), understands real Excel date cells, and lets you choose between objects keyed by the header row or plain positional arrays. Everything happens on your device — the file is never uploaded.
This is the missing first step of a common pipeline: someone hands you an .xlsx, and your code wants structured data. Convert it here, then shape the result with our other data tools — round-trip or re-delimit with the CSV ↔ JSON converter, generate types for the rows with JSON → TypeScript, or inspect and pretty-print the output in the JSON formatter.
The preview table shows the first 50 rows so you can sanity-check headers and options before exporting. Conversion problems that are not fatal (like the empty-cell policy not applying in no-header mode) surface as inline notes instead of blocking your output.
Frequently asked questions
Is my Excel file uploaded to a server?
No. The workbook is parsed entirely in your browser by the SheetJS library, which loads on demand the first time you drop a file. Nothing — not the file, not the converted output — ever leaves your device, so confidential spreadsheets are safe to convert here.
Which file formats can I convert?
XLSX (modern Excel), XLS (legacy Excel 97–2003), ODS (LibreOffice and OpenOffice Calc), and plain CSV files. Workbooks with multiple sheets show one tab per sheet, and you can download every sheet at once as a zip.
How are dates handled?
Excel stores dates as serial numbers, which is why naive converters output values like 45678 instead of a date. This tool asks the parser for real date cells and converts them to ISO 8601 strings (like 2026-01-15T00:00:00.000Z), which JSON tooling, APIs, and databases understand directly.
What does the "first row is headers" toggle change?
With it on (the default), the first row becomes the JSON keys and every following row becomes an object — the shape APIs and scripts usually want. With it off, every row including the first becomes a plain array of cells, preserving position instead of names.
How do empty cells come out?
Your choice: as explicit null values (the default, so every row has the same keys) or omitted entirely (smaller output — a key appears only when its cell has a value). In no-header mode cells are positional, so empties always stay null.
Can I get CSV instead of JSON?
Yes — this tool has a JSON/CSV output toggle. The CSV output uses the same quoting and escaping conventions as our CSV ↔ JSON tool, so the two round-trip cleanly: cells containing commas, quotes, or newlines are quoted, and quotes are doubled.