Guide · Excel → table

Excel to HTML: formulas and formatting

A spreadsheet holds more than its contents: formulas behind the numbers, number formats over them, merges across them. HTML has none of that.

So the question isn't whether things are lost — it's which things, and whether any of them are the ones you needed.

Open the converter

Formulas become their answers

A cell containing =SUM(B2:B9) comes out as 4211. That's almost always what you want in a web page — a formula on a page is a string, and a string that looks like a formula is worse than the number.

It works because Excel caches the calculated value next to the formula every time it saves. The converter reads the cached value, which is why it doesn't need a formula engine of its own.

Cell in Excel
B10:  =SUM(B2:B9)
HTML
<td>4211</td>

The one case where they come out empty

If the workbook was generated by a script — a Python export, a reporting job, something using a spreadsheet library — and never opened in Excel, there's no cached value. Nothing wrote one. Those cells convert to empty.

The fix is to open the file in Excel or LibreOffice and save it once. That calculates everything and writes the values in. The converter warns you when a sheet's formula cells read as empty, so you're not left guessing.

Formula errors also come out empty rather than as #DIV/0! or #REF!. A sheet with a broken lookup down one column produces a column of blanks, so it's worth checking the source when a column turns out empty for no obvious reason.

Number formats don't survive

This is the surprise most worth knowing in advance. A number format is a mask Excel paints over a value; the value underneath is plain.

So $1,234.50 converts to 1234.5 — currency symbol, thousands separator and fixed decimals all gone. A cell showing 12.50% converts to 0.125, because that's the number that was always there.

If the formatting matters in the output, add a column in the spreadsheet with the formatted string built by a TEXT() formula, and use that column instead. Then it's a string, and strings come through exactly.

Dates are the exception: they're detected by their number format and come out as 2026-03-14, or with a time appended if there is one. Read back in UTC on purpose — the naive version shifts every date back a day for anyone west of Greenwich.

Merged cells split

A title merged across A1:C1 becomes one cell with the text and two empty cells beside it. Excel keeps the value in the top-left cell and leaves the rest genuinely empty; without the merge information, that's what there is to read.

HTML can express a merge with colspan and rowspan, so the fix is a one-line edit afterwards. Or unmerge in Excel first — often the merges were only there to centre a heading anyway.

Sheets, and the size ceilings

Two limits. 10 MB per workbook — lower than the 25 MB for other formats, because an .xlsx is a zip and unpacking it in a tab costs far more memory than its file size suggests. And 100,000 cells across everything you've selected, which is why picking fewer sheets can get a large workbook through.

Password-protected workbooks are refused rather than half-read, as are the old binary .xls files. Save as .xlsx first for those.

  1. 01The first sheet is converted by default. The rest are listed by name, so tick the ones you want.
  2. 02Pick several and each comes out as its own <table> with an <h2> above it carrying the sheet name. Pick one and the name goes in the table's <caption> instead.
  3. 03A sheet that's empty after trailing blank rows are trimmed says so, rather than producing an empty table.

Drop the workbook, pick your sheets, and copy the table out. Everything is read in your browser — a financial model never leaves your machine.

Excel → table