HTML Table Generator
Fill in a grid — or paste a selection straight from a spreadsheet, which arrives tab-separated and is split into rows and columns automatically — and get clean HTML with real table semantics: a thead with scoped header cells, a tbody, an optional tfoot and a caption. That structure is what lets a screen reader announce which column a cell belongs to. Optional CSS, striping and a responsive scroll wrapper are included, and every cell is escaped. Everything is generated in your browser; nothing is uploaded and no result is recorded anywhere.
How it works
Fill in the grid below — or paste a selection straight from a spreadsheet, which arrives tab-separated and is split into rows and columns automatically. The markup updates as you type.
The output uses real table semantics: a thead withth scope="col" cells, atbody, an optionaltfoot and a caption. That structure is what lets a screen reader announce which column a cell belongs to instead of reading a wall of numbers.
Cell content is escaped, so pasted text containing angle brackets becomes visible characters rather than markup.
The last row becomes the footer rather than an extra row being added, so the row count stays what you set.
Frequently asked questions
Can I paste data from a spreadsheet?
Yes — copy a range from Excel, Numbers or Google Sheets and paste into any cell. Spreadsheets put tab-separated text on the clipboard, so the paste is split into rows and columns and the grid resizes to fit.
What makes the generated table accessible?
Header cells use th with a scope attribute, the sections are marked up as thead, tbody and tfoot, and the caption is a real caption element. Together these let a screen reader announce which column a cell belongs to rather than reading a wall of numbers.
What does the responsive option do?
It wraps the table in a container that scrolls horizontally. A wide table without one forces the whole page to scroll sideways on a phone, which breaks every other element on it.
Is my content escaped?
Yes. Angle brackets, ampersands and quotation marks in your cells become visible characters rather than markup, so pasted text containing HTML shows as text instead of being interpreted.
Why does the footer not add an extra row?
The last row becomes the footer instead, so the row count stays what you set. That matches how a totals row usually works — it is one of your rows, marked up differently.
Related tools
JSON to HTML Table Converter
This JSON to HTML converter builds a real table from an array of objects.
CSV to HTML Table Converter
This CSV to HTML converter builds a proper, accessible table with every cell escaped.
HTML Formatter & Beautifier
This HTML formatter re-indents markup using a real parser, so nesting and inline elements are handled correctly.