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.

.csv.tsv.json
Drop a file here
Stays in your browserUp to 1.5 GB

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.

markdown
| 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.

Markdown table syntax cheat sheet
ElementSyntaxResult
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 pipesName | ScoreWorks 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.

  1. 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, .parquet or .pq file onto the page.
  2. Trim the table: hide columns in the Columns panel, click a column header to sort, or type a filter like country:NL, price:>20 or -name:* (is empty).
  3. For more control, run a DuckDB SQL query that starts with SELECT, WITH or FROM against the table data to pick, rename or aggregate columns.
  4. 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 SELECT only 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 or unnest() 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 .md file.

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

WhatLimit or price
Open a file in your browserFiles 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.