Home · Free tools · Excel to Markdown

Excel to Markdown table

Drop a .xlsx and get a Markdown table back — column-aligned, pipes escaped, ready to paste into a README, a pull request, a wiki page or an issue. Edit the loaded rows in the box before converting if the sheet has more in it than the table you want.

Your spreadsheet

Drop .xlsx, .xlsm or .csv here to load it into the box below

Rows loaded from the file as CSV — trim them here before converting

Nothing is uploaded. The file is read by JavaScript in this tab and never leaves your computer — no server sees it, and closing the tab throws it away.

What a spreadsheet brings that a plain CSV does not

  • Merged cells. Markdown has no row or column spans. The value sits in the top-left cell of the merge and the rest are empty — which is what the file says. If the merge was a heading, you usually want to delete that row in the box before converting.
  • Formula cells. You get the value Excel last calculated, not the formula. That is right for a table meant to be read, and it means a workbook whose formulas were never calculated shows blanks — open it in Excel once and save.
  • Number formatting. A cell displaying €8,600.00 holds the number 8600. Markdown has no formatting, so add the symbol to the header (Revenue (€)) rather than to every cell.

The three things that break a hand-made Markdown table

  • A pipe inside a cell. A value like b|c ends the cell early and shifts every column after it. Pipes are escaped as \|.
  • A line break inside a cell. Markdown tables are one row per line, so a cell containing a newline splits the row. It becomes <br>, which renders as a line break inside the cell on GitHub and most wikis.
  • Ragged rows. A row with fewer cells than the header produces a malformed table; short rows are padded.

Aligned source, or compact source

With padding on, columns are padded with spaces so the raw Markdown lines up in an editor — worth it for a table someone will hand-edit later. With it off you get the compact form: smaller in a diff, and it renders identically.

A table that gets regenerated every release

Converting once by hand is fine. A table that has to be rebuilt from a source file on every release belongs in the release script.

Questions people ask

Is the output GitHub-flavored Markdown?

Yes — the standard pipe table with a separator row, which GitHub, GitLab, Obsidian, Notion's Markdown import and most static site generators render.

Which sheet does it read?

The first sheet in the workbook, loaded into the box as CSV. To convert a different sheet, open the workbook in the XLSX viewer, export the sheet you want, and drop that.

What happens to merged cells?

The value stays in the top-left cell of the merge and the other cells are empty, because that is how the file stores it. Markdown has no spans, so there is no lossless alternative — delete or rewrite those rows in the box before converting.

Are my files uploaded anywhere?

No. The file is read by JavaScript running in this tab, using the browser's own DecompressionStream to unzip .xlsx and a parser that runs on your machine. There is no server call in the page — you can watch the network tab while you use it. Close the tab and the data is gone.

Can it right-align the number columns?

Not automatically — the separator row is written plain. Add colons to it by hand (|---:|) after pasting to right-align a column.

Does it work with old .xls files?

Not directly. The .xls format is a different, binary format from Excel 97. Open it in Excel, LibreOffice or Numbers and save as .xlsx or .csv, then come back. The tool tells you this rather than failing silently.

Doing this every month?

TableDI 2 keeps it as a job — the files, the key columns, the tolerance and the fixes you made. Next month you drop in the new files and run it again.

macOS, Apple silicon and Intel; Windows is in progress. Free is not a trial — no account, no card.

Last reviewed 2026-09-15 by the TableDI team. Something wrong on this page? Tell us — it is one inbox, read by the people who build TableDI.