Skip to main content
ponderloop

Markdown Table Generator

Edit the grid or paste CSV, tab-separated spreadsheet cells or an existing Markdown table, and the GitHub Flavored Markdown table is written as you type. The example has 3 columns and 4 body rows; its header row is | Item | Qty | Price | and its delimiter row | :------------------ | :-: | ----: |, where the colons set each column’s alignment. Pipes in cells are escaped as \| (1 in the example) and line breaks become <br> (1), columns are padded by display width so wide CJK characters and emoji still line up, and a compact form is one click away. Everything runs in your browser, so your data never leaves it.

Updated Runs in your browser: nothing you enter is uploadedHow this tool works

Table

Stays in your browser

Edit the cells, pick an alignment for each column, and add or remove rows and columns. The first row is the header. Pasting spreadsheet cells into a cell fills the grid from there.

Editable table: header row, alignment row, then body rows
Row actions

Paste data or a Markdown table

Paste CSV, tab-separated cells copied from Excel or Google Sheets, or an existing Markdown table, then load it into the grid. A Markdown table is read back with its alignment.

Your data is converted on this device and never uploaded. It is not saved either: reload the page and it is gone.

Markdown

A table of 3 columns and 4 body rows (plus the header row).

  • 1 pipe written as \| so the cell does not split.
  • 1 line break in cells written as <br>, since a table row is one line.

Preview

How the table renders, with the alignment applied. It is built from your text as plain text, so nothing you type is read as HTML.

ItemQtyPrice
Apples31.20
餃子 dumplings124.50
Cheese | crackers17.99
Tea
(loose leaf)
23.00

Counts

Columns
3
Body rows
4
Source size
229 bytes

How column alignment is written

A column with the header “Quantity” and one cell, “7”, in the padded layout (a dot marks a padding space).
AlignmentDelimiter cellBody cellEffect
None--------7·······No colons: the renderer’s default (left in most). Cells are padded on the right.
Left:-------7·······A colon on the left. Cells are padded on the right.
Center:------:···7····A colon at both ends. Cells are padded on both sides, the extra space going right.
Right-------:·······7A colon on the right. Cells are padded on the left, so numbers end in the same column.

How cell text is written

What happens to the text of a cell before it goes between the pipes.
Cell textWritten asWhy
a|ba\|bA pipe would start a new cell, so it is written \|, which GFM reads as a literal pipe, even inside code.
one ⏎ twoone<br>twoA row is one line, so each line break becomes <br>, an inline HTML tag that GitHub renders as a break.
padded paddedSpaces at both ends are trimmed, as GFM does when it reads the cell.
**bold** `code`**bold** `code`Everything else is left alone, so inline Markdown (emphasis, code, links) works in a cell.
(empty)(empty)An empty cell is valid; the column keeps its width.

How display width is counted

Columns used in a monospace font with “Count CJK and emoji as two columns” on, against one column per character.
TextWhat it isWide-aware widthOne per character
ApplesLatin letters66
caféAccented letters44
餃子Chinese characters42
こんにちはHiragana105
한국어Hangul63
AFullwidth letter21
😀Emoji21
👍🏽Emoji with skin tone (one glyph)22
👨‍👩‍👧Family emoji (joined with ZWJ)23
🇯🇵Flag (two regional indicators)22
éLetter plus combining accent11

What the paste box reads

Each input, loaded with the format on “Detect automatically”, and the compact Markdown it becomes.
Input kindPasted textTable written
CSVa,b ⏎ "x, y",2| a | b | ⏎ | --- | --- | ⏎ | x, y | 2 |
Spreadsheet cells (tabs)Name Note ⏎ Ada Likes maths, code| Name | Note | ⏎ | --- | --- | ⏎ | Ada | Likes maths, code |
Semicolon CSV (detected)a;b ⏎ 1;2| a | b | ⏎ | --- | --- | ⏎ | 1 | 2 |
Quoted line breaka,b ⏎ "two ⏎ lines",z| a | b | ⏎ | --- | --- | ⏎ | two<br>lines | z |
Markdown table| L | R | ⏎ | :-- | --: | ⏎ | 1 | 2 || L | R | ⏎ | :-- | --: | ⏎ | 1 | 2 |

