跳過到頁腳內容
使用 IRONXL

如何使用 IronXL 在 C# 中將 HTML 表格匯出至 Excel

提取 HTML 表格資料並將其轉換為 Excel 表格是商業應用中的常見需求——無論是資料遷移、報表生成,還是需要進一步分析的網頁。 本指南提供了使用IronXLHTML 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 檔案和內容解析器HTML Agility Pack搭配使用時, IronXL就成為將任何 HTML 表格結構轉換為 Excel 表格資料的多功能解決方案。 這種方法與.NET 10 應用程式配合良好,可以有效率地處理大型資料集。

與 Syncfusion Excel 函式庫的 XlsIO 等函式庫不同,後者提供的 ImportHtmlTable 函數僅限於特定的 HTML 格式和表格結構, IronXL方法使開發人員能夠完全控制解析和轉換過程。 這種靈活性意味著開發人員可以處理複雜的場景,例如巢狀表、自訂資料格式和選擇性列提取,而這些是僵化的內建方法無法實現的。

IronXL還提供全套 Excel 功能,包括公式支援儲存格樣式多工作表管理以及各種匯出格式(XLSX、XLS、JSON 和 CSV)。 您可以建立圖表、匯出為 PDF 以及管理隱藏欄位數據,使其成為超越簡單 HTML 表格轉換的完整 Excel 自動化解決方案。

如何安裝所需的程式庫?

透過NuGet套件管理器安裝IronXL和 HTML Agility Pack。 IronXL提供免費試用,讓用戶在購買許可證之前測試所有功能。

軟體包管理器控制台

Install-Package IronXl.Excel
Install-Package HtmlAgilityPack
Install-Package IronXl.Excel
Install-Package HtmlAgilityPack
SHELL

.NET CLI

dotnet add package IronXl.Excel
dotnet add package HtmlAgilityPack
dotnet add package IronXl.Excel
dotnet add package HtmlAgilityPack
SHELL

這些NuGet套件可讓您以程式設計方式建立、載入和儲存 Excel 文件。 安裝完這兩個軟體包後,請在 C# 檔案頂部新增必要的 using 語句:

using IronXL;
using HtmlAgilityPack;
using System;
using System.Linq;
using IronXL;
using HtmlAgilityPack;
using System;
using System.Linq;
$vbLabelText   $csharpLabel

這些函式庫可以很好地協同工作,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");
$vbLabelText   $csharpLabel

這段程式碼將 HTML 內容載入到 HtmlDocument 物件中,並使用 XPath 查詢並選取表格元素。 SelectSingleNode 方法傳回 HTML 中找到的第一個表格,方便在存在多個表格時定位特定表格。然後處理表格的每一行,提取儲存格值進行轉換。

哪些 XPath 表達式最適合表格解析?

對於標準 HTML 表格,XPath 表達式 //table 選擇文件中的第一個表格。 當處理包含多個表格的更複雜的頁面時,可以使用位置選擇器(例如 (//table)[2])透過索引來定位特定表格。 當表格包含有意義的識別符時,像 //table[@id='data-table']//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']");
$vbLabelText   $csharpLabel

這樣就可以直接從公開網頁中擷取表格,而無需先手動儲存 HTML。

如何使用IronXL將解析後的資料匯出到 Excel?

使用IronXL,您可以將解析後的 H​​TML 表格資料轉換為格式正確的專業 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");
$vbLabelText   $csharpLabel

此程式碼示範了 IronXL 的直覺的 C# Excel 操作 API。 它會建立一個新的工作簿和工作表,然後遍歷已解析的 HTML 表格標題,將它們放置在第一行,同時套用粗體格式和綠色背景色。 HTML 表格中的資料行逐行處理,每個儲存格的文字內容會被擷取出來並放入對應的 Excel 儲存格中。 AutoSizeColumn 函數確保所有內容可見,並將工作簿儲存為 XLSX 檔案。

C# 使用IronXL將 HTML 表格匯出到 Excel 檔案:圖 1 - IronXL解析後的表格資料輸出

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

C# 使用IronXL將 HTML 表格匯出到 Excel 檔:圖 2 - 解析後的 Excel 資料與原始 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
$vbLabelText   $csharpLabel

對於列寬,AutoSizeColumn 可以處理大多數情況,但當需要精確佈局時,也可以使用 SetColumnWidth 方法設定明確寬度。 這些樣式控制項是IronXL API 的一部分,該 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");
$vbLabelText   $csharpLabel

