Free Markdown Table Generator
Create markdown tables visually with a spreadsheet-like editor. Add rows, columns, alignment options, CSV import, and instant preview. 100% client-side — your data stays private.
What is a Markdown table? A Markdown table is a block of text where each row is a line of cells separated by pipe characters, and the second line is a delimiter row of dashes that marks the line above it as the header. The delimiter row is what makes it a table — without it, the pipes are just punctuation. Colons in that row set column alignment: :--- left, :---: centre, ---: right.
How to Use the Markdown Table Generator
-
Name your columns — Type over
Header 1,Header 2andHeader 3. Header text also sets the column width in the generated Markdown, so longer headers produce a wider, more readable source block. - Set alignment per column — The dropdown under each header writes the colons into the delimiter row. Left emits plain dashes, which every renderer treats as left-aligned by default.
- Add the rows and columns you need — Add Row appends an empty row matching the current column count; Add Column adds a header plus one cell in every existing row. There are no per-row delete buttons — Clear resets the whole grid to three columns and two rows.
-
Fill in the cells — Both the Markdown output and the rendered preview update on every keystroke. Cells hold a single line of text; inline formatting like
**bold**,`code`and links works, but a literal pipe must be written as\|. - Or import a CSV to skip the typing — Import CSV reads a file from your machine, takes the first line as headers and every later line as a row. It splits strictly on commas, so a field containing a comma inside quotes will be split in the wrong place.
- Copy Markdown or HTML — Copy Markdown gives you the padded pipe table. Copy HTML gives a plain semantic table — note that it carries no alignment, so re-apply that in CSS if you need it.
How the Markdown Is Generated
Markdown tables are not part of John Gruber's original 2004 specification. They arrived as an extension, standardised by GitHub Flavored Markdown and supported today by GitLab, most static site generators and nearly every documentation platform — but not by every parser. A minimal table needs exactly two things: a header line and a delimiter line beneath it.
| Product | Units | Revenue | | ------- | ----: | ------: | | Widget | 12 | 120.00 | | Gadget | 4 | 99.50 |
The generator writes the header line first, then computes the delimiter for each column from that column's alignment setting and the width of its header text. Dashes are padded to the header's length so the source stays visually aligned, with a floor of three:
| Alignment | Delimiter for a 4-character header | Result |
|---|---|---|
| Left | ---- | Plain dashes, no colon. This is the Markdown default, which renderers show left-aligned. |
| Center | :---: | A colon at both ends centres the column. |
| Right | ---: | A trailing colon right-aligns, which is what you want for numbers and currency. |
Body cells are then padded with trailing spaces to match the header width, so the pipes line up in a monospaced editor. That padding is purely cosmetic: Markdown ignores whitespace around cell contents, and a table written with no padding at all renders identically. It matters only to whoever has to read the raw file later — and in a README that people do edit by hand, it matters quite a lot.
Alignment is also a rendering instruction, not a data type. Setting a column to right-aligned does not tell the renderer the values are numbers; it just moves the text. Sorting, formatting and thousands separators are all beyond what Markdown tables can express.
What Fits in a Markdown Table Cell
Cells accept inline formatting and nothing more. That constraint is the source of nearly every problem people hit with Markdown tables, and knowing the boundary saves a lot of fighting with the syntax.
| Works in a cell | Does not work |
|---|---|
**bold**, *italic*, ~~strikethrough~~ | Headings, blockquotes, horizontal rules |
`inline code` | Fenced code blocks |
[link](https://example.com) | Reference-style link definitions |
 | Nested tables |
| Emoji and Unicode | Real line breaks inside a cell |
An escaped pipe, written \| | Merged cells — there is no colspan or rowspan |
An unescaped | inside a cell ends that cell early and shifts every value after it into the wrong column. The editor does not escape pipes for you, so type \| when you need a literal one — common in cells describing regular expressions, shell commands or "either/or" values.
There is no way to put a line break inside a cell using Markdown alone. If a cell genuinely needs two lines, a <br> tag works on platforms that permit inline HTML, GitHub included. When several cells need that treatment, it is usually a sign the content wants a definition list or a set of subsections rather than a table.
The number of cells in each row should match the header. A row with too few cells renders with the missing columns blank on most parsers, which is untidy but survivable. A row with more cells than the header is the case to avoid: the surplus is discarded by renderers, and here it stops the Markdown output updating at all, so keep every row the same width as the header.
Importing CSV, and What Gets Lost
Import CSV reads a file from disk with the browser's FileReader API — the file is never uploaded. The first non-empty line becomes the header row and rebuilds the columns from scratch; every remaining line becomes a data row; blank lines are skipped. Each field is trimmed, and one pair of surrounding double quotes is removed.
The parser splits on every comma, which is where the limits appear. A field like "Smith, John" becomes two columns rather than one, because the quotes are only stripped after the split has already happened. Escaped double quotes inside a field ("" in CSV) are not unescaped, and a value containing a newline inside quotes is read as two separate rows. Files with CRLF endings are fine — the trailing carriage return is removed when each field is trimmed.
Importing also resets every column to left alignment, so set alignment afterwards rather than before. If your data contains commas, export it with a different delimiter and do a find-and-replace first, or paste the values into the grid by hand. For anything larger than a screenful, converting the CSV in a spreadsheet and pasting the result is usually faster than fixing a mangled import.
Frequently Asked Questions
GitHub Flavored Markdown pipe tables: a header line, a delimiter line of dashes, then one line per row, with cells padded so the pipes line up. Centre-aligned columns get :---: and right-aligned columns ---:. Left-aligned columns get plain dashes rather than :--- — the two are equivalent, since undecorated dashes already mean left alignment in every renderer that supports these tables.
No. Tables are an extension, not part of original Markdown, so support depends on the parser. GitHub, GitLab, Bitbucket, Obsidian, Notion, Docusaurus, MkDocs, Jekyll with kramdown and most CommonMark parsers with GFM enabled all handle them. Plain CommonMark without extensions does not, and neither do some older wikis and comment boxes — there the table appears as literal lines of pipes.
Not reliably. The importer splits on every comma before it strips quotes, so "Smith, John" becomes two columns instead of one. Values containing newlines inside quotes are read as separate rows, and doubled quotes are not unescaped. For data with embedded commas, re-export using a different delimiter and replace it, or paste the values into the grid by hand.
Because an unescaped | ends the cell. Everything after it shifts into the next column, and the row no longer matches the header. Write a literal pipe as \|. This bites most often in cells describing shell commands, regular expressions or "A | B" choices. The editor does not escape it for you.
No. The HTML export emits a plain semantic table — <table>, <thead>, <tbody>, <th> and <td> — with no style attributes, so all columns inherit whatever your stylesheet does. The on-page preview does show alignment, which makes the difference easy to miss. Add a CSS rule or align attributes afterwards if you need it in HTML. The Markdown output carries alignment correctly.
You cannot from the toolbar — it offers Add Row, Add Column, Import CSV and Clear, and Clear resets everything to an empty three-by-two grid. To remove one row, blank its cells and delete that line from the copied Markdown, which takes a second in any editor. For heavy restructuring it is usually quicker to rebuild the table from a corrected CSV.
Only inline content is allowed: bold, italic, inline code, links, images and emoji. Headings, blockquotes, fenced code blocks, lists and nested tables are not valid inside a cell. For a line break, a <br> tag works wherever inline HTML is permitted, GitHub included. If several cells need multi-line content, the material has usually outgrown a table.
No. The file is read locally through the browser's FileReader API and never sent anywhere. Nothing you type is transmitted either, and unlike some tools here this page does not write your table into the URL, so there is no shareable link carrying your data. Closing the tab discards everything.
Use Markdown while the content is simple and the source needs to stay readable — READMEs, changelogs, docs that others edit. Switch to HTML when you need merged cells, multi-line content, captions or per-cell styling, none of which Markdown tables can express. Most platforms that render Markdown also accept inline HTML, so mixing the two in one document is fine.
Use Cases
GitHub README Tables
Create properly formatted tables for GitHub README files with correct Markdown syntax.
Spreadsheet to Markdown
Convert spreadsheet data into Markdown tables for documentation and wikis.
Building Documentation Tables
Create structured tables for technical documentation with proper alignment and formatting.
Generating Comparison Tables
Build comparison tables to present data side-by-side in a clear, organized format.
Formatting Data for Wikis
Format structured data into Markdown tables for wiki pages and knowledge bases.