Excel to JSON Converter - XLSX, XLS, ODS & CSV to JSON avatar

Excel to JSON Converter - XLSX, XLS, ODS & CSV to JSON

Pricing

from $6.00 / 1,000 spreadsheet converteds

Go to Apify Store
Excel to JSON Converter - XLSX, XLS, ODS & CSV to JSON

Excel to JSON Converter - XLSX, XLS, ODS & CSV to JSON

Convert Excel (XLSX, XLSM, XLS, XLSB), ODS, CSV and Google Sheets files to clean JSON: all or selected sheets, header-row auto-detection, merged-cell fill, ISO dates and typed numbers. Reverse mode exports any dataset, JSON or CSV to a styled XLSX. Pay per file.

Pricing

from $6.00 / 1,000 spreadsheet converteds

Rating

0.0

(0)

Developer

Cemal Atakli

Cemal Atakli

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Categories

Share

Excel to JSON Converter: XLSX, XLS, ODS & CSV to JSON (and JSON to Excel)

Convert Excel spreadsheets to JSON in seconds. Give it a URL of an XLSX, XLSM, XLS, XLSB, ODS, CSV or TSV file, or a Google Sheets link, and get clean, typed JSON back. You can choose one JSON object per row in an Apify dataset, or one JSON file per sheet. Messy real-world sheets are handled for you:

  • Title rows and offset tables are skipped, and the header row is detected automatically.
  • Merged cells are filled in.
  • Dates come out as ISO 8601, and numbers and booleans come out as real JSON types.

The converter also works the other way. JSON to Excel turns any Apify dataset, JSON URL or CSV URL into a styled XLSX with a bold frozen header, filters, auto-sized columns and, optionally, one sheet per category.

No API key, no browser, no code. $0.006 per file.

What it does

  • Formats: XLSX, XLSM (macros are ignored), XLS (Excel 97-2003), XLSB, ODS (LibreOffice / OpenOffice), CSV and TSV. The format is detected from the file content, so a CSV saved as .xls still works.
  • Links: direct URLs, Google Sheets (shared as "Anyone with the link", all tabs), Google Drive, Dropbox, OneDrive and GitHub links. You can also upload a file in the input form.
  • All sheets or selected ones, by name or number. Hidden sheets are skipped unless you ask for them.
  • Header auto-detection:
    • Skips report titles, blank rows and tables that don't start in A1.
    • Combines two-row grouped headers (Q1 above Sales / Units → Q1 Sales, Q1 Units).
    • Can also be told exactly which row holds the header, or that there is no header row.
  • Merged cells are filled into every row and column they span (e.g. a Region merged over 5 rows).
  • Clean types:
    • Dates become 2024-05-31 or 2024-05-31T14:30:00.
    • 5.0 becomes 5, and floating-point noise is removed.
    • Booleans stay booleans.
    • In CSV, numbers and true/false are detected, while IDs with leading zeros (00123) stay text. European 1.234,56 is supported too.
  • Skips empty rows and empty columns, and drops repeated header rows found in multi-page exports.
  • Column names: as in the file, or normalised to camelCase / snake_case. Duplicate names get _2, _3.
  • Traceability: each row gets _file, _sheet and _row (the original row number in the sheet).
  • Big files: a fast Rust engine (calamine) handles typical files. Sheets too large for memory are streamed with openpyxl read-only mode. 200,000 rows × 10 columns took about 6 s in a local test.
  • Encoding and delimiter detection for CSV: UTF-8, UTF-8 BOM, UTF-16 and Windows-1252; , ; tab |.
  • Per-file errors never stop the run. A broken link or a PDF gives a free error row and the other files continue.