當HTML格式錯誤時該怎麼辦?

實際應用中的HTML程式碼並非總是有效的。 從外部來源抓取的頁面可能缺少結束標籤、不一致的 tbody 結構,或標題行中混合了 thtd 元素。 HTML Agility Pack 的設計比較寬容,能夠解析大多數格式錯誤的 HTML 而不會拋出異常,但您的 XPath 選擇器可能與您預期的不符。

一個安全的模式是將解析邏輯包裝在 try-catch 區塊中,並新增一個回退機制,當找不到 thead 元素時,直接在表格下方尋找 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}");
}
$vbLabelText   $csharpLabel

IronXL會自動處理資料類型偵測,並在適當的時候將數字字串轉換為數字。 對於涉及 JavaScript 渲染內容的更複雜場景,您可以將此方法與Selenium WebDriverPlaywright等工具結合使用,首先渲染頁面,然後將產生的 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());
$vbLabelText   $csharpLabel

當向 HTTP 回應傳送流時,請確保將 Content-Disposition 標頭設定為 attachment,以便瀏覽器將回應視為檔案下載。 這種模式在 MVC 控制器和Razor頁面中都能很好地發揮作用。

對於需要將資料匯出到現有 Excel 範本的情況, IronXL可以載入現有工作簿,並將解析後的 HML 資料填入命名區域或特定儲存格位址中,同時保留範本中的所有格式。

生產應用中的最佳實踐是什麼?

生產環境中將 HTML 表格匯出到 Excel 的建議做法
憂慮 推薦 筆記
大型資料集 分批次行 IronXL可以處理數千行數據,但串流輸出避免了記憶體壓力。
格式錯誤的 HTML 使用備用 XPath 選擇器 HTML Agility Pack 比較寬鬆;請在所有 SelectNodes 呼叫中加入明確空值檢查
動態內容 使用 Selenium 或 Playwright 進行預渲染 包含大量 JavaScript 程式碼的頁面需要使用無頭瀏覽器才能解析 HTML。
文件格式 優先選擇 XLSX 格式而非 XLS 格式 XLSX 支援更多行、更大的儲存格值和現代樣式功能
列寬 寫入所有資料後呼叫 AutoSizeColumn 函數 在資料寫入之前呼叫函數會導致列寬不足。
授權 啟動時設定許可證密鑰 在任何IronXL呼叫之前,請先呼叫`IronXl.License.LicenseKey = "...";`

在處理來自 URL 或資料庫查詢的內容以進行進一步分析時,處理隱藏欄位值或特殊格式要求等附加細節。 預設行為適用於標準表格,但您可以為每一列或任何特定的表格行自訂字體大小、字體系列和其他樣式屬性。

IronXL在匯出Excel 檔案後讀取資料時,使用相同的 WorkBook.Load API,從而簡化了往返工作流程。 您也可以將產生的 Excel 檔案轉換為其他格式,例如 JSON 或 XML,以便進行進一步處理。

您如何管理授權和部署?

IronXL需要許可證密鑰才能用於生產環境。 免費試用版包含所有功能,是購買前評估資料庫的理想選擇。 了解定價和授權選項,找到適合您團隊的等級。

IronXL在 Docker、Azure Functions 或 Linux 環境中部署時,不依賴 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 在 C# 中將 HTML 表格轉換為 Excel,因為它提供了一種靈活的方法,無需 Microsoft Office。

為什麼有些函式庫可能不適合將 HTML 表格轉換為 Excel 表格?

有些函式庫可能不適用,因為它們在檔案格式方面有限製或缺乏支援功能,這會限制它們在處理各種資料轉換需求方面的有效性。

使用 IronXL 將 HTML 表格匯出到 Excel 是否必須安裝 Microsoft Office?

不,使用 IronXL 不需要 Microsoft Office。它支援跨平台,並提供靈活的解決方案,可將 HTML 表格匯出到 Excel。

IronXL 能否處理 HTML 表格到 Excel 的跨平台轉換?

是的,IronXL 可以處理 HTML 表格到 Excel 的跨平台轉換,使其成為在不同環境下工作的開發人員的多功能工具。

將 HTML 表格轉換為 Excel 表格有哪些常見用例?

常見用例包括資料遷移、產生報告以及以更結構化和易於存取的格式分析網頁資料。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me