HTML Table to Excel Converter
Get a web table into a spreadsheet that can add it up. Not a paste that arrives as one column, and not a paste where every number is text.
To convert an HTML table to Excel, paste the markup or drop a saved .html file above. Every table on the page is listed; the one you pick becomes an .xlsx with cells typed by column, ISO dates as real date cells, a frozen header and fitted widths. Colspan and rowspan are resolved into a rectangle first.
Want to clean it before you open it? Open the app
Why copy and paste does not work
Selecting a table in a browser and pasting it into Excel gives you one of two outcomes. Sometimes it arrives as a single column of text with the values run together, which is the browser handing over plain text. Sometimes it arrives with the structure intact and every value as text, along with the page's fonts, link colours and background images.
The second is worse, because it looks right. The numbers are right-aligned by the pasted styling rather than by being numbers, so the column looks numeric and will not sum, and the discovery happens after somebody has built a chart on it.
Converting the markup properly means the workbook has types in it from the start.
Every table on the page, not the first one
A real page has more than one table in it. A Wikipedia article has an infobox before the table you want. A financial report has a summary above the detail. A saved dashboard has a legend rendered as a table.
Taking the first one is the default behaviour of nearly every converter on this term, and on a Wikipedia article it means you get the infobox. Here every table is found, labelled with its caption where it has one, listed with its row and column counts, and one click away.
A table nested inside another table's cell is treated as layout rather than data, which is what it almost always is in older markup. Its text stays in the cell that holds it and a note tells you how many were skipped.
What each column becomes
The type is decided once per column, from every value in it, before a single cell is written. A column becomes numeric only when all of its values survive exactly as numbers.
- A figures column becomes numeric cells that sum, sort and chart.
- A code column with a padded value in it stays text, all the way down, and keeps its zeros.
- A column of ISO dates becomes real date cells formatted
yyyy-mm-dd, with the serial computed by UTC arithmetic so no timezone can shift it by a day. - A column of lowercase true and false becomes real boolean cells, which COUNTIF understands and the text "true" does not.
- Everything else is text, holding exactly what the cell held.
The alternative, typing each cell on its own, produces the column where half the values carry the green "number stored as text" triangle and the whole thing refuses to sort as a range.
Colspan and rowspan, resolved rather than ignored
A cell with colspan="3" occupies three columns, and a converter that ignores that produces rows of different widths that then get padded in the wrong places. The value is repeated across the columns it covers, so the rectangle lines up.
A cell with rowspan="2" fills downward into the row below, which is how a merged category label in the first column is meant to read. rowspan="0" means "to the end of this section" and is handled, as is a rowspan that overshoots the last row, which is capped rather than used to invent empty rows.
This is the difference between reading a hand-built HTML table and reading one generated by a reporting tool. The generated ones are rectangles; the hand-built ones are full of spans, and they are the ones people need to convert.
The details that survive the trip, and the ones that do not
A <br> inside a cell becomes a real line break inside a single spreadsheet cell, rather than pushing text into the row below. Whitespace that only existed to wrap the markup is collapsed, because it was formatting rather than data.
Link targets do not come through: a cell containing an anchor gives you the anchor's text, not its href. Cell colours, fonts and background images do not come through either, which is the point.
The sheet is named after the table's caption where it has one, the header row is frozen, and every column is sized to its widest value. All three are things you would do by hand within thirty seconds of opening the file.
Frequently Asked Questions
Why not just copy and paste into Excel?
Because you get either one column of run-together text or a structurally correct paste where every number is text, dressed in the page's fonts and link colours. The second is worse because it looks right until a column refuses to sum.
Is the output a real workbook?
Yes, a real .xlsx. It opens with a double click, with no import wizard and no delimiter question, and that is also what allows the cells to carry types rather than everything being a string.
Do dates come through as dates?
An exact YYYY-MM-DD becomes a real date cell formatted yyyy-mm-dd, with the serial computed by UTC arithmetic so no machine's timezone shifts it. Ambiguous formats like 03/04/2025 stay text, because guessing the country would be worse than not guessing.
What happens to a link inside a cell?
You get the link's text, not its address. If the addresses are the data you want, they are not in the visible table, and the page source is where to go for them.
Does it handle merged cells in the markup?
Yes. A colspan repeats its value across the columns it covers and a rowspan fills it down, which is how a merged category label is meant to read. The result is a rectangle before anything is typed.
Which table do I get if there are several?
The first converts immediately, and all of them are listed with their captions and row counts so you can switch with one click. Nothing on the page is silently ignored except tables nested inside other tables, which are layout, and those are counted in a note.
Move the web table into a spreadsheet
Typed cells, real dates, a frozen header, and every table on the page offered.
Back to the converter