To produce a clean HTML table snippet from an .xlsx worksheet for Power Automate flows, run the local workbook through a bounded browser converter that reads stored cell values, escapes every character, and emits a semantic thead and tbody string — the Excel to HTML Table Converter does exactly this in a single tab. Power Automate designers often need a static HTML table for the Send an email (V2) action with an HTML body, the Start and wait for approval description, an HTTP webhook payload, or a SharePoint rich-text field. Building that snippet by hand from a sheet is slow and error-prone, and pasting raw cell text risks unescaped angle brackets or ampersands that break the markup. A local converter reads the worksheet, escapes every cell, and returns a self-contained string that can be pasted straight into a Compose action or an expression. The original workbook stays on the machine, so regulated data does not pass through an external service before reaching the flow.

Why Power Automate Flows Need an HTML Table From Excel
Power Automate rewards string outputs. Most notification, approval, and integration actions accept a single text expression that gets evaluated and rendered, and a well-formed HTML table is one of the simplest ways to deliver structured rows inside that string. The native Create HTML table action works for arrays of objects, but it does not consume a worksheet directly. When the source data is already sitting in Excel — a OneDrive workbook, a SharePoint document library item, a Forms export, or an attachment coming from another flow — the sheet still has to be projected into an HTML string before the email or approval step can use it.
Hand-crafting that string inside Power Automate expressions is fragile. Long concatenations of the concat() function, an apply-to-each loop building tr and td fragments, and a hand-written thead make the expression hard to read and easy to break. A pre-built snippet that already has the escaping applied and the thead and tbody structure in place removes that friction. The snippet is pasted into a Compose action or a Variable, then referenced from the body expression of the downstream action.
The escape step matters more than the markup. A worksheet cell can contain text that resembles markup or script tags. Emitted raw, that text would either render as broken markup or behave differently across email clients. A bounded converter that runs entirely in the browser and applies HTML entity escaping to every cell value before composing the string removes that risk without changing the visible data.
What the Excel to HTML Table Converter Actually Produces
The Excel to HTML Table Converter reads stored cell values from one selected worksheet inside a local .xlsx file and returns a single HTML string. The selected first row is placed inside a thead element, every later row inside a tbody, and each value is HTML-escaped before it is inserted. Angle brackets become < and >, ampersands become &, quotation marks become ", and apostrophes become '. The result is a self-contained snippet that opens cleanly in any HTML-aware destination and that never runs spreadsheet content such as formulas, macros, or external connections.
Because the output is built from stored values rather than a live recalculation, formula cells appear as whatever value the workbook already cached for them. Empty cells become empty td elements rather than omitted columns, and numeric cells keep their underlying text representation. If a workbook saved dates as serial numbers without formatting, the snippet will show those serial numbers rather than a friendly date — a strong reason to inspect the output in the preview before pasting it into a flow.
The snippet is intentionally narrower than an Excel rendering. The table below compares what the snippet preserves and what it does not reproduce, so Power Automate designers can decide which workbook choices are safe to publish and which need a different delivery channel.
| Excel feature in the source workbook | Present in the HTML snippet | Why it matters in Power Automate |
|---|---|---|
| Stored cell values (text and numbers) | Yes, as escaped td text | Safe to paste into an email body, an approval description, or a webhook payload that contains HTML |
| First-row column labels | Yes, as thead th elements | Renders as a header row in email clients and inside approval cards |
| Cell formatting (fonts, colors, borders, widths) | No | Apply destination CSS for branded emails rather than expecting Excel styling to follow the data |
| Formula recalculation | No, stored value only | Recalc in Excel first if the flow depends on a formula result, then convert the saved copy |
| Merged cells, charts, images, comments | No | Use a richer delivery format if the visual structure carries meaning |
| Macros, external links, data connections | Never executed | The conversion never opens a network channel for spreadsheet content |
Convert a Worksheet to an HTML Snippet for Power Automate
This is the concrete workflow that produces the snippet a Compose or Variable action can reference from a downstream email or approval step. Running the conversion in the same browser tab where Power Automate is open keeps the copy and paste step simple.
- Open the Excel to HTML Table Converter in a browser tab and confirm the workbook is a normal .xlsx file under 20 MB. To sanity-check the sheet before converting, the browser-based preview workflow described in the guide on how to open Excel files online in a browser preview lets you inspect the source without leaving the machine.
- Pick the workbook from the local file system. The file is read entirely in the tab; nothing is uploaded to a server.
- Select the worksheet whose first row should become the table header. If the source data has its real header on row two and a title row above it, delete or move the title row in Excel first so the converter does not turn the title into a thead.
- Trigger the conversion. The page produces a visible HTML preview alongside an escaped snippet shown in a code-style block.
- Inspect the preview. Confirm the header row contains the labels recipients should see, spot-check a few body cells, and confirm there is no leftover formula syntax showing through.
- Copy the snippet or download it as a file. Power Automate flows accept multi-line text directly, so the snippet is usually pasted into a Compose or Initialize variable action.
- In Power Automate, drop the snippet into the expression for the email body, the approval description, or the HTTP payload. Wrap the value in inline styling if the destination brand needs a particular look.
The same snippet can be reused across many flows as long as the source sheet does not change. When the workbook is updated, rerun the converter to refresh the snippet rather than hand-editing the markup inside the flow expression.
Limits That Decide Whether the Conversion Succeeds
The converter enforces a fixed set of safety and size limits before it parses the workbook. Crossing any one stops the operation with a clear error rather than producing a misleading partial table. The table below lists the values that govern whether the snippet a flow depends on will actually appear.
| Limit | Value | Effect on a Power Automate workflow |
|---|---|---|
| Workbook file size | Up to 20 MB on disk | Larger reports must be split or trimmed before the snippet step |
| Worksheet addressed cells | Up to 100,000 cells in the selected sheet | A very wide report needs row or column reduction first |
| Generated HTML size | Up to 10 MiB of escaped markup | Power Automate email actions have their own body caps, so keep the snippet well below the action limit |
| ZIP entries inside the .xlsx | Up to 2,000 entries | Highly decorated workbooks with many embedded parts can fail this check |
| Declared expanded content | Up to 50 MB | Catches compressed workbooks that would expand past browser memory |
| Unsupported workbook shapes | Zip64, multi-disk, damaged, encrypted, legacy .xls, macro-enabled | These stop with an explicit error rather than silently truncating |
If a sheet fails one of these checks, the right fix is usually to narrow the worksheet in Excel itself rather than to retry with a different tool. Delete unused columns, drop pivot caches that are not needed for the snippet, save a copy containing only the target sheet, and rerun the conversion.
Where the Snippet Fits Inside a Power Automate Flow
Once the escaped snippet exists, it behaves like any other string artifact in a flow. The most common placement is a Compose action that holds the HTML, followed by a downstream action that references outputs('Compose'). For email delivery, the Send an email (V2) action body accepts HTML directly, and wrapping the snippet in a basic inline style keeps tables readable in Outlook and Gmail. For approvals, the Start and wait for approval details field accepts the same snippet, which is useful when an approver needs row context before responding. For external systems, an HTTP action can post the snippet inside a JSON payload as a string property, letting a downstream service render it inside its own template.
Two patterns are worth keeping in mind. First, parameterise the sheet selection outside the snippet so the same flow can target different reports without rebuilding the converter output. Second, when the workbook is itself a flow trigger — for example, the When a file is created or modified trigger on a SharePoint document library — rerun the converter offline and update a stored Compose variable on a schedule rather than building an HTML table inside the flow expression. The converter's escaping is already correct, so reusing its output avoids re-implementing the escape rules inside Power Automate's expression language.
Reviewing the Snippet Before You Paste It Into a Flow
A snippet that looks correct in the converter preview can still be wrong for a specific destination. Email clients vary in how they handle inline styles versus CSS classes, approval cards truncate long bodies at different lengths, and SharePoint rich-text fields may strip elements the destination considers unsafe. A quick review pass helps catch these gaps before the snippet reaches production.
Open the downloaded snippet in a text editor and confirm four things: the thead contains exactly the column labels recipients should see, every td is closed, no leftover Excel formula syntax appears in body cells, and there are no unescaped angle brackets. If the destination needs accessible markup, add scope and caption tags around the snippet before pasting; the converter only emits structural table markup, so accessibility decisions are a separate step. If the destination needs visual styling, add inline CSS to the th and td elements inside the snippet rather than expecting the converter to reproduce Excel fonts or colors.
Keep the original workbook as the source of record. The snippet is a representation, not a translation, and updating the source workbook always produces a more reliable result than editing the snippet by hand inside the flow expression.
Related reading: How to Convert Excel to JSON Outside the GST Offline Tool.