Embed this tool on your site
About this tool
XLSX to JSON converts Excel workbooks (.xlsx, .xls) into a JSON array that any modern API or database can consume. Upload a workbook, pick which sheet to convert, choose whether the first row is a header (used as object keys) or whether to auto-name columns col1, col2, …, and decide on type handling. With Coerce numbers & booleans on (the default), the tool reads the text each cell displays and turns plain integers, decimals and lowercase true/false into JSON numbers and booleans, so "42" becomes 42; Excel TRUE/FALSE cells and formatted numbers like 1,234.50 stay strings. With it off, you get Excel's own cell values: numbers, booleans, text and dates as serial numbers. The tool uses SheetJS, loaded from cdnjs when you pick a file. The conversion runs in your browser via the File API — your spreadsheet never reaches a remote server. Output JSON is pretty-printed and can be copied or downloaded as a .json file.
Why use it
Browser-Only Privacy: Files are parsed in your tab via the File API and SheetJS — Excel data with customer records, salaries, or financial details never reaches a remote server.
Multi-Sheet Workbooks: Every sheet in the workbook is available in the picker, so you can convert each sheet on demand without splitting the file beforehand.
Header Row Option: Choose between using row 1 as object keys (the standard "first row is header" convention) or treating all rows as data with auto-generated column names.
Two Type Modes: Coercion turns displayed numbers and lowercase true/false into JSON types; switching it off returns Excel's native numbers, booleans and date serials instead.
Native Excel Format Support: SheetJS handles both .xlsx (OOXML) and legacy .xls (BIFF) binary formats — no need to convert files first in Excel.
Direct Download: Save the JSON output as a file with the original workbook name and sheet name embedded, ready to commit or send to teammates.
How to use
- Click the Upload XLSX or XLS file button and pick a workbook from your device.
- Once parsed, choose which sheet to convert from the dropdown — multi-sheet workbooks all become available.
- Pick header mode: First row is header to use row 1 as object keys, or No header to auto-name columns col1, col2, ….
- Leave Coerce numbers & booleans on to parse displayed text like 42 or true into JSON types, or turn it off to keep Excel's own cell types.
- Click Convert to produce the JSON array and review it in the output panel.
- Copy the JSON to clipboard or click Download .json to save it to disk.
When it helps
- Migrating data from a customer-supplied Excel sheet into a Node.js, Python, or REST API pipeline that expects JSON.
- Generating fixtures for application tests from a hand-edited Excel file maintained by non-developers.
- Producing seed data for a database from a spreadsheet that finance or operations teams update weekly.
- Converting a single sheet of a multi-sheet Excel report into JSON for visualisation in a dashboard.
- Pre-processing Excel exports from legacy ERP systems before importing into a modern SaaS API.
- Quickly inspecting the structure of an unfamiliar Excel file by viewing it as JSON in the browser.
Examples
01Sheet with header row + coercion on
InputExcel sheet:
| id | name | score |
|----|-------|-------|
| 1 | Alice | 9.5 |
| 2 | Bob | 7 |
Expected result · Scroll for more[
{
"id": 1,
"name": "Alice",
"score": 9.5
},
{
"id": 2,
"name": "Bob",
"score": 7
}
]
02Sheet with no header (auto-named columns)
InputExcel sheet:
| Alice | 30 |
| Bob | 28 |
Expected result[
{
"col1": "Alice",
"col2": 30
},
{
"col1": "Bob",
"col2": 28
}
]
03Coercion off keeps Excel's own types
InputExcel sheet (zip typed as text, qty a number, active a TRUE cell):
| zip | qty | active |
| 01234 | 5 | TRUE |
Expected result[
{
"zip": "01234",
"qty": 5,
"active": true
}
]
Tips
- Coerce numbers & booleans is on by default — turn it off when string-formatted values like ZIP codes or phone numbers must keep their leading zeros.
- If your Excel file has a multi-row header (e.g. category + subcategory), pre-merge it to a single header row in Excel first; the tool only treats one row as header.
- For very large workbooks (>50 MB), browser memory becomes the limit — split into smaller files or use a server-side parser like Python's openpyxl.
- The download is named <workbook>-<sheet>.json using the sheet name as-is, so rename the file if the sheet name contains spaces or symbols.
- With coercion on, dates appear as the date text Excel shows; with it off they appear as serial numbers — pick the mode that suits your downstream code.
Frequently Asked Questions
Is my Excel file uploaded to a server?⌄
No. The file is read via the browser File API and parsed in-memory by SheetJS. The contents — including PII, financials, or proprietary data — never cross the network.
Does it support both .xlsx and .xls files?⌄
Yes. Modern .xlsx (Office Open XML) and legacy .xls (BIFF binary) are both supported through SheetJS. The file picker only offers .xlsx and .xls; SheetJS can also read macro-enabled .xlsm files (macros are not executed), but you need to rename or pick them with an all-files filter.
What about multi-sheet workbooks?⌄
All sheets are exposed in the picker dropdown after upload. Convert one sheet at a time; switch sheets without re-uploading the file.
Why are my dates appearing as numbers like 44927?⌄
With Coerce numbers & booleans off, the tool returns raw cell values, and Excel stores dates as serial numbers (days since 1900-01-01). With it on, dates come out as the text shown by the cell's date format instead. To convert serials in code, use new Date((n - 25569) * 86400000).
How are formulas handled?⌄
SheetJS reads the cached calculated value, not the formula string. So if cell A1 contains =SUM(B1:B10), the JSON shows the sum value, not the formula.
What is the maximum file size?⌄
There is no hard limit, but browser memory becomes the bottleneck. Files up to 50-100 MB usually work; very large workbooks may freeze the tab during parsing.
Are merged cells handled?⌄
SheetJS reads merged cells as if only the top-left has a value, with the other cells being empty. The JSON output reflects this — merge regions appear as a single value followed by null.
Can I convert all sheets at once?⌄
Not in this tool — for performance and clarity, conversion is one sheet at a time. To convert all sheets, repeat the action for each sheet name in the picker; the JSON output is independent.
Why do Excel TRUE/FALSE cells or 1,234.50 come out as strings?⌄
With Coerce numbers & booleans on (the default), the tool reads each cell's displayed text and only converts plain integers, plain decimals and lowercase true/false. Excel boolean cells display as TRUE/FALSE, and numbers with thousands separators, currency or percent formats keep their symbols, so they stay strings. Turn coercion off to get Excel's own numbers and booleans.
Glossary
- XLSX
- The modern Excel file format, based on Office Open XML (OOXML) packaged in a ZIP archive. Standard since Excel 2007 and the default for new workbooks.
- XLS
- The legacy Excel binary format (BIFF), used by Excel 97-2003. Still common in enterprise software exports — handled by this tool through SheetJS.
- SheetJS
- An industry-standard JavaScript library for reading and writing spreadsheet formats including XLSX, XLS, CSV, and ODS. Loaded from CDN only when a file is selected.
- Header row
- The first row of a sheet, conventionally containing column names. When enabled, those names become object keys in the JSON output.
- Type coercion
- Converting string values that look like numbers or booleans into their native JSON types. Optional — disable when values must keep their original string form (e.g. ZIP codes with leading zeros).
- Sheet
- One tab within an Excel workbook. Workbooks can contain many sheets; this tool converts one sheet at a time and shows them all in a picker dropdown.
A LITTLE HELP. A LOT DONE.
Good tools.
Great flow.
Your shortcut to the everyday. Create, convert, calculate,
and get back to what you love.
✳
✳
✓ Free to use✓ No sign-up✓ 500+ possibilities