若要將 CSV 轉換為 HTML 表格標記以用於 Power Automate 流程,請讓 CSV 走一趟基於瀏覽器的 RFC 4180 解析器,複製產生的 thead 與 tbody 片段,然後將其貼入 Compose 或 Variable 動作中。Power Automate 內建的「Create HTML table」動作接受的是 JSON 陣列,而不是原始 CSV 字串,而較舊的「Convert CSV to HTML table」連接器雖被列為已棄用,但並不保證有能完全符合您結構描述的替代項目。CSV to HTML 表格轉換器接受以逗號分隔的文字,可讓您自行決定第一筆紀錄是否為標頭,並輸出一段遵循 WHATWG 表格模型的 HTML 片段。解析、跳脫、預覽渲染與剪貼簿存取全部都在您目前的瀏覽器分頁中完成,因此 CSV 從不離開您的機器,也不會呼叫任何 Power Automate 連接器。在組合標記之前,每個儲存格都會先針對 HTML 文字內容進行跳脫,所以內容包含 <script> 或 <img onerror> 的 CSV 儲存格,在預覽中會以純文字顯示,而不會成為頁面上實際作用中的元素。

convert csv to html table power automate
為 Power Automate 將 CSV 轉換為 HTML 表格:更安全的步驟

Power Automate 內建的 CSV 轉 HTML 路徑及其限制

Microsoft Power Automate 內建兩個看起來像 CSV 轉 HTML 轉換器的動作,但兩者都無法搭配「以解析器優先」的工作流程。Data Operations 群組中的「Create HTML table」動作的 From 輸入接受形如 [{"col1":"row1","col2":"a"},{"col1":"row2","col2":"b"}] 的 JSON 陣列,預設套用一個標頭列,並輸出一個以 inline CSS 包裝在 div 中的完整樣式化 HTML 表格。若您的觸發條件給的是原始 CSV——例如以「Parse CSV」剖析的電子郵件附件,或是從 SharePoint 文件庫手動貼上的內容——您必須先針對一個由 split、map 與 compose 步驟所建立的 JSON 運算式執行 Create HTML table,這會增加延遲時間,並且會悄悄地把任何在引號文字中含有逗號的儲存格弄壞。

Encodian 的「Convert - Excel」連接器以及較舊的「Convert CSV to HTML table」動作能更直接地處理原始 CSV,但 Encodian 的路線需要付費 API 呼叫,而 Convert CSV to HTML table 動作在其說明文件頁面上已被標示為已棄用。一個已棄用的動作在連接器擁有者將其關閉前仍會持續運作,而建構在它之上的流程屆時就必須進行移轉,且無法保證有一對一的替代方案能保留標頭範圍、無障礙語意或回應式樣式。

瀏覽器端的解析器正好能直接補上這個缺口。CSV to HTML 表格轉換器接受以逗號分隔的文字,套用有文件記載的 RFC 4180 語法規則,並輸出一段您可直接貼入 Compose、Variable 或 Office 365 Outlook「Send an email (V2)」IsHtml 內文欄位的片段,接著由您自行加上外層樣式。跳脫在您的機器上僅執行一次,在標記離開瀏覽器之前就完成。

輸出結果:是片段,而非整頁

輸出結果是一個片段,而非一整頁。它包含一個 <table> 根元素,內含一列選擇性的 <thead>,由 <th> 儲存格組成,後面接著一個 <tbody> 群組,內含由 <tr> 列所構成的 <td> 儲存格。該片段內部不含 doctype、html、head、body、caption、CSS、JavaScript、ARIA 描述、排序、篩選、分頁或回應式外層包裝。啟用標頭選項時,第一筆紀錄會成為一個 thead 列;關閉時,每筆紀錄都會成為 tbody 中的 td 列。中段與尾段的空儲存格會予以保留,而前置的 UTF-8 BOM 在解析前會被去除,但後續出現的任何 U+FEFF 則會保留為資料。

在組合標記之前,每個儲存格都會針對 HTML 文字內容進行跳脫。& 符號、角括號、引號與單引號都會轉為實體。一個內容為 <script>alert(1)</script> 的 CSV 儲存格,在輸出中會呈現為 <td>&lt;script&gt;alert(1)&lt;/script&gt;</td>。頁面上的預覽是另外透過 React 文位元組點來呈現,完全不使用 dangerouslySetInnerHTML,這就是為什麼一個看似惡意的儲存格在本頁上會保持為純文字的緣故。下游應用程式仍必須自行將複製來的片段放入 HTML 內容上下文中,並強制執行自家的內容安全政策。

解析器不會修剪儲存格文字、推斷數字或日期、計算公式、合併儲存格、解讀註解、偵測試算表類型,或修復格式錯誤的紀錄。每筆紀錄的欄位數必須與第一筆紀錄完全相同;跨越邊界會回傳錯誤,而不會產生部分表格或悄悄截斷的表格。

