How to export excel pricing data as a tailwind css table with dark mode
- Step 1Lay out tiers and features on the first sheet — Put the comparison grid on the first sheet with the header row first — for example
Feature | Free | Pro | Team. Only the first sheet is read, so keep the live table on tab one. - Step 2Drop the .xlsx or .csv onto the tool — SheetJS parses it in your browser; nothing uploads. Prices are read as formatted display text, so
$29.00or€29exports as the string you see in the cell. - Step 3Choose the bordered style —
borderedadds grid lines around each cell — usually the clearest for a tier comparison.striped(zebra) also works for long feature lists;compactfits more rows;minimalremoves borders entirely. - Step 4Turn on dark mode if your landing page is dark — Dark mode is off by default. On, it appends
dark:bg-gray-800 dark:text-gray-100to the wrapper, every<th>, and every<tr>. It does not adddark:classes to<td>or the<table>itself. - Step 5Copy the snippet or download table.html — Grab the HTML from the preview. There is no UI control for badges, sticky headers, or highlighted columns — those are post-export edits.
- Step 6Paste into your page and add the marketing polish by hand — Drop the snippet into your template, then add a 'Most Popular' badge, a highlighted column class, or CTA buttons directly in the HTML. Make sure the file is in your Tailwind
contentglobs so the classes survive the build.
What the tool does and doesn't do for pricing pages
Honest scope. The tool generates a data table; pricing-card flourishes are hand-edits.
| Pricing-page need | Built into the tool? | How to get it |
|---|---|---|
| Responsive table with grid lines | Yes | Pick bordered style |
| Dark mode classes | Yes | Toggle darkMode on |
| Horizontal scroll on mobile | Yes | Always wrapped in overflow-x-auto |
| 'Most Popular' badge on a tier | No | Add the badge HTML after export |
| Highlighting / emphasising one column | No | Add classes to that column's cells by hand |
| Sticky header row when scrolling | No | Add sticky top-0 to <thead>/<th> after export |
| Per-tier CTA buttons | No | Add <a>/<button> cells after export |
Style choice for pricing layouts
How each style reads as a pricing/comparison grid.
| Style | Look | Best for |
|---|---|---|
bordered | Full grid lines around every cell | Feature-by-tier comparison grids |
striped | Zebra rows (even:bg-gray-50) | Long single-axis feature lists |
compact | text-xs, tight padding | Many features in limited vertical space |
minimal | No borders, just spacing | Tables inside an existing bordered card |
Plan limits
Pro-tier feature, excel family limits. A pricing table is tiny, so size is rarely a concern here.
| Plan | Max file size | Max rows |
|---|---|---|
| Free | Not available (Pro required) | — |
| Pro | 50 MB | 100,000 |
| Pro-media | 200 MB | 500,000 |
| Developer | 500 MB | Unlimited |
Cookbook
Real pricing-sheet inputs and the table HTML they produce — plus the manual edits that turn a data table into a marketing pricing block.
Pricing comparison sheet to bordered dark table
Tier names in row 1 become column headers. Bordered + dark mode is the typical landing-page combination.
Input (first sheet):
Feature | Free | Pro | Team
Projects | 3 | 50 | Unlimited
Seats | 1 | 5 | 20
Price / month | $0 | $29 | $99
Config: style = bordered, darkMode = on
<div class="overflow-x-auto dark:bg-gray-800 dark:text-gray-100">
<table class="w-full text-sm ... border border-gray-300 border-collapse">
<thead><tr>
<th class="px-3 py-2 bg-gray-50 font-semibold border border-gray-300 dark:bg-gray-800 dark:text-gray-100">Feature</th>
... Free / Pro / Team ...
</tr></thead>
<tbody>
<tr class="dark:bg-gray-800 dark:text-gray-100">
<td class="px-3 py-2 border border-gray-200">Projects</td> ...
</tr>
</tbody>
</table>
</div>Currency and symbols survive as text
Cells are read as formatted display text and HTML-escaped, so currency strings and comparison symbols render exactly.
Input cells: $1,299.00 | <100 ms | "24/7" support Output <td> values: <td ...>$1,299.00</td> <td ...><100 ms</td> <td ...>"24/7" support</td> Renders as: $1,299.00 | <100 ms | "24/7" support
Adding a 'Most Popular' badge by hand
The tool won't add a badge. After export, drop a span into the Pro header cell.
// exported header cell: <th class="px-3 py-2 bg-gray-50 font-semibold border border-gray-300">Pro</th> // hand-edited: <th class="px-3 py-2 bg-gray-50 font-semibold border border-gray-300 relative"> Pro <span class="ml-2 rounded bg-indigo-600 px-2 py-0.5 text-xs text-white">Most Popular</span> </th>
Making the header sticky after export
Sticky headers are not a tool option. Add sticky top-0 to the thead/th classes once on the exported HTML.
// exported:
<thead>
<tr>
<th class="px-3 py-2 bg-gray-50 font-semibold border border-gray-300">Feature</th>
// hand-edited for a sticky header in a scrollable container:
<thead class="sticky top-0">
<tr>
<th class="px-3 py-2 bg-gray-50 font-semibold border border-gray-300 sticky top-0 z-10">Feature</th>Highlighting the recommended column
Emphasising a tier is a post-export edit — add a background/ring class to that column's cells.
// add to every cell in the Pro column after export: <th class="... bg-indigo-50 dark:bg-indigo-950">Pro</th> <td class="... bg-indigo-50 dark:bg-indigo-950">50</td> // the tool itself applies one class set to all columns equally; // per-column emphasis is manual.
Edge cases and what actually happens
Expecting a marketing pricing-card layout
Data table onlyThe tool outputs a plain comparison table, not stacked pricing cards with badges and CTA buttons. Use it for the comparison grid and add the marketing chrome (badges, highlighted tier, buttons) by editing the exported HTML.
Wanting a 'Most Popular' badge from the UI
Not built inThere is no badge option. Add the badge markup to the relevant <th> after export — see the cookbook for the snippet.
Wanting a sticky header for a long comparison
Not built inSticky headers are not generated. Add sticky top-0 (and a z- class) to the <thead>/<th> on the exported HTML inside a scrollable container.
Wanting one tier column highlighted
Not built inThe same class set is applied to every column equally. To emphasise the recommended tier, add a background/ring class to that column's cells manually after export.
Prices stored as raw numbers without a currency format
By designCells export as their formatted display text. If a price is stored as the bare number 29 with no currency formatting, the cell shows 29, not $29. Format the cell in Excel (so it displays $29.00) before exporting, or add the symbol in the spreadsheet.
Pricing lives on the second sheet
First sheet onlyOnly sheet index 0 is read. Move the pricing grid to the first tab, or export that tab as its own file.
Dark classes don't activate
Config issueThe dark: variants only apply under Tailwind's class dark-mode strategy, which most landing pages use via a dark class on <html>. If your site has no dark-mode strategy configured, the dark classes have no effect.
Table unstyled after deploy
Purge issueIf the page template holding the snippet isn't in your Tailwind content globs, the classes are purged in the production build. Add the file to content and rebuild.
Free tier
402 Pro requiredThis is a Pro feature; the Free tier can't run it. Upgrade to Pro or higher.
Frequently asked questions
Does this work with Tailwind Play CDN for prototyping?
Yes, but you add the CDN yourself — the tool does not emit a CDN tag. Wrap the snippet in your own HTML page and add <script src="https://cdn.tailwindcss.com"></script> to the head; the table classes then render in any browser.
Can I add a 'Most Popular' badge to a column via the tool?
No. The UI has only two options (style and darkMode). Add the badge HTML to the relevant header cell after export — the cookbook shows the exact <span> to drop in.
Does the tool support sticky header rows for long tables?
No — it does not add a sticky class. For a sticky header in a scrollable container, add sticky top-0 (and a z- class) to the <thead>/<th> on the exported HTML.
Can I highlight or emphasise the recommended tier column?
Not from the tool — it applies one class set to all columns equally. To emphasise a tier, add a background or ring class (for example bg-indigo-50) to that column's cells manually after export.
Which style is best for a pricing comparison?
bordered is usually clearest because the grid lines separate each tier/feature cell. striped works for long single-axis feature lists, compact packs more rows in, and minimal suits a table already inside a bordered card.
How do prices appear in the output?
As the formatted display text of the cell. If Excel shows $29.00, that's what exports. A bare 29 with no currency format exports as 29 — format the cell first if you want the symbol.
Which sheet does it read?
The first sheet only, with row 1 as the headers (your tier names). Keep the live pricing grid on the first tab; there is no sheet picker.
Where do the dark mode classes go?
dark:bg-gray-800 dark:text-gray-100 is appended to the wrapper <div>, every <th>, and every <tr> — not to <td> or <table>. They only take effect under Tailwind's class dark-mode strategy.
Will currency symbols or < > break the HTML?
No. Every cell is HTML-escaped for &, <, >, and ", so <100ms or "24/7" renders as literal text rather than breaking the markup.
Does my unreleased pricing get uploaded?
No. SheetJS parses the file and generates the HTML entirely in your browser. Nothing is sent to a server, so pre-launch pricing stays on your machine.
Can it accept a CSV?
Yes — both .xlsx and .csv are accepted, and the first row is treated as the headers.
Can I get the pricing data as Markdown or SQL instead?
Those route through the JSON family: use JSON to Markdown for a Markdown table or JSON to SQL for inserts. For a chart of the data, the Excel SVG dataviz tool produces an SVG.
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.