Markdown table generator
Build a GFM table in a spreadsheet-style grid, or paste from Excel, Sheets, CSV or HTML. Set per-column alignment and export Markdown, CSV, HTML or JSON.
- Runs in your browser
- Files are never uploaded
- Free, no account
| Row actions | |||
|---|---|---|---|
- Rows
- 4
- Columns
- 3
- Cells filled
- 3
Your table never leaves this tab — check it yourself—
Starting the network probe…
The counter above wraps fetch, XMLHttpRequest and navigator.sendBeacon in this tab and counts every call. It does not block anything — it just reports.
Two ways to verify independently
- Turn off Wi-Fi or enable airplane mode, then use the tool. It keeps working, because the page is already fully loaded.
- Open your browser devtools, switch to the Network tab, clear it, and run the tool. No new row appears.
Why this matters
In 2025 researchers found that popular online formatters had retained tens of thousands of user-submitted snippets — JSONFormatter.org and CodeBeautify together exposed roughly 80,000 saved documents, many containing live cloud credentials, private keys and internal database connection strings, because “format this” quietly meant “upload this”. A separate incident exposed roughly 3.5 million user PDFs on a document-conversion service. The only structural fix is not sending the data in the first place: this site is served under a Content-Security-Policy whose connect-src contains no third-party origin, so a request off this device cannot be made even by accident.
Why Markdown tables are annoying to write by hand
The syntax itself is simple. What is tedious is everything around it: adding a column means editing every row, the pipes stop lining up the moment a value gets longer, alignment lives in a separate row of colons that is easy to get out of step with the header, and a pipe character inside a value silently breaks the row. A grid removes all four problems, and the Markdown is generated rather than maintained.
The GFM table rules the generator applies
- The header row is mandatory. A table cannot start with data — if your first row is data, turn off “first row is a header” and a generic header is emitted above it.
- The separator row must have the same number of cells as the header, and each cell must be at least three dashes.
- Alignment is expressed with colons in the separator row:
:---left,:---:centre,---:right. - A literal pipe inside a cell must be escaped as
\|. The generator does this for you. - A cell cannot contain a line break. A newline in your data becomes
<br>, which GitHub and most renderers honour. - Cells may contain inline Markdown — bold, code, links — but not block elements such as lists or nested tables.
Padding: cosmetic, but not pointless
A renderer does not care whether the pipes line up. Two audiences do: whoever reads the raw Markdown in a pull request, and your diff tool. A padded table where only one cell changed produces a one-line diff. An unpadded table where one cell got longer reflows nothing, so it is also fine — the problem is switching between the two, which rewrites every row. Pick one and stay with it. Padding is on by default because most repositories store padded tables.
Pasting from other tools
| Source | What arrives on the clipboard | Detected as |
|---|---|---|
| Excel, Numbers, Google Sheets | Tab-separated text | TSV |
A .csv file | Comma-separated, quoted fields | CSV |
| A European CSV export | Semicolon-separated | Semicolon-separated values |
| A web page’s table markup | HTML | HTML table, alignment included |
| An existing Markdown table | Pipe table | Markdown, alignment preserved |
The detected format is named next to the paste box, along with the row and column count, so a wrong guess is visible immediately rather than after you have copied the output.
Four output formats from one grid
The grid is the source of truth, so you can paste CSV and leave with HTML, or build a table by hand and export it as JSON records for a test fixture. Markdown, CSV, HTML and JSON are all generated from the same data, and switching between them changes nothing about the content.
Keyboard and screen-reader behaviour
Every cell is a real <input> inside a real <table>, so
Tab moves across a row and on to the next, Shift+Tab goes back,
and each field is labelled with its row and column for a screen reader. The alignment control is a
button that announces the current alignment and cycles on activation, rather than a
mouse-only affordance.
Questions
Can I paste straight from Excel or Google Sheets?
Yes. A spreadsheet copies as tab-separated text, which the paste box detects automatically along with comma, semicolon and pipe separated values, HTML tables and existing Markdown tables. The detected format is shown next to the box.
How do I set column alignment?
Click the alignment button above a column to cycle left, centre and right. That writes the `:---`, `:---:` and `---:` markers into the separator row, which is what GitHub, GitLab and most Markdown renderers use.
What if a cell contains a pipe character?
It is escaped as `\|` automatically, which is the GFM rule. Newlines inside a cell become `<br>`, because a Markdown table row cannot span lines.
Does the padding matter?
Not to the renderer — a table with ragged pipes renders identically. It matters to whoever reads the source, and to your diffs. Padding is on by default; turn it off if you want the smallest possible output.
Is my data saved?
Only if you turn on "keep this table on this device", which writes the grid to this browser's localStorage. Turning it off deletes it immediately. Nothing is ever sent anywhere.