How to export an excel spreadsheet as a formatted markdown table
- Step 1Put your table on the first sheet — The tool reads only the first sheet of the workbook (
Sheet1by default). Move the table you want to convert to the first tab, or save a single-sheet copy. Other sheets are ignored — they are not merged, listed, or selectable. - Step 2Make the first row your header — Row 1 is parsed as the column headers (SheetJS reads the first row as object keys). Delete any title banners, merged-cell captions, or blank spacer rows above your real header so that row 1 is the column names.
- Step 3Open the tool and drop the workbook — The Excel-to-Markdown page opens the JAD Markdown table converter. Drop your
.xlsxfile onto the dropzone. Parsing happens in your browser with SheetJS — nothing is uploaded. - Step 4Pick the column alignment — Choose Left, Centre, or Right. This writes the
:---(left),:---:(centre), or---:(right) separator row. The choice applies to every column — there is no per-column alignment, so pick the alignment that suits the majority of your data. - Step 5Generate the table — Click Convert to Markdown. The pipe table appears in the preview pane with a row/column count. The preview shows the first 5,000 characters of long output; the full table is still copied or downloaded in full.
- Step 6Copy or download — Click Copy to put the Markdown on your clipboard, or Download MD to save a
.mdfile. Paste straight into a README, ADR, or any GFM-compatible editor.
What each control does
The only user-facing control is column alignment. Everything else (header detection, escaping, first-sheet selection) is automatic. Behaviour verified against lib/json-to-markdown.ts and lib/excel/xlsx-csv-bridge.ts.
| Control / behaviour | What it produces | Default |
|---|---|---|
| Alignment: Left | Separator row uses :--- for every column | Default |
| Alignment: Centre | Separator row uses :---: for every column | Off (must select) |
| Alignment: Right | Separator row uses ---: for every column | Off (must select) |
| Header detection | First sheet row 1 becomes the Markdown header row | Automatic |
| Pipe escaping | | inside a cell becomes \| | Always on (not toggleable in the UI) |
| Line-break handling | In-cell \n collapses to a single space | Always on |
| Empty cells | Render as an empty Markdown cell | | | Always |
Accepted input and output
Input formats and output type per lib/excel/excel-tools-registry.ts (excel-to-markdown). Excel-family tier limits per lib/tier-limits.ts.
| Property | Value | Notes |
|---|---|---|
| Reliable input | .xlsx, .xls, .ods | Read via SheetJS; first sheet only |
| Output type | Markdown text (.md) | Copy to clipboard or download |
| Alignment scope | Whole table | One alignment for all columns, not per-column |
| Free tier | 5 MB · 10,000 rows · 1 file | Excel family limits |
| Pro tier | 50 MB · 100,000 rows · 5 files | Required tier for this tool |
| Developer tier | 500 MB · unlimited rows | For very large reference tables |
Cookbook
Real before/after conversions. The left block is the spreadsheet content; the right block is the exact Markdown the tool emits.
A simple three-column table
The most common case: a small reference table on the first sheet, first row is headers. Left alignment is the default.
Excel first sheet: Name Role Status Ada Engineer Active Grace Architect On leave Markdown output (alignment: left): | Name | Role | Status | | :--- | :--- | :--- | | Ada | Engineer | Active | | Grace | Architect | On leave |
A cell that contains a pipe character
A status value like Pass | Fail would normally split into two columns. The tool escapes the inner pipe to \| so the column count stays correct.
Excel cell value: Pass | Fail Markdown output: | Test | Result | | :--- | :--- | | Login | Pass \| Fail | GitHub renders "Pass | Fail" as a single cell, not two.
A cell with a line break
GFM pipe tables are one line per row. A cell holding a two-line note collapses to a single space-joined line.
Excel cell value (Alt+Enter inside the cell): Ship date confirmed awaiting QA sign-off Markdown output: | Task | Note | | :--- | :--- | | Release | Ship date confirmed awaiting QA sign-off |
Centre-aligned table for a spec sheet
Selecting Centre changes the separator row to :---: for every column. Useful when most columns are short codes or numeric flags.
Markdown output (alignment: centre): | Param | Min | Max | | :---: | :---: | :---: | | timeout | 0 | 30 | | retries | 1 | 5 |
Empty cells preserved
A sparse sheet with gaps keeps its shape — empty cells become empty Markdown cells so the column count never drifts.
Excel first sheet: Feature v1 v2 Export yes Import yes Markdown output: | Feature | v1 | v2 | | :--- | :--- | :--- | | Export | yes | | | Import | | yes |
Edge cases and what actually happens
Only the first sheet is converted
By designThe tool reads wb.Sheets[wb.SheetNames[0]] — the first sheet of the workbook. Additional tabs are ignored entirely; there is no sheet picker. Move the table you want to the first tab, or save a single-sheet copy, before converting.
Title banner above the header throws the columns off
Header misreadRow 1 is treated as the header. If row 1 is a merged title like Q3 Report and the real headers are on row 2, the Markdown header row will read Q3 Report (one column) and everything below misaligns. Delete the banner so the column names sit on row 1.
Merged cells flatten to a single value
Merge flattenedSheetJS reads a merged region as a value in its top-left cell and blanks for the rest. A header that spans three columns becomes one named column plus two empty ones — the visual merge does not survive into a flat pipe table. Unmerge before converting if column alignment matters.
Formula cells export as their computed value
SupportedSheetJS uses the cached computed value of a formula cell, so =A2*B2 exports as the number it currently shows. The formula text itself is not written into the Markdown. If you need the formula expression instead, that is a different tool (see excel-formula-explainer).
In-cell pipe characters
EscapedAny | inside a cell is escaped to \| so the value renders as text inside one cell instead of starting a new column. This is always on and cannot be disabled in the UI.
In-cell line breaks
CollapsedA cell with embedded newlines collapses to a single space-joined line, because GFM pipe tables cannot contain line breaks. If you need multi-line content, GFM tables are the wrong container — keep that content outside the table.
HTML inside a cell is not escaped
Rendered as HTMLDespite the internal option being named escapeHtml, the escape pass only handles | and newlines — angle brackets are left untouched. A cell containing <b>x</b> passes through verbatim, and GitHub will render it as bold. If raw HTML must show as text, neutralise it in the spreadsheet first.
Numbers may lose trailing zeros or show as scientific notation
Number coercionSheetJS reads numeric cells as JavaScript numbers, so 0123 becomes 123 and a 16-digit ID can round or show in exponential form. Format the column as Text in Excel (or prefix with an apostrophe) before converting if exact digit strings matter.
Dropping a raw CSV file
May failThe converter expects either a spreadsheet (.xlsx/.xls/.ods) or JSON text — a plain .csv is read as text and then JSON-parsed, which throws. To convert CSV, open it in a spreadsheet and save as .xlsx, or use the CSV-native tooling. Spreadsheet files are the reliable path here.
Pro tier required
Tier gateExcel-to-Markdown is a Pro-tier tool in the registry. On the free tier you can convert small files but the tool is gated to Pro for regular use. Excel-family free limits are 5 MB / 10,000 rows / 1 file.
Frequently asked questions
Does it support multi-sheet workbooks?
No. The tool reads only the first sheet of the workbook (wb.SheetNames[0]). There is no sheet selector — other tabs are ignored. Move the table you want to the first tab, or save a single-sheet copy, before converting.
Are special Markdown characters escaped?
Pipe characters (|) inside a cell are escaped to \| so they don't break the table structure, and in-cell line breaks become a single space. Other characters — backticks, asterisks, underscores, angle brackets — are passed through verbatim and may be interpreted as Markdown by the renderer.
What about cells with line breaks?
Line breaks inside a cell are replaced with a single space, because GFM pipe tables must be one line per row. There is no way to keep a multi-line cell inside a Markdown table; that content needs to live outside the table.
Can I set a different alignment per column?
No. The alignment control applies one alignment — left, centre, or right — to the whole table. The separator row uses the same marker (:---, :---:, or ---:) for every column. For mixed per-column alignment you would edit the separator row by hand after copying the output.
Which row becomes the header?
Row 1 of the first sheet. SheetJS reads the first row as the column keys, so make sure your real column names are on row 1 — not a merged title banner or a blank spacer row.
What file formats can I drop in?
Spreadsheet files — .xlsx, .xls, and .ods — are read reliably via SheetJS. JSON arrays also work because the underlying converter is a JSON-to-Markdown engine. A raw .csv is not reliable here; save it as .xlsx first.
Is my spreadsheet uploaded anywhere?
No. Parsing runs entirely in your browser with SheetJS. The workbook is never sent to a server; only an anonymous run counter (no file content) is recorded for signed-in dashboard stats, which you can opt out of.
How large a workbook can it handle?
Excel-family limits are 5 MB / 10,000 rows on Free, 50 MB / 100,000 rows on Pro, 200 MB / 500,000 rows on Pro-media, and 500 MB / unlimited on Developer. Very large tables also become unwieldy to read as raw Markdown.
Will formulas be converted to their results?
Yes. SheetJS uses the cached computed value, so a formula cell exports as the number or text it currently displays. The formula expression is not written into the table. To document the formula itself, use a formula-focused tool instead.
Why did my leading zeros disappear?
Numeric cells are read as numbers, so 00123 becomes 123 and long IDs may round or show in scientific notation. Format the column as Text in Excel (or prefix the value with an apostrophe) before converting to keep the exact digits.
Does it produce GitHub-Flavoured Markdown?
Yes. The output is standard GFM pipe-table syntax with leading and trailing pipes and a :--- / :---: / ---: separator row, which renders in GitHub, Confluence (Markdown mode), Notion, Obsidian, and most other GFM-compatible editors.
Can I download the result as a file?
Yes. Click Download MD to save the table as a .md file, or Copy to put the Markdown on your clipboard. The preview pane truncates display at 5,000 characters, but the copy and download contain the full table.
What sibling tools pair well with this?
For an HTML/Tailwind table instead of Markdown see excel-tailwind-export; for an inline SVG chart from the same data see excel-svg-dataviz; to generate SQL INSERT statements from the rows use json-to-sql. To inspect cell formats before converting, excel-format-inspector reports number and date formats.
Privacy first
Every JAD Excel tool runs entirely in your browser using SheetJS and ExcelJS. Your spreadsheets, formulas, and data never leave your device — verified by zero outbound network requests during processing.