How to make a Markdown table

  1. Start from the grid or paste data. Type into the example grid, or paste CSV, tab-separated cells copied from Excel or Google Sheets, or an existing Markdown table into the paste box and choose “Load into grid”.
  2. Shape the table. Add or remove rows and columns, and pick left, center, right or no alignment for each column. The first row is the header, which GFM requires.
  3. Choose the layout. Keep “Pad columns so the pipes line up” for source that is easy to read, or untick it for the shortest table. Untick the width option if your editor draws wide characters one column wide.
  4. Check the preview. The preview shows how the table renders with its alignment. Pipes and line breaks in cells are escaped for you, and a note says how many.
  5. Copy the Markdown. Press Copy and paste the table into a README, issue, pull request or any GFM document. To edit it later, paste it back into the paste box to load it into the grid.

Frequently asked questions

What is the syntax of a Markdown table?
A GFM table is a header row, a delimiter row of hyphens, and body rows, each with cells between pipes, for example | Item | Qty | Price | then | :------------------ | :-: | ----: |. A colon at the left, right or both ends of a delimiter cell sets the column’s alignment. The header and delimiter rows must have the same number of cells.
How do I put a pipe character in a table cell?
Write it as \|. The generator does this for you: a cell holding a|b is written as a\|b. GFM reads the escaped pipe as a literal pipe, even inside a code span.
How do I add a line break inside a cell?
A table row must stay on one line, so a line break is written as the HTML tag <br>; type a new line in the cell and the generator writes it. GitHub renders the tag as a break, but a renderer that strips inline HTML may show it as text. For example, “one” and “two” on separate lines are written as one<br>two.
How do I paste from Excel or Google Sheets?
Copy the cells and paste them into the paste box (or straight into a grid cell to fill the grid from there). Spreadsheets copy cells separated by tabs and rows by line breaks, and wrap cells containing line breaks or quotes in double quotes, which the CSV reader (RFC 4180) understands. The first row becomes the header unless you untick that option.
Can I convert an existing Markdown table back to a grid?
Yes. Paste it into the paste box and load it: the header, each column’s alignment, and the cells are read back, with \| turned back into a pipe and <br> into a line break. As in GFM, a short row is padded with empty cells and extra cells are dropped. Writing it out again gives an equivalent table, padded the way you choose.
Why do the columns not line up for Chinese, Japanese, Korean or emoji?
Those characters take two columns in a monospace font, so padding by character count leaves the pipes crooked. The generator counts wide characters as two (the East Asian Width classes “wide” and “fullwidth”, plus emoji) and ignores combining marks and zero-width joiners. It cannot know your font, so some editors still differ; untick the width option to count one column per character instead. The rendered table is never affected, because HTML ignores the padding.
Is the padded form different from the compact one when rendered?
No. GFM ignores spaces around cell content, so both forms render the same table. Padding only makes the source easier to read and to diff; the compact form is shorter.
Is there a limit on the size of the table?
The grid is an editor with a text box for every cell, so it holds up to 5,000 cells (for example 50 columns by 100 rows). For a larger CSV, split it into several tables.
Is my data uploaded anywhere?
No. The table is built in your browser and the text is never uploaded, stored or logged; it is gone when you close or reload the page. The only thing the site records, if you allow analytics, is that a button was used, never any of the data.

How it works

The output follows the “Tables (extension)” section of the GitHub Flavored Markdown spec: a header row, a delimiter row whose cells hold hyphens with an optional leading and trailing colon (left, right or both for center), and body rows; every row is one line, begins and ends with a pipe and has cells separated by pipes. Each cell is trimmed, a pipe is written \| and each line break <br>, because a table row cannot span lines. Other Markdown and backslashes in a cell are left as typed. In the padded layout every column is as wide as its widest cell, at least three characters so the delimiter row holds three hyphens, and cells are padded by alignment: on the right for left and none, on the left for right, on both sides for center. In the compact layout cells are not padded and the delimiter cells are three characters. Width is measured in monospace columns: characters of the Unicode East Asian Width classes wide and fullwidth (CJK, kana, Hangul, fullwidth forms) and emoji with emoji presentation count as two, an emoji sequence (skin tone, zero width joiner, flag pair) counts as its first emoji, and combining marks and format characters count as zero. This is an approximation of a font, not a measurement of one. Pasted text is read as a Markdown table when a line with a pipe is followed by a valid delimiter row; otherwise as delimited text using the same RFC 4180 reader as the CSV to JSON converter, with the delimiter (comma, tab, semicolon or pipe) detected. Reading a Markdown table splits rows at pipes that are not escaped, unescapes \| and <br>, takes alignment from the delimiter row, and ends the table at the first blank line. The preview is built from text nodes, so cell text is never interpreted as HTML.

Sources

All toolsHome & DIY calculators