Table Generator - CSV to Markdown, HTML and Text Tables

    Paste a range from a spreadsheet or a CSV and get the same table back in four shapes at once: rendered, as HTML, as Markdown and as a plain text box. Pipes and angle brackets are escaped, uneven rows are padded rather than trimmed, and numeric columns can align themselves to the right.

    Parameters

    Enter data for calculations

    Convert data you have, or scaffold an empty grid

    Changes the meaning of the top row, not just its look

    Applies to the Markdown, the HTML and the text box

    Form progress0 / 1 fields

    💡 Fill in all required fields to unlock the calculate button

    Tables, and the four places they have to live

    The same three columns and four rows have to survive in a spreadsheet, a README file, a web page and a message where nothing but plain characters gets through. Four notations, four sets of rules, and a copied range that works in one of them and falls apart in the next. This tool takes what you paste and hands back all four shapes at once: a rendered table, its HTML, a Markdown block and a plain text box drawn with dashes and pipes. A pasted range of 3 columns and 3 rows comes out as a header row plus 3 body rows, with the two numeric columns already aligned to the right.

    It also works the other way round. If there is nothing to paste yet, ask for an empty grid of a given size and fill it in afterwards.

    4
    notations from one paste
    30 x 200
    largest table it will build
    0
    cells discarded on ragged input

    How to build a table, step by step

    1. Mode - convert what you paste, or start from an empty grid. Everything below adapts to the choice.
    2. Your rows - one row per line. Copying a range straight out of a spreadsheet gives you tab separated text, which is the cleanest input this tool can get.
    3. Column separator - leave it on automatic unless the detection guesses wrong. Automatic picks the character that splits every line into the same number of pieces.
    4. First row is a header - a header changes the meaning of the table, not just its look. Screen readers announce it before every cell in the column below.
    5. Column alignment - one setting for all columns, or the mixed option, which reads the data and right aligns any column holding nothing but numbers.
    6. Read the results - the rendered table, the Markdown block, the plain text box, and a line describing what was detected and what was padded.

    The four notations, side by side

    They are not interchangeable, and the differences matter more than they look. Merged cells exist in one of them only. Alignment exists in two. Accessibility information exists in one. Choosing the wrong one costs you a rewrite later.

    Notation Where it is read Alignment Merged cells The catch
    HTML web pages, email, anything with a browser engine yes yes verbose, and any stray character from your data has to be escaped
    Markdown README files, pull requests, issue trackers, wikis yes no tables are an extension, not part of the core Markdown specification
    Plain text box terminals, code comments, chat, log files by padding no needs a monospaced font, or the columns drift apart
    Separated values spreadsheets, databases, almost every import dialog no no this is the input side of this tool rather than its output

    Markdown alignment, the whole syntax

    Alignment in a Markdown table lives entirely in the second line, the one made of dashes. A colon on the left means left, a colon on both sides means centered, a colon on the right means right, and no colon at all leaves it to whatever is rendering the page. That line is also mandatory: a Markdown table without it is not a table, it is three lines of text with pipes in them.

    Dash row Meaning Typical use
    :---left alignednames, labels, descriptions, anything you read left to right
    :---:centeredshort status words, ticks and crosses, single characters
    ---:right alignedmoney, counts, percentages, anything you compare down a column
    ---unspecifiedleft to the renderer, which usually means left

    The mixed option applies that third row for you. Paste a sales range and the tool produces | :--- | ---: | ---: |, because the first column holds region names and the other two hold figures. A single stray word in a column is enough to keep it left aligned, which is deliberate: a column that is numbers except for one not measured is not a numeric column.

    What the same data looks like in each shape

    Three regions, two figures each, pasted straight from a spreadsheet as tab separated text. The Markdown block comes out like this:

    | Region | Units | Revenue |
    | :--- | ---: | ---: |
    | North | 120 | 4800 |
    | South | 95 | 3610 |
    | West | 143 | 5720 |

    And the plain text box, with every column padded to its widest entry and the two numeric columns pushed right:

    +--------+-------+---------+
    | Region | Units | Revenue |
    +--------+-------+---------+
    | North  |   120 |    4800 |
    | South  |    95 |    3610 |
    | West   |   143 |    5720 |
    +--------+-------+---------+

    Notice that the Markdown does not line up in the source and does not need to. Renderers ignore the spacing entirely. The plain text box is the opposite: the spacing is the whole mechanism, which is why it only holds together in a monospaced font.

    Four things that quietly break tables

    A pipe inside a cell. In Markdown the pipe is the cell boundary, so a value like 10 | 20 silently turns one cell into two and every row below it stops lining up. The fix is a backslash: this tool writes 10 \| 20, which renders as the original text. Almost nobody escapes this by hand, and it is the single most common reason a pasted table comes out crooked.
    A ragged range. Spreadsheet selections are frequently uneven, because the last row was never finished. Dropping the short rows loses data and padding the long ones loses columns, so this tool pads to the widest row and tells you how many empty cells it added. A three column range whose last row has two entries is reported as 1 empty cell added, and nothing is discarded.
    A header that is only bold. Making the top row bold looks like a header and is not one. A real header uses th rather than td, and carries scope="col" so assistive software knows the cell labels the column beneath it rather than the row beside it. The HTML this tool produces includes that attribute; a table pasted from a word processor usually does not.
    An unescaped angle bracket. Any value containing a tag, or something that merely looks like one, will be interpreted rather than displayed once it lands in a web page. In the rendered preview those characters are escaped for you. The Markdown block deliberately keeps your text exactly as typed, because that is the version you are going to copy.

    Reading the summary line

    Under the results the tool states what it decided, in the order it decided it. A line reading 3 columns by 3 body rows, plus a header row. Separator read as: tab. 2 columns were read as numeric and set right aligned. tells you three separate things: the shape it settled on, the character it split your text with, and how the mixed alignment classified each column. If any of those is wrong, the cause is almost always the separator, and overriding it from automatic to an explicit choice fixes the rest at once.

    Frequently asked questions

    Can I paste straight from Excel, Google Sheets or Numbers?
    Yes, and it is the best input this tool takes. Copying a range puts tab separated text on the clipboard, and a tab is the one separator that almost never appears inside a cell, so detection is reliable and nothing needs escaping. Leave the separator on automatic and it will report tab back to you.
    Why is my comma separated data splitting in the wrong places?
    Because commas live inside real data. An address, a decimal figure in a country that uses the comma as a decimal mark, a job title with a comma in it: each one adds a column that should not exist. Two ways out. Export with semicolons or tabs instead, or set the separator explicitly so at least the choice is yours. Quoted fields in the CSV sense are not interpreted here, so a value wrapped in quotation marks keeps its quotation marks.
    Does my Markdown table work everywhere?
    Not everywhere. Tables are an extension rather than part of the core Markdown specification, so support depends on what is doing the rendering. Code hosting platforms, issue trackers and most wikis handle them. A minimal renderer built strictly to the core specification will show your pipes as literal text. If you cannot control the renderer, the plain text box travels further, because it is only characters.
    Can I merge cells or span two columns?
    In HTML yes, in Markdown no. Markdown tables have no equivalent of colspan or rowspan, and there is no workaround that survives more than one renderer. If a merged cell is genuinely necessary, take the HTML from the preview and add the attribute by hand. More often the merge is a sign that two tables are pretending to be one.
    What are the limits, and what happens when I hit them?
    Thirty columns and two hundred body rows. Beyond either, the excess is dropped and the summary line says exactly how much went, so you are never left guessing whether the table is complete. Those numbers are not a technical ceiling, they are a readability one: a table wider than about a dozen columns has usually stopped being a table and become a spreadsheet that wants exporting instead.
    Why does the plain text box look wrong when I paste it into a document?
    Because the document is using a proportional font. The box aligns columns by counting characters and padding with spaces, which only works when every character occupies the same width. In a terminal, a code block or a monospaced style it is exact; in ordinary body text the columns lean. Wrap it in a code block and it snaps back into shape.
    I only want an empty grid to fill in later. Can it do that?
    Yes, that is the second mode. Ask for the number of columns and rows and you get the scaffolding in all four shapes, with headers numbered Column 1 upward if you asked for a header row. It is the quicker route when you are drafting a document and the content does not exist yet.

    Related tools

    Business Name Generator

    Combines industry vocabulary with your own keywords into name candidates worth checking - Open the generator

    QR Code Generator

    Turns a link, a Wi-Fi network or a contact card into a scannable code, drawn in your browser - Open the generator

    Lorem Ipsum Generator

    Fills the cells of a draft layout with placeholder copy of a chosen length - Open the generator

    Anagram Generator

    Rearranges the letters of a word and counts how many arrangements exist - Open the generator

    Barcode Generator

    Draws EAN-13, EAN-8 and UPC-A symbols with the check digit worked out - Open the generator

    Similar calculators from this section