如何使用 IronXL 在 C# 中將 HTML 表格匯出到 Excel
從HTML表格資料中提取並轉換為Excel表單是商業應用中的常見需求——無論是用於資料遷移、報表生成還是需要進一步分析的網頁。 本指南提供了清晰的步驟,說明如何使用IronXL和HTML Agility Pack將資料從HTML表格導出為Excel格式。
當您需要將HTML表格導出為Excel時,了解Excel工作表結構與HTML表格之間的關係至關重要。 本指南演示了如何從HTML表格高效轉移資料到Excel格式,建立維持資料完整性的專業Excel工作表輸出。
IronXL為您提供了一種靈活的方法,將HTML表格內容轉換為Excel工作表,將其強大的Excel操作功能與HTML解析相結合,以在C#中導出HTML表格到Excel。 無論您是需要從URL下載資料還是處理來自資料庫的內容,此解決方案都可以處理各種輸入場景,而無需在機器上安裝Microsoft Office。
為什麼要使用IronXL導出HTML表格資料?
IronXL在建立和操作Excel文件時不需要安裝Microsoft Office,使其非常適合伺服器環境和跨平台應用程式。 配合HTML Agility Pack——一個有能力的HTML文件和內容解析器,IronXL成為將任何HTML表格結構轉換為Excel表單資料的多功能解決方案。 此方法適用於.NET 10應用程式,並能有效處理大型資料集。
不像如Syncfusion Excel library的XlsIO等程式庫只提供對特定HTML格式和表格結構的ImportHtmlTable功能,IronXL方案使開發者能完全控制解析和轉換過程。 這種靈活性意味著開發者可以處理像巢狀表格、客製化資料格式和選擇性欄位提取等複雜場景,這是剛性的內建方法無法適應的。
IronXL還提供完整的Excel功能,包括公式支持、單元格樣式、多工作表管理以及各種匯出格式(XLSX、XLS、JSON和CSV)。 您可以建立圖表、匯出為PDF並管理隱藏的字段資料,使其成為超越簡單HTML表格轉換的Excel自動化完整解決方案。
您如何安裝所需的程式庫?
通過NuGet包管理器安裝IronXL和HTML Agility Pack。 IronXL提供免費試用,讓您在購買授權之前測試所有功能。
包管理控制台
:ProductInstall
Install-Package HtmlAgilityPack
:ProductInstall
Install-Package HtmlAgilityPack
.NET CLI
dotnet add package IronXL.Excel dotnet add package HtmlAgilityPack
這些NuGet包允許您通過程式建立、載入和保存Excel文件。 安裝完兩個包後,請在您的C#文件頂部新增所需的using語句:
using IronXL;
using HtmlAgilityPack;
using System;
using System.Linq;
using IronXL;
using HtmlAgilityPack;
using System;
using System.Linq;
Imports IronXL
Imports HtmlAgilityPack
Imports System
Imports System.Linq
這些程式庫結合得很好,HTML Agility Pack負責HTML解析,而IronXL則負責Excel文件建立和操作。 此範例演示了將HTML表格轉換為XLSX格式的清晰方法。
您如何使用HTML Agility Pack解析HTML表格資料?
HTML Agility Pack提供了一種簡單的方法,通過XPath表達式來導航HTML文件。 以下程式碼展示了如何從HTML表格中提取資料並準備導出:
// Sample HTML table with product data
string htmlContent = @"
<table>
<thead>
<tr>
<th>Product</th>
<th>Price</th>
<th>Stock</th>
</tr>
</thead>
<tbody>
<tr>
<td>Laptop</td>
<td>$999</td>
<td>15</td>
</tr>
<tr>
<td>Mouse</td>
<td>$25</td>
<td>50</td>
</tr>
<tr>
<td>Keyboard</td>
<td>$75</td>
<td>30</td>
</tr>
</tbody>
</table>";
// Load HTML document for parsing
var doc = new HtmlDocument();
doc.LoadHtml(htmlContent);
// Select the HTML table element using XPath
var table = doc.DocumentNode.SelectSingleNode("//table");
// Sample HTML table with product data
string htmlContent = @"
<table>
<thead>
<tr>
<th>Product</th>
<th>Price</th>
<th>Stock</th>
</tr>
</thead>
<tbody>
<tr>
<td>Laptop</td>
<td>$999</td>
<td>15</td>
</tr>
<tr>
<td>Mouse</td>
<td>$25</td>
<td>50</td>
</tr>
<tr>
<td>Keyboard</td>
<td>$75</td>
<td>30</td>
</tr>
</tbody>
</table>";
// Load HTML document for parsing
var doc = new HtmlDocument();
doc.LoadHtml(htmlContent);
// Select the HTML table element using XPath
var table = doc.DocumentNode.SelectSingleNode("//table");
' Sample HTML table with product data
Dim htmlContent As String = "
<table>
<thead>
<tr>
<th>Product</th>
<th>Price</th>
<th>Stock</th>
</tr>
</thead>
<tbody>
<tr>
<td>Laptop</td>
<td>$999</td>
<td>15</td>
</tr>
<tr>
<td>Mouse</td>
<td>$25</td>
<td>50</td>
</tr>
<tr>
<td>Keyboard</td>
<td>$75</td>
<td>30</td>
</tr>
</tbody>
</table>"
' Load HTML document for parsing
Dim doc As New HtmlDocument()
doc.LoadHtml(htmlContent)
' Select the HTML table element using XPath
Dim table = doc.DocumentNode.SelectSingleNode("//table")
此程式碼將HTML內容載入到HtmlDocument物件中,並使用XPath查詢和選擇表格元素。 SelectSingleNode方法返回HTML中找到的第一個表格,使得在存在多個表格時方便地定位特定表格。然後每個表格行將被處理以提取單元格值進行轉換。
哪種XPath表達式對表格解析最有效?
對於標準的HTML表格,XPath表達式//table選擇文件中的第一個表格。 在處理包含多個表格的複雜頁面時,您可以使用位置選擇器如(//table)[2]來根據索引定位特定表格。 像//table[@class='products']這樣的基於屬性的選擇器在表格攜帶有意義的標識符時也很有用。
當HTML來自在線URL時,您可以使用HtmlWeb類直接載入文件:
var web = new HtmlWeb();
var remoteDoc = web.Load("https://example.com/data-page");
var remoteTable = remoteDoc.DocumentNode.SelectSingleNode("//table[@class='data-table']");
var web = new HtmlWeb();
var remoteDoc = web.Load("https://example.com/data-page");
var remoteTable = remoteDoc.DocumentNode.SelectSingleNode("//table[@class='data-table']");
Dim web As New HtmlWeb()
Dim remoteDoc = web.Load("https://example.com/data-page")
Dim remoteTable = remoteDoc.DocumentNode.SelectSingleNode("//table[@class='data-table']")
這使您可以直接從公共網頁中提取表格,而無需先手動保存HTML。
您如何使用IronXL導出解析資料到Excel?
通過IronXL,您可以將解析的HTML表格資料轉換為格式完善的專業Excel電子表格。 以下程式碼演示了如何使用自定義樣式導出資料:
// Create a new Excel workbook
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Exported Data");
// Extract and write headers
var headers = table.SelectNodes(".//thead/tr/th");
if (headers != null)
{
for (int col = 0; col < headers.Count; col++)
{
workSheet.SetCellValue(0, col, headers[col].InnerText.Trim());
// Apply header formatting
var headerCell = workSheet.GetCellAt(0, col);
headerCell.Style.Font.Bold = true;
headerCell.Style.BackgroundColor = "#4CAF50";
}
}
// Extract and write data rows
var rows = table.SelectNodes(".//tbody/tr");
if (rows != null)
{
for (int row = 0; row < rows.Count; row++)
{
var cells = rows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
string cellValue = cells[col].InnerText.Trim();
workSheet.SetCellValue(row + 1, col, cellValue);
}
}
}
}
// Auto-fit columns for better readability
for (int col = 0; col < headers?.Count; col++)
{
workSheet.AutoSizeColumn(col);
}
// Save the Excel file
workBook.SaveAs("ExportedTable.xlsx");
// Create a new Excel workbook
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet workSheet = workBook.CreateWorkSheet("Exported Data");
// Extract and write headers
var headers = table.SelectNodes(".//thead/tr/th");
if (headers != null)
{
for (int col = 0; col < headers.Count; col++)
{
workSheet.SetCellValue(0, col, headers[col].InnerText.Trim());
// Apply header formatting
var headerCell = workSheet.GetCellAt(0, col);
headerCell.Style.Font.Bold = true;
headerCell.Style.BackgroundColor = "#4CAF50";
}
}
// Extract and write data rows
var rows = table.SelectNodes(".//tbody/tr");
if (rows != null)
{
for (int row = 0; row < rows.Count; row++)
{
var cells = rows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
string cellValue = cells[col].InnerText.Trim();
workSheet.SetCellValue(row + 1, col, cellValue);
}
}
}
}
// Auto-fit columns for better readability
for (int col = 0; col < headers?.Count; col++)
{
workSheet.AutoSizeColumn(col);
}
// Save the Excel file
workBook.SaveAs("ExportedTable.xlsx");
Imports System
Imports System.Xml
' Create a new Excel workbook
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Exported Data")
' Extract and write headers
Dim headers As XmlNodeList = table.SelectNodes(".//thead/tr/th")
If headers IsNot Nothing Then
For col As Integer = 0 To headers.Count - 1
workSheet.SetCellValue(0, col, headers(col).InnerText.Trim())
' Apply header formatting
Dim headerCell = workSheet.GetCellAt(0, col)
headerCell.Style.Font.Bold = True
headerCell.Style.BackgroundColor = "#4CAF50"
Next
End If
' Extract and write data rows
Dim rows As XmlNodeList = table.SelectNodes(".//tbody/tr")
If rows IsNot Nothing Then
For row As Integer = 0 To rows.Count - 1
Dim cells As XmlNodeList = rows(row).SelectNodes("td")
If cells IsNot Nothing Then
For col As Integer = 0 To cells.Count - 1
Dim cellValue As String = cells(col).InnerText.Trim()
workSheet.SetCellValue(row + 1, col, cellValue)
Next
End If
Next
End If
' Auto-fit columns for better readability
For col As Integer = 0 To If(headers?.Count, 0) - 1
workSheet.AutoSizeColumn(col)
Next
' Save the Excel file
workBook.SaveAs("ExportedTable.xlsx")
此程式碼展示了IronXL用於C# Excel操作的直觀API。 它建立了一個新的工作簿和工作表,然後遍歷解析出的HTML表格標題,將其放在第一行並應用粗體格式和綠色背景色。 來自HTML表格的資料行按行進行處理,每個單元格的文字內容被提取並放置在相應的Excel單元格中。 AutoSizeColumn函式確保所有內容均可見,並將工作簿保存為XLSX文件。

