Paste or drop a spreadsheet export and get a table you can put on a website.
Drop a .csv, .tsv or .txt file onto this box, or use Open file. Nothing is uploaded until you publish.
12 rows
| 0042 | Bracket, heavy duty | Fixings | 12.50 | 240 | 2026-08-14 | Empty |
| 0107 | Oak shelf 1200mm | Timber | 38.00 | 54 | 2026-08-19 | Cut to order |
| 0113 | Screws, 4x40mm (box of 200) | Fixings | 6.75 | 1180 | 2026-08-21 | Empty |
| 0128 | Pine batten 2400mm | Timber | 4.95 | 0 | 2026-08-02 | Back in stock in September, ask in store |
| 0139 | Wall plug assortment | Fixings | 3.20 | 860 | 2026-08-23 | Empty |
| 0146 | Sandpaper, 120 grit | Finishing | 1.85 | 430 | 2026-08-11 | Empty |
| 0152 | Danish oil 500ml | Finishing | 14.40 | 96 | 2026-08-27 | Empty |
| 0161 | Birch ply 8x4 18mm | Sheet | 64.00 | 17 | 2026-08-05 | Empty |
| 0175 | Hinge 75mm brass | Fixings | 2.40 | 512 | 2026-08-29 | Empty |
| 0188 | Beeswax polish 250ml | Finishing | 9.95 | 73 | 2026-07-30 | Empty |
| 0194 | MDF 8x4 12mm | Sheet | 29.50 | 31 | 2026-08-18 | Empty |
| 0203 | Dowels, 8mm (bag of 50) | Timber | 3.60 | 204 | 2026-08-25 | Empty |
This is what the code does — the headers really sort and the search really filters. Building a table by hand instead? HTML Table Generator. Need the data, not the markup? CSV to JSON.
Type decides how a sortable column sorts: Number compares 9 and 100 properly, Text compares them as words. A column of leading-zero identifiers — SKUs, room numbers, phone numbers — is left as Text on purpose. Changing the type never rewrites a cell; the zeros are always still in the markup.
How It Works
Paste the contents of a CSV, or drop a .csv, .tsv or .txt file onto the left pane. Commas, semicolons, tabs and pipes are all detected, so an Excel export from a European machine works with no settings.
Switch on sortable columns, a search box or a sticky header, choose borders, padding and what should happen on a phone, then rename, hide, align or retype any column in the Columns strip.
Take a complete page, a fragment with its CSS, or markup with class names only. Copy it, download it, or publish the whole table as a live page on a free link.
About This Tool
Anyone can join cells with a <td>. The hard part is a table that sorts, filters, and does not fall off the side of a phone.
This tool takes a CSV or Excel export and gives you the HTML for it — but the conversion is the easy half. The output is the point. Switch on sortable columns and the generated code carries about thirty lines of plain JavaScript that sort a column when its header is clicked, numerically where the column holds numbers. Switch on the search box and rows that do not match what is typed are hidden, with a live count. A sticky header keeps the column names in view down a long table. None of it needs a library, a framework or a build step: it is a <style> block, a <table> and a <script> you can read.
Anyone holding a file they did not write. A shop owner with a stock list, a treasurer with a fixtures table, a teacher with a results export, someone whose data came out of a chat with an assistant and now has to go on a page today. You do not need to know what a <thead> is. If you want to build a small table by hand instead, the HTML Table Generator is the tool with the grid in it; if you want the data rather than the markup, CSV to JSON converts the same file the other way.
Everything runs in your browser. The file is read, parsed and turned into markup on your own machine, and nothing is sent anywhere unless you press Publish. The parser handles the cases that break a simple split-on-comma: a quoted field may contain commas, line breaks and doubled quotes; records may end with Windows, Unix or old Mac line endings; and the invisible byte order mark Excel writes at the start of a UTF-8 file is removed before it can corrupt the first column name. Every value is escaped on the way into the HTML, so a cell containing a tag stays text.
Alignment is inferred per column: numbers go right, text goes left. A column of leading-zero identifiers is deliberately kept as text, because 0042 is a SKU and sorting it as a number puts it next to 42. In the Columns strip you can rename a heading, leave a column out, change its alignment, or set its type yourself — and changing the type never rewrites a cell, it only tells the sort what to do. The phone question gets a real answer too: horizontal scroll keeps the grid intact and is right up to about five columns, while the stacked card layout turns each row into a labelled block using the header names, which is what a wide table needs on a small screen.
A dropped file stops at 5 MB, because the whole conversion happens in one browser tab. The preview shows the first 200 rows; the code always holds every row. There are no merged cells, no formulas, no cell colours from the spreadsheet and no charts — a CSV does not contain any of those. Excel users export to CSV first; the .xlsx file itself is not read here.
A table is usually needed by someone else, today. Publish wraps your table in a complete page and puts it on a free OxyPages link with HTTPS in seconds, with no account. The link lasts 30 minutes unless you claim it, claiming is free, and from there you can pick your own address and connect a custom domain on a paid plan. See how it works.
Questions
More Free Tools
Every tool here runs in your browser and ends the same way: one click and your HTML is on a live link.
Convert CSV or TSV to JSON, or JSON back to CSV, with quoted fields and embedded commas handled properly. Preview it as a table. Runs in your browser.
Create an HTML table by typing into a grid or pasting CSV. Set headers, borders, stripes and alignment, then copy clean HTML and CSS or publish it as a page.
Paste JSON to format it, check it for errors with the exact line and column, browse it as a collapsible tree, or minify it. Free and entirely in your browser.
Try It Now
Still Here? Drop It In.
The whole pitch fits in one sentence: your HTML, on a link, in seconds.
Drag and drop your HTML file(s), folders, or ZIP file
or ·
No account needed. Your unclaimed website stays live for 30 minutes on a free subdomain. Claim it to your account to keep it permanently.