Markdown Table to Excel Converter

Take a table out of a document and into a spreadsheet that can actually add it up. Real numbers, real dates, a frozen header and columns already the right width.

To convert a Markdown table to Excel, paste the table above and download the .xlsx. Each row becomes a spreadsheet row, each column is written with one cell type decided from all of its values, ISO dates become real date cells, the header row is frozen and every column is sized to fit. The workbook is built in your browser.

Want to add a calculated column first? Open the app

The paste that never works

Copying a Markdown table into Excel directly gives you one column of text with pipes in it. Copying the rendered table out of a browser is closer, and then you find that the alignment has become formatting, the numbers have become text, and a cell with two lines in it has become two rows.

The reason to convert properly is that the point of moving to a spreadsheet is arithmetic. A column of numbers that arrived as text does not sum, does not chart and does not sort, and finding out only after you have built the pivot is the worst possible time.

Worked example: what each column becomes

Take the release table again:

| service | version | released | replicas | notes |
|:--------|--------:|:--------:|---------:|:------|
| billing-api | 2.4.1 | 2026-01-08 | 6 | rollout paused<br>resumed 09 Jan |
| web-frontend | 5.0.0 | 2026-01-12 | 4 | canary 10% \| full 14 Jan |
| search-index | 1.19.3 | 2026-01-15 | 12 | |

And what lands in the workbook:

  • service text cells. Nothing interesting, which is the correct outcome.
  • version text, because 2.4.1 is not a number and 5.0.0 certainly is not. A converter that types per cell would make some of these numbers and leave the rest as text, which is the mixed column Excel flags with a green triangle.
  • released real date cells formatted yyyy-mm-dd. A date filter works, a date axis works, and subtracting one from another gives you days.
  • replicas numeric. Sums, sorts and charts.
  • notes text, with the line break preserved inside the cell rather than spilling into the row below. The escaped pipe is a plain pipe.

The empty notes cell is genuinely empty rather than holding an empty string, which matters for COUNTA and for conditional formatting that tests for blanks.

One type per column, and why the whole column decides

The type is chosen once, from every value in the column, before any cell is written. If one value has to stay text, they all do, and each keeps its exact spelling.

The alternative, which is what most converters do, is to look at each cell on its own. That produces a column where 94043 is a number and 01730 is text, and Excel marks half the cells with the green "number stored as text" warning. Such a column cannot be sorted as a range, cannot be filtered numerically, and will not join against a column that is all one type.

So the rule costs you a numeric column occasionally and saves you a broken one regularly. When you do want the numbers, the fix is in the data: remove the trailing zero, or the leading zero, and the column converts.

Dates, without the off-by-one-day bug

Excel stores a date as a count of days from 30 December 1899. The usual way to write one from a browser is to build a JavaScript Date and pass it to a library, which is precisely how dates arrive a day early for everybody west of Greenwich.

No Date object is used here. The serial is computed from the year, month and day by arithmetic, in UTC, and written with an explicit number format. The cell holds the same integer on every machine in every timezone.

Only an exact YYYY-MM-DD is treated as a date. 03/04/2025 stays text, because whether that is March or April depends on who wrote it. A timestamp with an offset stays text too. If you want the literal strings everywhere, one switch turns date cells off entirely.

The setup you would otherwise do by hand

  • Sheet name taken from the heading above the table in your document, cleaned of the characters Excel refuses and trimmed to 31 characters. Type your own if you prefer.
  • Frozen header row by default. It is the first thing anyone does to a fresh sheet.
  • Fitted column widths, measured from the widest value and capped so one long note does not push everything off screen. A cell with a line break is measured by its longest line.
  • Filter dropdowns on request. Off by default because they change the print layout and not everybody wants them.

Frequently Asked Questions

Is this a real workbook or a renamed CSV?

A real .xlsx, written with the same library the rest of the site uses. It opens with a double click, with no import wizard and no delimiter question, and that is also what allows the cells to carry types at all.

Why is my version column text?

Because 5.0.0 is not a number and 2.4.1 is not either. Versions are identifiers. A converter that types cell by cell would make some of them numbers, which gives you the mixed column Excel marks with a green triangle and refuses to sort properly.

Do dates arrive as real dates?

An exact YYYY-MM-DD becomes a real date cell formatted yyyy-mm-dd, with the serial computed by UTC arithmetic so no timezone shifts it. Ambiguous formats like 03/04/2025 stay text on purpose, and a switch turns the whole behaviour off if you want the literal strings.

What happens to a cell with a br in it?

It becomes a single cell holding a real line break, which Excel shows as two lines in one cell. It does not spill into the row below, and the column width is measured from the longest line rather than the total length.

My README has four tables. Can I get four sheets?

Not in one workbook. Each table is listed with the heading above it as its label and converts to its own file. Tables in a document rarely share a shape, and stacking unrelated tables into one workbook usually creates more work than it saves.

Is anything uploaded?

No. The table is parsed and the workbook is built in your browser tab. Nothing is sent, stored or logged, and the tool works with the network off once the page has loaded.

Move the table into a spreadsheet

Typed cells, real dates, a frozen header and widths that already fit.

Back to the converter