這裡可以看到原始HTML表格與上述程式碼輸出的比較:

您如何對導出資料應用單元格格式?
超越上面展示的基本粗體和背景色,IronXL為您提供對單元格樣式的精細控制。 您可以為任何單元格或範圍設定字體大小、字體系列、文字對齊、邊框和數值格式:
// Apply number formatting to a price column (column index 1)
var priceRange = workSheet[$"B2:B{rows.Count + 1}"];
priceRange.FormatString = "$#,##0.00";
// Set font size on all header cells
var headerRange = workSheet[$"A1:{(char)('A' + headers.Count - 1)}1"];
headerRange.Style.Font.Height = 13; // in half-points, so 13 = 6.5pt
// Apply number formatting to a price column (column index 1)
var priceRange = workSheet[$"B2:B{rows.Count + 1}"];
priceRange.FormatString = "$#,##0.00";
// Set font size on all header cells
var headerRange = workSheet[$"A1:{(char)('A' + headers.Count - 1)}1"];
headerRange.Style.Font.Height = 13; // in half-points, so 13 = 6.5pt
' Apply number formatting to a price column (column index 1)
Dim priceRange = workSheet($"B2:B{rows.Count + 1}")
priceRange.FormatString = "$#,##0.00"
' Set font size on all header cells
Dim headerRange = workSheet($"A1:{Chr(Asc("A"c) + headers.Count - 1)}1")
headerRange.Style.Font.Height = 13 ' in half-points, so 13 = 6.5pt
對於列寬,SetColumnWidth方法設置明確的寬度。 這些樣式控制是處理整個工作簿中的單元格字體樣式的相同IronXL API的一部分。
您如何處理多個表格和錯誤場景?
在單頁面上處理多個表格時,使用SelectNodes("//table")檢索所有表格並遍歷它們,為每個表格建立一個單獨的工作表:
var tables = doc.DocumentNode.SelectNodes("//table");
if (tables != null)
{
for (int t = 0; t < tables.Count; t++)
{
WorkSheet ws = workBook.CreateWorkSheet($"Table_{t + 1}");
var tblHeaders = tables[t].SelectNodes(".//thead/tr/th");
var tblRows = tables[t].SelectNodes(".//tbody/tr");
if (tblHeaders != null)
{
for (int col = 0; col < tblHeaders.Count; col++)
{
ws.SetCellValue(0, col, tblHeaders[col].InnerText.Trim());
ws.GetCellAt(0, col).Style.Font.Bold = true;
}
}
if (tblRows != null)
{
for (int row = 0; row < tblRows.Count; row++)
{
var cells = tblRows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
ws.SetCellValue(row + 1, col, cells[col].InnerText.Trim());
}
}
}
}
}
}
workBook.SaveAs("MultiTableExport.xlsx");
var tables = doc.DocumentNode.SelectNodes("//table");
if (tables != null)
{
for (int t = 0; t < tables.Count; t++)
{
WorkSheet ws = workBook.CreateWorkSheet($"Table_{t + 1}");
var tblHeaders = tables[t].SelectNodes(".//thead/tr/th");
var tblRows = tables[t].SelectNodes(".//tbody/tr");
if (tblHeaders != null)
{
for (int col = 0; col < tblHeaders.Count; col++)
{
ws.SetCellValue(0, col, tblHeaders[col].InnerText.Trim());
ws.GetCellAt(0, col).Style.Font.Bold = true;
}
}
if (tblRows != null)
{
for (int row = 0; row < tblRows.Count; row++)
{
var cells = tblRows[row].SelectNodes("td");
if (cells != null)
{
for (int col = 0; col < cells.Count; col++)
{
ws.SetCellValue(row + 1, col, cells[col].InnerText.Trim());
}
}
}
}
}
}
workBook.SaveAs("MultiTableExport.xlsx");
Imports System
Dim tables = doc.DocumentNode.SelectNodes("//table")
If tables IsNot Nothing Then
For t As Integer = 0 To tables.Count - 1
Dim ws As WorkSheet = workBook.CreateWorkSheet($"Table_{t + 1}")
Dim tblHeaders = tables(t).SelectNodes(".//thead/tr/th")
Dim tblRows = tables(t).SelectNodes(".//tbody/tr")
If tblHeaders IsNot Nothing Then
For col As Integer = 0 To tblHeaders.Count - 1
ws.SetCellValue(0, col, tblHeaders(col).InnerText.Trim())
ws.GetCellAt(0, col).Style.Font.Bold = True
Next
End If
If tblRows IsNot Nothing Then
For row As Integer = 0 To tblRows.Count - 1
Dim cells = tblRows(row).SelectNodes("td")
If cells IsNot Nothing Then
For col As Integer = 0 To cells.Count - 1
ws.SetCellValue(row + 1, col, cells(col).InnerText.Trim())
Next
End If
Next
End If
Next
End If
workBook.SaveAs("MultiTableExport.xlsx")
當HTML格式不正確時您應該怎麼做?
實際HTML並不總是有效的。 從外部來源抓取的頁面可能缺少閉合標籤,不一致的td元素。 HTML Agility Pack的設計是寬容的,可以解析大多數格式不正確的HTML而不拋出例外,但您的XPath選擇器可能不會匹配您期望的。
一個安全的模式是將解析邏輯包裝在tr元素:
try
{
var headerNodes = table.SelectNodes(".//thead/tr/th")
?? table.SelectNodes(".//tr[1]/th")
?? table.SelectNodes(".//tr[1]/td");
var dataRows = table.SelectNodes(".//tbody/tr")
?? table.SelectNodes(".//tr[position()>1]");
// ... process as normal
}
catch (Exception ex)
{
Console.WriteLine($"Table parsing failed: {ex.Message}");
}
try
{
var headerNodes = table.SelectNodes(".//thead/tr/th")
?? table.SelectNodes(".//tr[1]/th")
?? table.SelectNodes(".//tr[1]/td");
var dataRows = table.SelectNodes(".//tbody/tr")
?? table.SelectNodes(".//tr[position()>1]");
// ... process as normal
}
catch (Exception ex)
{
Console.WriteLine($"Table parsing failed: {ex.Message}");
}
Imports System
Try
Dim headerNodes = table.SelectNodes(".//thead/tr/th") _
OrElse table.SelectNodes(".//tr[1]/th") _
OrElse table.SelectNodes(".//tr[1]/td")
Dim dataRows = table.SelectNodes(".//tbody/tr") _
OrElse table.SelectNodes(".//tr[position()>1]")
' ... process as normal
Catch ex As Exception
Console.WriteLine($"Table parsing failed: {ex.Message}")
End Try
IronXL自動處理資料型別檢測,在適當時將數字字串轉換為數字。 對於涉及JavaScript渲染內容的更複雜場景,您可以將此方法與Selenium WebDriver或Playwright等工具結合使用,首先渲染頁面,然後將生成的HTML傳遞給HTML Agility Pack進行解析。
您如何保存和導出Excel文件?
IronXL支持超越XLSX的多種輸出格式。 您可以根據後續需求保存為XLS、CSV、TSV或JSON。 您還可以在ASP.NET Core中直接將輸出流至HTTP響應,這樣避免將文件寫到磁碟:
// Save to disk as XLSX
workBook.SaveAs("ExportedTable.xlsx");
// Save as CSV
workBook.SaveAsCsv("ExportedTable.csv");
// Stream to HTTP response (ASP.NET Core)
// Response.Headers["Content-Disposition"] = "attachment; filename=ExportedTable.xlsx";
// workBook.SaveAs(Response.BodyWriter.AsStream());
// Save to disk as XLSX
workBook.SaveAs("ExportedTable.xlsx");
// Save as CSV
workBook.SaveAsCsv("ExportedTable.csv");
// Stream to HTTP response (ASP.NET Core)
// Response.Headers["Content-Disposition"] = "attachment; filename=ExportedTable.xlsx";
// workBook.SaveAs(Response.BodyWriter.AsStream());
' Save to disk as XLSX
workBook.SaveAs("ExportedTable.xlsx")
' Save as CSV
workBook.SaveAsCsv("ExportedTable.csv")
' Stream to HTTP response (ASP.NET Core)
' Response.Headers("Content-Disposition") = "attachment; filename=ExportedTable.xlsx"
' workBook.SaveAs(Response.BodyWriter.AsStream())
流式傳輸到HTTP響應時,確保attachment以便瀏覽器將響應視為文件下載。 此模式在MVC控制器和Razor Pages中效果很好。
在需要導出資料到現有Excel模板的情況下,IronXL可以載入現有的工作簿並用解析的HTML資料填充命名範圍或特定單元格地址,同時保留模板中的所有格式。
使用中的最佳實踐是什麼?
| 問題 | 建議 | 備註 |
|---|---|---|
| 大型資料集 | 分批處理行 | IronXL可處理數千行,但流式輸出避免了記憶體壓力 |
| 格式不正確的HTML | 使用回退XPath選擇器 | HTML Agility Pack是寬容的;在所有SelectNodes調用上新增明確的空檢查 |
| 動態內容 | 使用Selenium或Playwright預渲染 | 需要在HTML解析之前使用無頭瀏覽器處理JavaScript繁重的頁面 |
| 文件格式 | 更喜歡XLSX而不是XLS | XLSX支持更多行、更大的單元格值和現代樣式功能 |
| 列寬 | 寫入所有資料後調用AutoSizeColumn | 在寫入資料之前調用會使列過窄 |
| 授權 | 在啟動時設置授權鍵 | 在任何IronXL調用之前,調用IronXL.License.LicenseKey = "..."; |
當處理來自URL或資料庫查詢的內容以進行進一步分析時,請處理隱藏字段值或特殊格式要求等其他細節。 預設行為適用於標準表格,但您可以自定義每列或任何特定表行的字體大小、字體系列和其他樣式屬性。
在匯出後,從Excel文件回讀資料時,IronXL使用相同的WorkBook.Load API,讓整個往返工作流程簡單明瞭。 您還可以將生成的Excel文件轉換為其他格式,如JSON或XML以便進一步處理。
您如何管理授權和部署?
IronXL需要在生產中使用授權鍵。 免費試用包含所有功能,非常適合在購買之前評估程式庫。 探索定價和授權選項,找到適合您的團隊的正確層級。
在Docker、Azure Functions或Linux環境中部署時,IronXL不依賴Microsoft Office或COM Interop,使其成為一個易於管理的依賴項。 它支持.NET 10、.NET 9、.NET 8、.NET Framework 4.6.2+,並完全相容當前的ASP.NET Core匯出模式。
IronXL和HTML Agility Pack的結合為在C#中將HTML表格導出為Excel提供了一個靈活的解決方案。 此處演示的方法比剛性的內建方法提供更多的控制,讓您在處理複雜的HTML結構時充分利用IronXL的完整Excel功能集。
無論您是在構建網路爬蟲、從資料庫遷移遺留資料、自動生成報表,還是在大型資料集上進行資料分析,該解決方案都能擴展以滿足企業需求。 程式碼範例展示了如何處理各種輸入來源,從靜態HTML字串到通過URL檢索的動態內容。 結果可以匯出以供下載或在您的.NET應用程式中進一步處理。
準備好將您的HTML資料轉換為專業的Excel文件了嗎? 立即開始免費試用IronXL,體驗無需Office依賴的程式化Excel操作的靈活性。
常見問題
在商業應用程式中將HTML表格轉換為Excel的主要目的為何?
主要目的是通過將HTML表格資料轉換為一種在Excel中易於管理和分析的格式,以促進資料遷移、報告生成或進一步分析網頁資料。
該指南建議使用哪個程式庫在C#中將HTML表格轉換為Excel?
該指南建議使用IronXL來將HTML表格轉換為Excel,因為它提供了一種不需要Microsoft Office的靈活方法。
為何某些程式庫可能不適用於將HTML表格轉換為Excel?
某些程式庫可能不適用,因為它們在文件格式上有限制或缺乏支持的功能,這會限制它們在處理多樣化資料轉換需求時的效能。
使用IronXL將HTML表格導出到Excel是否需要Microsoft Office?
不,使用IronXL導出HTML表格到Excel不需要Microsoft Office。它支持跨平台運作,為導出HTML表格到Excel提供了靈活的解決方案。
IronXL能否處理HTML表格到Excel的跨平台轉換?
是的,IronXL可以處理HTML表格到Excel的跨平台轉換,這使它成為一個適合於在不同環境中工作的開發者的多用途工具。
有哪些常見的情境使用將HTML表格轉換為Excel?
常見的使用情境包括資料遷移、報告生成,以及以更結構化和易於存取的格式分析網頁資料。




