EatSheet.xlsx
npm Try a sample
A1
=SHOW("any.xlsx", styled, fast, without_freezing_the_page)

Excel files in the browser, looking like Excel files.

EatSheet
Fonts, colours, borders, merged cells, conditional formatting and recalculated formulas, in a 27 KB library that does its parsing in a Web Worker.
npm install eatsheet

50,000-row workbook

EatSheet
SheetJS
Open in Node
128 ms
546 ms
First view in the browser
131 ms
1,142 ms
Longest page freeze
none
1,141 ms
Memory
16 MB
85 MB
Gzipped size
27 KB
328 KB
Plain-text workbook, compared with SheetJS 0.20.3. Figures are medians of 7 benchmark runs.
import { openWorkbook } from 'eatsheet/worker';
import 'eatsheet/eatsheet.css';

const book = await openWorkbook(file);
container.innerHTML = (await book.render(0)).html;
Good fit: previewing files people upload, in a data room, a document portal or an internal tool.
Reads, doesn't write: EatSheet opens .xlsx, .csv and .tsv. It doesn't create files or read .xls, .xlsb or .ods.

Frequently asked questions

Is EatSheet a SheetJS alternative?

Yes, if you only need to read and show files. EatSheet opens XLSX, CSV and TSV and renders them with their styles. It doesn't write files or read .xls, .xlsb or .ods.

Is EatSheet free?

Yes. It's open source under the Apache-2.0 license, with no paid edition, and styling is included.

Are my files uploaded anywhere?

No. EatSheet parses files on the device in a Web Worker and sends no telemetry. It only makes a network request if you give it a URL to load.

Does it work with React, Vue, Next.js, Angular or Svelte?

Yes. EatSheet has no framework dependency: it returns HTML that you put in an element. There are full examples for React, Vue, Next.js, Angular and Svelte.

Can it edit spreadsheets?

No. EatSheet is a viewer. If people need to change cells, use a spreadsheet editor component instead.

Does it calculate formulas?

It recalculates common functions while opening the file. For anything it doesn't support, it shows the result Excel saved in the file and marks that cell's status as unsupported.

How large a file can it open?

Files up to 25 MB by default, with up to 5,000,000 stored cells per sheet. In testing, a 23 MB workbook with 300,000 rows opened in under a second. Only the rows in view are rendered, so long sheets stay quick to scroll. Large files use more memory, and files that unzip to far more than their size are refused.

Is it safe with files from strangers?

It has built-in limits against zip bombs, XML entity attacks and oversized files, and it always escapes cell content. It refuses encrypted files and old .xls files with a clear error code.

Which browsers does it support?

Chrome 103+, Firefox 113+ and Safari 16.4+. Reading files on a server works in Node.js 20.12+.

Add it to your app

import { openWorkbook } from 'eatsheet/worker';
import 'eatsheet/eatsheet.css';

const book = await openWorkbook(file);
container.innerHTML = (await book.render(0)).html;
Does something look wrong? Compare it with Excel, then check the file for a bug. A qualifying bug pays $10.