Use cases

  • Feed Excel data into an API, database, n8n/Make/Zapier flow or LLM/RAG pipeline as JSON.
  • Import supplier price lists, product catalogs or inventory sheets that start with logos, titles and merged headers.
  • Read every tab of a Google Sheet as JSON without the Google Sheets API.
  • Convert legacy .xls / .ods archives to modern JSON in bulk.
  • JSON to Excel: send any scraper's dataset to a client as a nicely formatted Excel file, with one sheet per country or category.

Input example

{
"fileUrls": [
"https://go.microsoft.com/fwlink/?LinkID=521962",
"https://docs.google.com/spreadsheets/d/<id>/edit#gid=0"
],
"sheets": [],
"headerCase": "snake_case",
"outputMode": "rows"
}

Reverse mode (JSON → Excel):

{ "mode": "toExcel", "datasetIds": ["<datasetId>"], "groupByField": "country", "outputFileName": "leads" }

Output example

One dataset item per spreadsheet row:

{
"Segment": "Government", "Country": "Canada", "Product": "Carretera", "Units Sold": 1618.5,
"Sale Price": 20, "Sales": 32370, "Profit": 16185, "Date": "2014-01-01",
"_file": "Financial Sample.xlsx", "_sheet": "Sheet1", "_row": 2
}

A messy sheet with a title row, a grouped two-row header and a vertically merged Region:

{"Region": "North", "Q1 Sales": 1200.5, "Q1 Units": 10, "Notes": "ok", "_row": 6}
{"Region": "North", "Q1 Sales": 300, "Q1 Units": 3, "Notes": null, "_row": 7}

With outputMode: "jsonFiles" each sheet becomes one JSON array in the key-value store (for example Financial_Sample-Sheet1.json), and the dataset gets one summary row per sheet with a jsonUrl download link. The OUTPUT record summarises every file: sheets, header rows, column names, row counts and what was charged.

Pricing (pay per event)

EventPrice
Spreadsheet converted (all sheets, first 10,000 rows)$0.006
Each further 10,000 rows$0.002
XLSX workbook created (JSON → Excel)$0.006
Dataset row (dataset output mode only; free in JSON-file mode)$0.02 per 1,000 rows
Actor start$0.00005

Failed, empty or unsupported files are free. Set a maximum cost per run and the Actor stops cleanly at that limit.

ActorPrice per small file
This Actor$0.006 + $0.02 per 1,000 dataset rows (a 500-row file ≈ $0.016)
eliai/excel-to-json$0.03
glistening_film (Excel to JSON)$0.01

Competitor prices are from the Apify Store on 2026-10-16.

FAQ

Are formulas evaluated? You get the value Excel saved with the file, which is what you see in Excel. A formula in a file that was generated by a script and never opened in Excel has no saved value, so it comes back as null.

How are dates returned? As ISO 8601 strings: 2024-05-31 when the cell holds a date only, and 2024-05-31T14:30:00 when it also has a time. Times are returned as 14:30:00.

The header was detected wrongly. Set headerRow to the row number of the header, and headerRowCount if the header spans several rows. Use headerRow: 0 for sheets without a header (columns are named column_A, column_B, ...).

Password-protected files? These are not supported. They come back as a free error row.

Google Sheets? Share the sheet as "Anyone with the link can view" and paste the normal URL. All tabs are converted.

Is there a size limit? 200 MB per file by default (maxFileSizeMb, up to 2 GB). Very large sheets are streamed, so memory use stays flat.

How do I get Excel back out? Use mode JSON → Excel with the dataset ID of any run, or with a JSON or CSV URL.

Use with AI agents (Apify MCP)

This Actor works as a tool in the Apify MCP server, so Claude, ChatGPT, Cursor and other agents can call it to read spreadsheets as JSON. For example: "Convert this XLSX to JSON and tell me the top 5 products by profit". Agents can also call it to produce Excel files, for example "Export these results to an Excel sheet per country". Inputs are plain URLs and the output is typed JSON with column names, so agents can use it without extra parsing. Call it from code with the Apify API or client (apify-client for JS/Python) using the input shown above.