All guides

Make a Markdown table from a spreadsheet

Typing pipes and dashes by hand is fine for three rows and miserable for thirty. Save the data as CSV, drop it on the converter, and copy a table whose columns line up in the source, and whose pipes and line breaks inside cells are escaped so nothing breaks the layout.

From Excel or Google Sheets to Markdown

Markdown tools take text, so the first step is text: in Excel, File › Save As › CSV UTF-8; in Google Sheets, File › Download › Comma-separated values. Either writes the active sheet as a CSV. If you would rather not go through the save dialog, drop the workbook on the Excel converter here and download the sheet as CSV — it keeps every value as text, so an ID of 00412 stays 00412.

Then drop the CSV on the Markdown converter. The preview grid shows exactly what the table will hold, and the download is a .md file you can paste from — or paste the whole thing into a README, an issue, or a wiki page.

What a Markdown table needs to render

A pipe table is a header row, a separator row of dashes, and one line per row, with pipes between cells. Two things break it: a pipe inside a value, which has to be written as \|, and a line break inside a value, which ends the row early. The converter escapes the first and turns the second into <br>, so a multi-line address stays in its cell.

It also pads every column to the same width, so the source reads as a table before it renders. A Markdown table nobody can read unrendered is just a worse CSV.

Where the table will and will not render

Pipe tables are part of GitHub-flavoured Markdown and render on GitHub, GitLab, Bitbucket, in Obsidian, Notion and most documentation generators. Plain CommonMark has no tables, so a renderer that follows only the core standard shows the pipes as text; Jira and Confluence use their own table syntax.

Keep the table to what a reader will scroll: a few hundred rows reads fine, and past a hundred thousand the converter refuses and points at CSV, because a table that long is a dataset, not something anyone reads.

The sample file

order_id,cust_ref,amount,status
S-1001,00412,150.00,paid
S-1002,00413,89.50,paid
S-1003,00412,32.10,refunded
S-1004,00415,410.00,paid
S-1005,00416,55.25,pending
S-1006,00999,12.00,paid
S-1007,,77.70,paid

Obviously made-up data, small enough to read. Download it and drop it on the tool to see the fix before trying your own file.

Questions

Can I paste a table from Excel instead of saving a file?
Paste it into a text editor and save that as a .txt file — Excel copies a selection as tab-separated text, and the converter reads .txt files. Saving as CSV from Excel is the shorter route.
Will the source be readable before it renders?
Yes. Columns are padded to align, so the .md file reads as a table in a text editor, in a diff, or in an email.
What happens to a pipe or a line break inside a value?
A pipe is escaped as \| and a line break becomes <br>, so neither one breaks the table.
Are numbers or dates changed on the way?
No. Every value is written as the text in your file — 1.10 keeps its trailing zero, 00412 keeps its zeros.
Can I align a column to the right?
Not from the converter — it writes the plain separator row. Add colons to the dashes in that row by hand (---: for right, :---: for centred) after you paste.
Is my file uploaded anywhere?
No. The Markdown is written from your CSV inside this page, so the table you paste into a README or a pull request never passed through anyone else’s server on the way.