Markdown table generator
Markdown table generator: from CSV, JSON or pasted cells
rows.page turns pasted cells or a file of up to 1.5 GB into a GitHub Flavored Markdown table of up to 1,000 rows, free with no signup. It reads CSV, TSV, JSON, JSONL and Parquet; filter, sort and hide columns first, then click Export > Markdown.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
Markdown table syntax cheat sheet
A GitHub Flavored Markdown table has a header row, a delimiter row of hyphens and any number of data rows. Pipes (|) separate the columns, and the pipes at the start and end of a line are optional.
| Column | Alignment | Pipe in cell |
| :--- | :---: | ---: |
| Left | Centered | a \| b |
| Text | More text | 100 |Colons on the delimiter row set the alignment: :--- aligns left, :---: centers and ---: aligns right. Escape a literal pipe inside a cell as \| so the parser does not split the cell in two.
| Element | Syntax | Result |
|---|---|---|
| Header row | | Name | Score | | Defines the column headings |
| Delimiter row | | --- | --- | | Separates the header from the data rows |
| Left align | :--- | Aligns column text to the left |
| Center align | :---: | Centers column text |
| Right align | ---: | Aligns column text to the right |
| Escaped pipe | \| | Shows a literal | inside a cell |
| No outer pipes | Name | Score | Works the same, because outer pipes are optional |
How to generate a Markdown table from CSV, JSON or pasted cells
Writing pipes by hand works for a few lines; for real data, convert what you already have. rows.page reads it inside your browser with DuckDB-WASM, so nothing is uploaded unless you click Share.
- Open rows.page and click Paste data, paste cells copied from Excel or Google Sheets (they arrive tab-separated) or raw CSV, TSV, JSON or JSONL, and click Open. Or drop a
.csv,.txt,.tsv,.tab,.json,.jsonl,.ndjson,.ldjson,.parquetor.pqfile onto the page. - Trim the table: hide columns in the Columns panel, click a column header to sort, or type a filter like
country:NL,price:>20or-name:*(is empty). - For more control, run a DuckDB SQL query that starts with
SELECT,WITHorFROMagainst the tabledatato pick, rename or aggregate columns. - Click Export and choose Markdown.
The export writes the first 1,000 rows of your current view, including its filter, sort, hidden columns or SQL result. Nulls become empty cells, a | inside a value is escaped as \|, line breaks inside a value become spaces, and list columns are written as JSON text. The delimiter row is plain ---, so add colons yourself if you want alignment.
rows.page does not open .xlsx or .xls workbooks: copy the cells and use Paste data, or save the sheet as CSV. You can't edit cells either, so fix typos in the source or rewrite values in a SELECT before exporting.
How to make a Markdown table readable
- Cut the columns: a table with dozens of columns wraps in an editor and scrolls sideways when rendered, so hide what the reader doesn't need or
SELECTonly the columns to show. - Right-align numbers: change
---to---:in the delimiter row so values are easier to compare. - Keep cells short: nested JSON opens as dot-path columns like
user.address.city(up to 8 levels deep, 200 child fields per object), and arrays export as JSON text, so drop orunnest()them in SQL if they make rows too wide. - Don't bother padding: the pipes don't need to line up for the table to render, which only matters to people reading the raw
.mdfile.
Where do Markdown tables render?
Pipe tables come from GitHub Flavored Markdown, not the original Markdown, so support depends on the parser your platform uses. GitHub renders them in README.md files, issues, pull requests, discussions and gists; check other targets before pasting a large table.
A table with more than a few dozen rows makes an issue or pull request long to scroll. Export a small sample as Markdown and link the full data instead: click Share in rows.page, or run curl -T data.csv https://rows.page, to get a link where readers can filter and sort every row.
What Markdown tables can't do
Markdown tables are flat grids. There is no syntax for merged cells (colspan or rowspan), footers or per-cell styling, and each row must stay on one line because a newline ends the row.
For a line break inside a cell on GitHub, use <br>. In rows.page, the Markdown export stops at the first 1,000 rows and has no format options, while CSV, Parquet, JSON and JSONL exports include every matching row of a filtered view, or up to 1,000,000 rows of a SQL result.
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files up to 1.5 GB, $0, no account, nothing uploaded |
| Share a link without an account | $0, files up to 100 MB, link deleted 7 days after creation |
| Free account | $0, 10 datasets kept, last 3 versions |
| Pro | $12/month, 100 datasets, files up to 500 MB, private links |
| Max | $39/month, 1,000 datasets, files up to 2 GB, private links |
Questions
How do I put a pipe character inside a Markdown table cell?
Escape it with a backslash as \| so the parser doesn't treat it as a column boundary. The rows.page Markdown export does this for you.
How many rows can rows.page export to a Markdown table?
The first 1,000 rows of your current filtered, sorted or SQL view. For more, export CSV, Parquet, JSON or JSONL, which write every matching row of a filtered view or up to 1,000,000 rows of a SQL result.
Can I generate a Markdown table from an Excel file?
Yes, through the cells: copy them in Excel, click Paste data on rows.page and export as Markdown, or save the sheet as .csv and drop it on the page. rows.page does not read .xlsx or .xls files, and pushing one returns "This looks like an Excel or zip file. Export it as CSV and push again."
How do I align columns in a Markdown table?
Add colons to the hyphens in the delimiter row, the second line of the table. Use :--- for left, :---: for center and ---: for right.
Does rows.page upload my file when I generate a Markdown table?
No. Opening a file or pasting data runs in your browser, up to 1.5 GB per tab for CSV, TSV, JSON and JSONL. Data is only uploaded if you click Share or push it with curl -T data.csv https://rows.page.