為 Power Automate 流程將 CSV 轉換為 HTML 表格

  1. 將 Power Automate 觸發條件所取得的 CSV 內文放入 Variable 或 Compose 動作中,並複製原始字串——例如「When a new email arrives」(收到新郵件時)經「Parse CSV」剖析後的輸出,或是 HTTP 要求的 Body。
  2. 開啟 CSV to HTML 表格轉換器,將 CSV 字串貼入輸入區,並切換「first record contains column headings」(第一筆紀錄包含欄位標題)選項以符合您的來源。
  3. 點擊 Convert。若啟用標頭選項,所顯示的列數應等於資料紀錄數加 1,而欄數應符合第一筆紀錄的欄位數。若數字不符,表示您的 CSV 有列長不齊或未閉合的引號。
  4. 同時檢視安全預覽與產生的原始碼。含逗號的引號儲存格應出現在同一欄;像 "" 這種成對的引號應解碼為儲存格內的一個字面 "。
  5. 點擊 Copy HTML 來取得已跳脫的片段,然後將其貼入 Power Automate 中一個名稱(例如)為 HtmlTable 的 Compose 動作,並由下游「Send an email (V2)」動作的 IsHtml 內文欄位來參照它。
  6. 在電子郵件運算式中,以容器 div 或表格 caption 包住貼入的片段,加上符合您稽核標準所要求的 caption 與 scope 屬性,並在目標信箱上測試該電子郵件以確認渲染結果。

將片段放入 Power Automate 的執行階段中

該片段沒有外層包裝,因此 Power Automate 的電子郵件與核准動作需要一小段包裹運算式才能穩定渲染。在 Compose 或 Set variable 動作中,您可以建立一個類似 concat('<div><table border="1">', variables('HtmlTable'), '</table></div>') 的字串變數,然後在 Office 365 Outlook「Send an email (V2)」的 IsHtml 內文中參照該變數。Outlook 動作在渲染前會過濾 script 標籤,因此在解析器端進行跳脫就已足夠;Outlook 並不會送出 CSP 標頭,但電子郵件用戶端本身會套用其自身的過濾機制。

在 Microsoft Teams 中,可將同一字串貼入「Post adaptive card」或「Post message」動作並使用 HTML 格式,但 Teams 對 HTML 的支援比 Outlook 來得窄,大型表格可能需要拆成多個 adaptive card 欄。針對核准流程,可將包裝後的字串貼入「Start and wait for approval」動作的 Details 欄位中,該欄位支援有限的 HTML(包含表格)。在上述每一種情況中,重點在於解析器只產生一次已跳脫的文字,因此任何含有標記的儲存格都會以可見文字呈現,而不是可點擊的元素。

輸入字元數 500,000、列數 10,000、欄數 200、儲存格總數 200,000 以及輸出字元數 5,000,000 的硬性上限,可用來保護解析器。當 Power Automate 流程中的 CSV 超出任何一項上限時,系統會回傳明確的錯誤,而不是產生截斷的片段,這讓您可以在重新執行轉換前先抽樣檔案或對內文進行切片。

讓欄位保持對齊的解析規則

解析器遵循刻意設計得較為嚴格的 RFC 4180 風格方言。逗號是唯一的分隔符號;分號、Tab 與直立線符號仍視為一般儲存格字元。CRLF 是正式的紀錄結尾符,而獨立的 LF 與 CR 為符合真實資料來源的需求,會依文件所載的互通性延伸予以接受。最末端的紀錄結尾為選擇性,不會產生多餘的假列。加引號的欄位內可包含逗號與紀錄結尾符;在加引號的欄位中,兩個雙引號會解碼為一個字面上的引號。至於在未加引號的欄位中段出現的雙引號,則會予以拒絕,這正是用來避免以逗號切割每一行所造成的欄位悄悄錯位。

來源特性行為對輸出的影響
加引號欄位內含逗號保留為字面上的儲存格文字留在同一欄
加引號欄位內含成對引號 ""解碼為一個字面上的 "儲存格中為單一字元
加引號欄位內含 CRLF保留為儲存格內的換行不影響列數
紀錄結尾出現在尾端選擇性,非必要不會產生多餘的尾端列
未加引號欄位中含有 "予以拒絕並回傳錯誤轉換作業中止,不產生部分輸出
前置的 U+FEFF視為 UTF-8 BOM 並予以移除其他位置的 U+FEFF 仍保留為資料
紀錄寬度不一致予以拒絕並回傳錯誤轉換作業中止,不產生部分輸出

加入無障礙與回應式行為

即使語法上有效的表格,在過寬、缺少 caption、標題不夠清楚,或僅仰賴顏色區分時,仍可能無法存取或不便使用。本片段提供的是結構骨架;目的地頁面則提供語意。WHATWG HTML 表格規格建議將 caption 置為 table 的第一個子元素,以便螢幕閱讀器在讀取欄標頭前先行播報,且該規格亦建議在 th 儲存格上使用 scope="col" 來標示其標頭適用於其所屬的整欄。

為達到回應式效果,常見作法是將表格包在一個帶有 overflow-x:auto 的 div 中,讓寬表格能在小螢幕上水平捲動。至於行動優先的設計,則可透過一條小型 CSS 規則搭配 data-label 屬性,把每一列轉換為堆疊式的定義清單。無論選擇哪種方式,在電子郵件或網頁送交終端使用者之前,都應檢視解析器產生的片段,確認其標題是否清晰、是否具備 caption,以及是否具備非依賴顏色的條紋化設計。

Power Automate 的端對端工作流程其實很直觀:將 CSV 字串放入 Variable,將其貼入 CSV to HTML 表格轉換器,複製已跳脫的 thead 與 tbody 片段,再將其放入一個可由電子郵件或核准運算式讀取的 Compose 動作。解析器負責處理欄位對齊與跳脫;由目的地端補上 caption、scope 屬性與回應式外層包裝。當已棄用的連接器最終停止接受流程時,同樣的瀏覽器端步驟仍可持續運作,因為方言規則與跳脫行為是寫在解析器中,而非寫在 Power Automate 執行階段中。

若您正在權衡各種方案,CSV to JSON 命令列與線上工具之比較:實務指南對此有詳細說明。