Markdown table generator

A markdown table generator turns a grid of cells into a table you can paste into GitHub, GitLab, or a docs site. Type in the grid below, or paste spreadsheet data, and copy clean GitHub Flavored Markdown. It is free, there is no signup, and everything runs in your browser.

Build a table

Last verified: October 29, 2026 · Primary source: GitHub Flavored Markdown spec, section 4.10 · Independent tool, not affiliated with GitHub

Build a table

The first row is the header. Type in any cell and the Markdown below updates at once.

Fill in at least one cell to start.

Rendered preview

HTML output

Import data or repair a table

Paste CSV, TSV, JSON, or an existing Markdown table. The grid is replaced with what you paste, then the output is rebuilt, padded, and fixed to one cell count per row.

How to use it

Start with the header row, then fill in one row per record. Pick an alignment for each column if the default left alignment does not fit the data: numbers usually read better right aligned, short labels read better centered. Copy the Markdown and paste it into a README, an issue, or a docs page, with a blank line before it.

If your data already lives in a spreadsheet, copy the cells and paste them into the import box. Tab separated paste from Excel or Google Sheets works, and so does comma separated text. If you already have a Markdown table that renders badly, paste that instead: the import reads it back into the grid, drops the old separator row, and rebuilds it with matching cell counts.

Markdown table syntax

A GitHub Flavored Markdown table has three parts: a header row, a separator row, and one row per record. Cells are split by pipe characters. The separator row is what turns a block of pipes into a table, and its colons set the alignment.

PartSyntaxWhat it does
Header row| Name | Role |Names each column. A table without a header row does not render as a table.
Separator row| :--- | ---: |Marks the block as a table and sets alignment: left, center, or right per column.
Data row| Alice | Engineer |One record. Every row must have the same number of cells as the header.
Pipe in a cellA \| BAn escaped pipe stays inside the cell instead of splitting it in two.

Padding the columns with spaces is optional. Renderers ignore it, but padded source text is far easier to edit by hand, which is why this generator pads by default. Untick the padding box if you want the shortest possible output.

What breaks a table, and how this page fixes it

Four mistakes cover most broken tables. First, a missing separator row: the block stays plain text. Second, rows with different cell counts: the short row renders with empty cells or, on strict renderers, breaks the table. Third, an unescaped pipe inside a cell: one cell becomes two and every column after it shifts. Fourth, a table pasted with no blank line before it: some renderers treat it as a continuation of the paragraph above.

This generator fixes the first three at the source. It always writes a separator row, it pads short rows with empty cells so every row matches the header count, and it escapes pipes and backslashes inside cells. The blank line rule is on you: leave one empty line before the pasted table in your document.

Two limits are part of the format, not bugs in a generator. GitHub Flavored Markdown tables have no colspan, no rowspan, and no nested tables. A cell also cannot hold a real line break. If a cell needs more than one paragraph, link out to a longer note instead of packing it into the table.

Where markdown tables work

GitHub and GitLab render pipe tables in READMEs, issues, pull requests, and wikis. Most static site docs tools, including Docusaurus and MkDocs, render them too, as do note apps that accept Markdown input. The same table usually renders the same way in all of them, because the syntax is small and the spec is stable.

Two places behave differently. Notion converts a pasted Markdown table into its own table block and may drop alignment or reflow wide tables. Chat tools and some CMS editors strip Markdown on paste and keep only the text, so a table pasted there arrives as plain words. In both cases, paste the HTML output instead, or use the app's own table insert.

Frequently asked questions

Does this work in GitHub, GitLab, and Notion?

Yes for GitHub and GitLab, which both render GitHub Flavored Markdown pipe tables. Notion pastes markdown tables into its own table blocks, but it may reformat alignment and wide tables, so check the result after pasting.

What does the separator row do?

The second row tells the renderer that the block is a table and sets alignment per column. A colon on the left means left aligned, colons on both sides mean centered, and a colon on the right means right aligned. Without this row, the pipes are just text.

How do I put a pipe character inside a cell?

Write it as a backslash followed by a pipe. An unescaped pipe ends the cell, so a cell that reads A, pipe, B would split into two cells. This generator escapes pipes for you.

Can a markdown table span columns or rows?

No. GitHub Flavored Markdown has no colspan, rowspan, or nested tables. If you need merged cells, use the HTML output on this page instead, which supports colspan and rowspan when you edit it by hand.

Why does my table look broken on one site but fine on another?

Some renderers require a blank line before the table, a header row, and the same number of cells in every row. Others are more forgiving. This generator always writes a header row and pads short rows with empty cells, which covers the strict cases.

Is my data uploaded anywhere?

No. The grid, the import, and the output all run in your browser. Nothing you type or paste is sent to a server.

Sources

This page is an independent tool, not affiliated with GitHub. Table syntax follows the GitHub Flavored Markdown spec; individual renderers may differ on edge cases such as tables without a preceding blank line.

Agents

Machine readable summary for AI assistants: