What the clipboard actually holds
Copy a range in Excel, Google Sheets or Numbers and the plain-text flavour on the clipboard is tab-separated: cells joined with a tab, rows with a newline. That is why pasting a spreadsheet range into a plain text box produces something parseable rather than a jumble, and it is why tab is the first thing detection looks for. If there is no tab in the first line, the delimiter is whichever of comma, semicolon and pipe appears most often there.
Semicolons show up because spreadsheets in locales that use a comma as the decimal separator export CSV with semicolons instead — a French or German export of the same sheet will not look like the US one. Detection handles it, and the override is there for the case where the first row is unrepresentative.
Quoted fields follow RFC 4180: a field wrapped in double quotes may contain the delimiter, a newline, or a doubled "" standing for one literal quote. Everything is parsed in the page — nothing is uploaded, which for a spreadsheet of real data is the property that matters.
thead, tbody and the scope attribute
Splitting a table into <thead> and <tbody> is not cosmetic. A screen reader uses the header cells to announce which column a value belongs to as the user moves across a row, so the difference between a well-marked table and a grid of <td> is the difference between "Thickness, 1.5 inches" and "1.5 inches". Browsers also repeat <thead> at the top of each page when printing a long table, and it gives CSS a clean hook.
The generated header cells carry scope="col", which states explicitly that each one heads its column. For a simple grid this is a small clarification; for anything with more structure it removes guesswork the assistive technology would otherwise have to do. If your data also has a header column — the first cell of every row naming the row — change those <td> elements to <th scope="row"> by hand. That case cannot be detected reliably from the data alone.
Inline styles or a class
Turn the inline borders on when the destination will not let you add CSS: an email body, a CMS rich-text field, a marketplace listing, a forum post. Those contexts routinely strip <style> blocks and class names while leaving style attributes intact, so inline is the only styling that survives.
On your own site, do the opposite. Turn the borders off, put a class on the table and style it from your stylesheet — one rule instead of a style attribute repeated on every cell, and a table you can restyle without regenerating the markup. A hundred-row table carries a hundred copies of the same declaration otherwise.
What Markdown cannot do
GitHub-flavoured Markdown tables are deliberately minimal. A header row is required, so a headerless table gets one invented. Alignment is per column and set by where the colons go in the separator row — :---, :---:, ---: — which means per-cell alignment, including the right-align-numbers option, has no equivalent. There is no rowspan, no colspan, and no multi-line cell; a line break inside a cell needs a literal <br>. Pipes inside cell text are escaped as \| for you.
The column padding in the output is there so the source is readable in a diff. It has no effect on rendering — a table with ragged pipes renders identically — so if a wide column is making the source unwieldy, collapsing the padding costs nothing.
Questions people ask
Some rows have fewer columns than others.
They are padded with empty cells out to the width of the longest row, and you get a note saying so. The usual cause is merged cells in the source: a merge spanning three columns copies as one value followed by nothing. Unmerge in the spreadsheet and copy again, or add the colspan attributes by hand afterwards.
How does the number detection decide what is a number?
A cell counts as numeric if it consists only of digits, thousands separators, one decimal point, an optional leading minus, an optional leading currency symbol and an optional trailing percent sign. So 1,234, -8.5, $4.28 and 12% are numbers; "4.28 USD" and "about 12" are not, because a unit or a word after the digits usually means the cell is prose.
Can I put a link or bold text in a cell?
Not through the input. Every cell is HTML-escaped, so a tag you type arrives as visible text rather than markup — which is the correct default, since data pasted from a spreadsheet should never be able to inject markup. Generate the table, then edit the specific cells you want to enrich.
My CSV has commas inside the values.
That is fine as long as those fields are wrapped in double quotes, which is what any spreadsheet exporting CSV does. The parser follows RFC 4180 and treats a delimiter inside quotes as content. A file with unquoted embedded commas is genuinely ambiguous and no parser can resolve it.