Markdown Table Generator
Build a GFM table in a visual grid — paste straight from Excel or Google Sheets — entirely on this device.
Arrow keys move between cells; Home and End jump within a row; Enter or typing edits; Esc cancels an edit.
Type in the grid, paste from Excel or Sheets, or import a file — the table renders here.
Press ? for shortcuts
Do it offline:$ pandoc table.tsv -f tsv -t gfm
How to use it
- Fill the grid: arrow into a cell and type; buttons add or remove rows and columns; a toggle controls the header row.
- Paste a copied spreadsheet range anywhere in the grid — it splits into cells at the caret and the grid grows to fit the block.
- Set each column's alignment from the strip, then pick Pretty or Compact and the Markdown or HTML tab in the output pane.
- Copy the active tab, download a .md file, or share the grid as a link — imports and Clear are one undo away.
Markdown tables punish hand editing: one new cell and every pipe moves. This page gives you a real grid instead — type into cells, paste a block straight from Excel or Google Sheets, or import a CSV file — and emits a GitHub-ready pipe table with per-column alignment as you work. The grid runs on this device only; nothing you paste is uploaded.
Examples
Grid: Item / Price — Price right-aligned| Item | Price |
| ------ | ----: |
| Apples | 1.20 |
| Pears | 2.40 |Right on the Price column writes ---: into the separator row while the default Item column keeps bare dashes. Pretty mode pads cells until the pipes line up; GitHub renders padded and unpadded bytes the same.
Service Owner Tier Notes
api Ada gold "rotate keys
review quota"
web Noor silver static only| Service | Owner | Tier | Notes |
| ------- | ----- | ------ | --------------------------- |
| api | Ada | gold | rotate keys<br>review quota |
| web | Noor | silver | static only |Spreadsheets quote-wrap any copied cell that holds a tab or line break; the split reads those quotes and reports: 1 multi-line cell kept as <br> — GFM tables cannot contain line breaks.
|Flag|Purpose|Default|
|:-|:-:|-|
|--wrap|wrap long lines|80|
| --toc |emit contents|false|| Flag | Purpose | Default |
| :----- | :-------------: | ------- |
| --wrap | wrap long lines | 80 |
| --toc | emit contents | false |Alignment survives a sloppy separator row — :- reads left, :-: center — and the re-emit trims and re-pads every cell. Formatting an existing table is import plus copy.
Grid: キー / 説明 — a|b in one cell| キー | 説明 |
| ---- | -------------- |
| a\|b | パイプを含む値 |
| 東京 | 首都 |The pipe leaves as \| so the cell reads back whole; CJK text pads at double width to keep source columns square. Both surface as notes under the output.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Pipes escape themselves
Type | into a cell and the output writes \| with a counting note; importing \| restores the plain pipe.
Line breaks spell <br>
Grid cells stay single-line: breaks are held as <br>, which GitHub renders as a break inside the cell, and export and import round-trip the spelling exactly.
Merged cells arrive flattened
Copying a merged range pastes the text it actually holds — top-left cell filled, covered cells empty — plus a note. GFM has no rowspan or colspan to map onto.
Double-width padding is an approximation
Pretty mode counts CJK and fullwidth characters as two columns. Monospace fonts mostly agree, proportional fonts do not — and padding never changes what parses.
Fifteen columns is the comfort line
Past 15 columns a warning suggests transposing — GitHub scrolls wide tables instead of wrapping. The editor answers with a sticky first column while the rest scroll.
10,000 rows fit — header rides free
The row cap counts data rows only, so a 10,000-row CSV plus its header imports whole, with a length advisory. Downloads carry every row; imports past 256 KB parse off the main thread.
A missing separator row is not fatal
Import accepts a table whose dash row was deleted: the first row is promoted to header, alignment default, and a warning states that. Column mismatches always block.
Header off still satisfies GFM
A pipe table with no header strip does not parse, so toggling the header off emits one empty header row plus a note; importing that shape turns the toggle back off.
Ambiguous pastes ask, never guess
Pipe-separated lines read as data or as a table equally well, so pasting them raises a choice between the readings. Tab-separated pastes split straight into cells.
Two ceilings, typed refusals
Grids refuse past 10,000 data rows or 100 columns, printing your dimensions and both limits; intake refuses past 10 MB. Neither ever quietly truncates.
Common errors
a quoted cell never closes at line 2, column 4 — double any " inside the cell as "" and close the quote.- CSV import scans quotes row by row: one opening quote without a partner swallows everything after it, so the import refuses with the exact position instead of building a half-right grid.
no pipe found at line 1, column 1 — a GFM table row separates cells with |, like | name | qty |- Markdown import wants a pipe on the first non-blank line to take as the header row. Strip surrounding prose or code fences and paste the table block on its own.
row 3 has 2 cells; header has 3 — check for an unescaped |- A row whose cell count differs from the header would force the grid to invent or drop a cell — either moves your data — so import blocks and names the row. Look for a pipe missing its backslash.
the table is 1 row × 101 columns — this tool's grid is limited to 10,000 rows × 100 columns- The refusal prints your dimensions against both grid limits. Data rows are what count — the header strip is free — and past the cap the CLI line below is the right tool.
FAQ
Can I paste straight from Excel or Google Sheets?
Yes — copy a range, click a cell and paste. The clipboard text arrives tab-separated; cells holding tabs, quotes or line breaks arrive quote-wrapped and are read whole, and the grid grows to fit. What lands is the sheet's displayed text — formulas stay behind.
How do I put a line break inside a cell?
Spell it <br>. Inside a GFM table a real newline starts the next row, so the HTML tag is the one break that renders — GitHub shows a wrapped line within the cell. Multi-line pastes pick it up automatically.
What does the alignment strip actually write?
The colons in the separator row: Left writes :---, Center writes :---:, Right writes ---:, and Default leaves bare dashes for the renderer. Alignment is per column, covers header and data alike, and re-imports losslessly.
Keyboard shortcuts
- ⌘/Ctrl + C
- Copy the active output tab while nothing is selected.
- ⌘/Ctrl + Shift + C
- Copy the active output tab even over a selection.
- ⌘/Ctrl + S
- Download the table as a .md file.
- ? or ⌘/Ctrl + /
- Open the shortcut help dialog.
- t
- Change the theme.
- Esc
- Dismiss whatever overlay is on top.