How the table generator works
The grid sits at the top of this page, and it behaves like a very small spreadsheet. You type into cells, not into punctuation, and the Markdown pane below writes itself.
- This page is for tables you are inventing; to convert one you already have, use the table to Markdown converter.
- The top row of the grid is the header, and every row under it is data.
- Each column has its own left, center and right button, so the delimiter row is never typed by hand.
- The grid is JavaScript in your own tab, so nothing you type is uploaded.
Set the size, then fill the cells
Start by choosing how many columns the table needs, and how many data rows will sit under the header. Nothing is locked in, so guess roughly and adjust as the content takes shape.
Then type. Move between cells with Tab and Shift+Tab, or click straight into the one you want. Cell contents can carry inline formatting, so **bold**, `code` and [label](https://example.com) behave exactly as they do everywhere else in Markdown.
Set alignment with one click per column
Above each column is a control for left, center or right. This is the part hand-written tables get wrong most often, because alignment depends on a row of colons and dashes that is easy to mistype. Here it costs one click.
Copy the output, keep the data
The Markdown pane updates as you type, so the syntax on screen is always current. Paste it into a README, a GitHub issue, a wiki page, a Discord message, or into the MD Editor on our homepage if you want to carry on writing the document around it. The other Markdown tools run the same way, with nothing sent to a server.
Tip: Decide the columns before you type a single cell. Adding a column later means revisiting every row, which is the one edit a grid does not make painless.
From grid to Markdown: a worked example
Say you need a small pricing table with four columns and four data rows. The header cells are Plan, Seats, Price and Support. Two columns stay left aligned because they hold names, Seats is centered because the values are short, and Price is set right so the numbers line up on their last digit.
Fill in the four data rows and the generator produces exactly this:
| Plan | Seats | Price | Support |
| :--------- | :---: | ----: | :-------- |
| Starter | 3 | $0 | Community |
| Team | 25 | $49 | Email |
| Business | 100 | $149 | Priority |
| Enterprise | 500+ | $299 | Dedicated |
Three details in that block are worth a closer look.
Three details in the output
- The second line is the delimiter row, and it is not decoration. Without it the block is not a table at all, only six lines of text with pipe characters in them.
- The colons carry the alignment.
:---means left,:---:means center, and---:means right. - The padding spaces are cosmetic. Renderers strip them, which is exactly why editing a wide table by hand is such a chore.
The same table in five steps
- Set the grid to four columns and four data rows.
- Type the four header cells along the top row.
- Click center above
Seatsand right abovePrice. - Fill in the data rows, one plan per row.
- Copy the Markdown pane and paste it where the table belongs.
Paste that block into the editor and the preview confirms the result before it ever reaches your README. If any of the syntax looks unfamiliar, the cheat sheet has the whole language on one page, and what Markdown actually is explains why punctuation turns into formatting.
Alignment: the one row that does the work
Alignment lives entirely in the delimiter row, the second line of every Markdown table. Each cell in that row describes the column above and below it.
Every delimiter cell, valid and invalid
This reference covers every form you are likely to meet, including the four that quietly break the table.
| Delimiter cell | Alignment | Valid in GFM | Notes |
|---|---|---|---|
--- | Default | Yes | Renders left in almost every viewer |
:--- | Left | Yes | Explicit left, the safest choice for text columns |
:---: | Center | Yes | A colon on both ends |
---: | Right | Yes | The convention for numbers, prices and dates |
:-: | Center | Yes | One dash is enough, longer runs are cosmetic |
- | Default | Yes | The shortest legal delimiter cell |
: --- : | None | No | A space between colon and dashes voids the cell |
=== | None | No | Equals signs are never accepted, the table fails |
| Delimiter row missing | None | No | Without it the lines stay plain text with pipes |
| Fewer cells than the header | None | No | Cell counts must match the header row exactly |
Two habits that keep alignment useful
- Right align anything numeric. A column of prices or counts is far easier to compare when the digits stack up.
- Treat alignment as presentation only. Some static-site themes override it in CSS, and plain-text viewers ignore it. Use it to help people scan, never to carry meaning.
Watch out: A malformed delimiter cell does not produce a wonky table. It produces no table at all, and the whole block drops back to plain text with visible pipes.
Why tables are an extension, not core Markdown
Tables came to Markdown through GitHub, not through the original 2004 specification, so they belong to the GitHub Flavored Markdown dialect. Almost everything modern supports them, but a strict CommonMark parser with no extensions will not. For the full picture of what can go inside a cell, see the Markdown tables guide, and how to make a table in Markdown answers the question in short form.
Pasting from Excel, Google Sheets or a CSV
Some tables are half invented and half copied. You are drafting a comparison here, but the numbers already sit in a sheet somewhere. The grid takes those rows directly.
Tab-separated cells from a spreadsheet
Copy a block of cells out of Excel, Numbers or Google Sheets and the clipboard carries them as tab-separated values: one line per row, a tab between columns. Paste that into the grid and it splits back into cells on its own. A forty-row table then costs one keystroke instead of forty careful lines.
Comma-separated CSV text
CSV behaves the same way. This is what a small export looks like:
Region,Q1,Q2
North,1420,1655
South,980,1130
East,2075,1980
Paste it in, set the two number columns to right alignment, and you get:
| Region | Q1 | Q2 |
| :----- | ---: | ---: |
| North | 1420 | 1655 |
| South | 980 | 1130 |
| East | 2075 | 1980 |
Two kinds of cell need attention before you paste.
Two cells that need care
- A cell holding a pipe character.
|is the column separator, so the row splits in two. Escape it as\|and the cell survives. This bites anyone documenting keyboard shortcuts, regular expressions or command-line syntax. - A cell holding a line break. A table row has to sit on one line, so replace the break with
<br>.
Already have the whole table? Use the converter
There is a line worth drawing here. If the table is finished and you only want it as Markdown, this grid is the long way round. Send it to the table to Markdown converter instead, which reads spreadsheet cells, CSV text or a raw HTML <table> and returns the syntax in one paste.
Tip: Building something new, cell by cell? Stay here. Translating something that already exists? Convert it. That single question decides which page saves you time.
For whole documents rather than single tables, the HTML to Markdown converter handles a pasted page, and Markdown to HTML covers the reverse trip.
What goes wrong, and the fix
A broken Markdown table almost always fails in one of four ways, and each has a symptom you can see.
The table renders as text with visible pipes
Nine times out of ten the delimiter row is missing or malformed, or the table has no blank line above it. A table needs an empty line between it and the paragraph before, and its second line must be the dashes-and-colons row.
The column counts do not match
If the header has four cells and the delimiter row has three, most parsers refuse to build the table at all. A pipe inside your data causes the same fault from the other direction, since it adds a cell where you did not want one. Escape it as \|. Backticks will not save you, because inline code does not protect a pipe inside a table cell.
Generating the grid removes this failure mode completely, which is the main reason to use a generator on anything wider than three columns.
Alignment appears to be ignored
Check the destination rather than the syntax. Some documentation themes and email clients strip table CSS, and a few older parsers support tables without supporting alignment. Preview the result in the Markdown viewer or the editor to confirm the syntax is right before you blame it.
The table is too wide, or a cell is too big
- Nine columns. Unreadable on a phone, and clipped when the page is saved as a PDF. Cut optional columns, shorten the headers, or turn the table on its side so the long axis runs down the page.
- Line breaks vanishing inside a cell. That is expected behaviour. Use
<br>instead. - A cell that wants paragraphs, a list or a code block. The content has outgrown a table. Split it into headed sections, or write that part as raw markup, a trade-off Markdown versus HTML discusses.
Support data verified
Frequently Asked Questions
Is this Markdown table generator free?
Yes, completely. There is no account, no limit on rows or columns, and no watermark on the output. The grid runs as JavaScript inside your browser, so the data you type is never uploaded to a server.
Can I set a different alignment for each column?
Yes. Every column has its own left, center and right control, and the generator writes the matching delimiter row: :---, :---: or ---:. Right alignment is the usual choice for numbers and currency.
Can I paste a table from Excel or Google Sheets?
Yes. Copy the cells in your spreadsheet and paste them into the grid. The clipboard carries tab-separated values, which the generator splits back into rows and columns. Comma-separated (CSV) text works the same way.
Which platforms render Markdown tables?
Tables come from the GitHub Flavored Markdown extension, so GitHub, GitLab, Discord, Obsidian, Notion, VS Code and most static site generators all handle them. A strict CommonMark parser with no extensions enabled will not.
How do I put a pipe character inside a cell?
Escape it with a backslash: \|. Without the backslash the parser treats it as a column separator and the row breaks apart. The tables guide covers escaping and other cell-content edge cases.
Keep learning
Try the Editor
Open Editor