Spreadsheet to HTML table
Paste a range of cells and get table markup a screen reader can find its way around, with real header cells, a caption and tidy numbers. The checks tell you what to fix in the sheet before you publish.
The conversion runs in your browser. Your cells are not uploaded or stored.
Checks
Preview
In “For WordPress” mode the preview is neutral: on your site, your theme provides the fonts, colors and borders.
HTML code
A table read one cell at a time
When you look at a table, your eyes hop to the top of the column to remember what a number means. Someone using a screen reader hears one cell at a time and can’t glance up. So the markup has to carry the link between a value and its header.
<table>
<caption>Sales by region, 2026</caption>
<thead>
<tr><th scope="col">Region</th><th scope="col">Revenue</th></tr>
</thead>
<tbody>
<tr><th scope="row">North</th><td>$4,200</td></tr>
</tbody>
</table>With scope="col" and scope="row", the cell is announced as “North, Revenue, $4,200”. The caption is read when the user enters the table, so they can decide whether it’s worth exploring. A screenshot of a spreadsheet gives them none of this. It also can’t be searched, and it blurs when zoomed.
How your cells are read
When you copy from Excel, Google Sheets or LibreOffice, an HTML version of the range lands on the clipboard. The tool reads that version first, which is how merged cells survive as colspan and rowspan.
For typed text or a CSV file (up to 5 MB, read as UTF-8, otherwise as Windows-1252), the tool has to work out the separator. If there’s a tab character anywhere, that settles it. Otherwise it tries the semicolon, the comma and the vertical bar on the first 30 rows and keeps the one that gives the most regular column count. Empty rows and columns around the data are trimmed.
The header is the first row. If a cell in that row is merged downward, the header grows to cover it, up to three rows.
What happens to numbers and dates
A column counts as numeric when at least 80 percent of its filled cells parse as numbers. Numeric columns are right-aligned so the digits line up.
| In the sheet | Understood as | US style output |
|---|---|---|
1 234,5 $ | amount | $1,234.5 |
($2,400.00) | negative amount, accounting notation | -$2,400.00 |
12,5 % | percentage | 12.5% |
2026, 00417 | year or code | unchanged |
5/3/2026 | date, order unknown | see below |
Whole numbers with no symbol are left alone unless their column also holds amounts, so your years and reference numbers don’t pick up a thousands separator. A value starting with zero is a code and never gets touched. For the ambiguous 1,234, the tool looks at how the rest of the sheet writes decimals before deciding.
Dates are rewritten as YYYY-MM-DD, the one order nobody misreads. To find out whether a column is day-first or month-first, the tool looks for a value above 12 in one position. When no cell settles it, the dates stay as typed and the checks tell you how many.
The dollar sign is the only currency symbol recognized. Cells written with €, £ or a currency code are kept as text. They aren’t reformatted and don’t count toward a numeric column.
Reading the checks
- No header row, or the first row looks like data (more than half of it is numbers or dates): add a row of titles in the sheet.
- Columns without a title: an empty header cell leaves a screen reader with nothing to announce.
- No caption: one short phrase will do.
- Merged cells kept: valid, but harder to navigate. Unmerging and repeating the value is kinder.
- Empty rows or columns: they’re spacing in a spreadsheet and clutter on a web page.
- Wide table: more than five columns with sideways scrolling switched off.
When none of the warnings apply, a line confirms that the structure is accessible.
Two kinds of output
- For WordPress
- The table sits in a
<figure class="wp-block-table">with almost no styling, so your theme draws it like any other table. Paste the code into a Custom HTML block. - Standalone
- The code comes with a short
<style>block tied to a unique class name, for any other site or a page of its own. You can also download it as a complete.htmlfile.
With scrolling on, the wrapper gets role="region", tabindex="0" and a label taken from the caption. Keyboard users can then focus the area and scroll it with the arrow keys.
Only cell values make the trip. Formulas, cell colors, bold text, column widths and number formats that exist only in the spreadsheet’s display settings stay behind.
Questions people ask
How do I convert an Excel table to HTML?
Select the cells in Excel, copy them, and paste them into the box on this page. Check that the first row holds your column titles, type a caption, then copy the generated code into your page.
What does scope="col" do in a table?
It tells assistive software that a header cell labels the whole column below it. When a user moves to a data cell, the software reads the header first. scope="row" does the same for the cells to the right of a row header.
Should I publish a table or an image of my spreadsheet?
A table. Text in an image can’t be read aloud, searched, translated, copied or resized, and on a phone nobody can make it out. Search engines can’t read the figures either.
Are merged cells allowed in an HTML table?
Yes, with colspan and rowspan, and this tool keeps them. They make navigation harder for screen reader users, so use them for grouped headers and keep them out of the data rows.
Why were my dates not converted?
A value such as 03/04/2026 can mean March 4 or April 3. If no date in the same column has a number above 12 to settle the order, the tool leaves them all as typed. Write dates as YYYY-MM-DD in the sheet and the doubt goes away.
How do I make a wide table fit on a phone?
Keep the scrolling option on. The table then slides sideways inside its own box while the rest of the page keeps its width. Dropping the columns phone readers don’t need helps more than shrinking the text.