跳過到頁腳內容
使用 IRONXL

如何在 ASP.NET C# 中將 Excel 匯入 GridView

使用IronXL將 Excel 資料匯入 ASP.NET C# 中的 GridView 非常簡單。 您載入一個工作簿,將工作表轉換為 DataTable,並將其綁定到您的 GridView 控制項—所有這些都無需 OLEDB 驅動程式或複雜的連接字串。

>親自體驗一下:取得IronXL 的免費試用版,並跟著下面的程式碼範例進行操作。

如何安裝 IronXL 以實現 Excel GridView 整合?

在編寫任何程式碼之前,您需要將 IronXL 加入您的 ASP.NET 專案中。 最快捷的方法是使用 NuGet,可以透過 Visual Studio 套件管理器控制台或 .NET CLI 進行安裝。

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

安裝完成後,NuGet 會將所有必要的參考新增到您的專案中。 無需安裝外部驅動程序,無需註冊 OLEDB 提供程序,伺服器也不依賴 Microsoft Office。 該程式庫以單一託管組件的形式發布,可在 Windows、Linux、macOS 和雲端託管環境(包括 Azure 應用程式服務)上執行。

安裝完成後,請將以下命名空間新增至任何已讀取或寫入 Excel 資料的程式碼隱藏檔案:

using IronXL;
using System.Data;
using System.IO;
using IronXL;
using System.Data;
using System.IO;
Imports IronXL
Imports System.Data
Imports System.IO
$vbLabelText   $csharpLabel

IronXL 同時支援 .xls (Excel 97-2003) 和 .xlsx (Excel 2007+) 格式,因此您無需對每種檔案類型進行單獨處理。 同一個 WorkBook.Load 呼叫透過自動檢查檔案簽章來處理兩種格式。

為什麼 GridView 資料綁定要跳過 OLEDB?

傳統的基於 OLEDB 的 Excel 導入需要Microsoft Access 資料庫引擎(ACE 或 JET) ,該引擎必須以正確的位數(32 位元或 64 位元)安裝在伺服器上。 由於缺少驅動程式或驅動程式不匹配,跨不同伺服器環境的部署經常失敗,而且微軟不再預設在 Windows 中提供 64 位元 ACE 驅動程式。

IronXL 完全消除了這種依賴性。 它直接在託管程式碼中讀取原始的 Open XML 或 BIFF 格式。 在開發、測試和生產環境中,您可以獲得可預測的行為,而無需擔心驅動程式版本問題。

IronXL 支援哪些 .NET 平台?

IronXL 的目標架構為 .NET 10、.NET 8、.NET Standard 2.0 和 .NET Framework 4.6.2+。 這意味著無論您的 ASP.NET 應用程式運行在經典的 Web Forms、ASP.NET MVC 還是現代的ASP.NET Core Razor Pages上,您都可以使用同一個函式庫,而無需對 Excel 處理層進行任何程式碼變更。 您可以在NuGet.org上找到 IronXL 軟體包,以便在安裝前查看版本歷史記錄和發行說明。

將 Excel 資料載入到 GridView 中的最快方法是什麼?

最快的方法將 WorkBook.Loadsheet.ToDataTableGridView.DataBind 合併成大約四行有效的程式碼。 基本場景下無需手動建立列,也無需遍歷行。

using IronXL;
using System.Data;

WorkBook workBook = WorkBook.Load("data.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

// true = treat first row as column headers
DataTable dataTable = sheet.ToDataTable(true);

GridView1.DataSource = dataTable;
GridView1.DataBind();
using IronXL;
using System.Data;

WorkBook workBook = WorkBook.Load("data.xlsx");
WorkSheet sheet = workBook.DefaultWorkSheet;

// true = treat first row as column headers
DataTable dataTable = sheet.ToDataTable(true);

GridView1.DataSource = dataTable;
GridView1.DataBind();
Imports IronXL
Imports System.Data

Dim workBook As WorkBook = WorkBook.Load("data.xlsx")
Dim sheet As WorkSheet = workBook.DefaultWorkSheet

' True = treat first row as column headers
Dim dataTable As DataTable = sheet.ToDataTable(True)

GridView1.DataSource = dataTable
GridView1.DataBind()
$vbLabelText   $csharpLabel

ToDataTable(true) 呼叫告訴 IronXL 將工作表的第一行提升為結果 DataTable 中的列名。 當您將該表綁定到 GridViewAutoGenerateColumns="true" 時,ASP.NET 會自動為每個 Excel 標題建立一個欄位。

ToDataTable 如何處理混合資料類型?

預設情況下,當呼叫 ToDataTable 時,DataTable 中的每個儲存格值都儲存為 string。 如果您的應用程式需要類型化的列——例如,decimal 用於價格數據,或 DateTime 用於日期——您可以透過 WorkSheet 索引器單獨讀取單元格值,並在 10100 2//NET @1.NET @1.NET @1.NET @1.

對於簡單的顯示,在 GridView 中,字串列就足夠了,因為網格無論如何都會將所有值渲染為文字。

如何建立用於匯入 Excel 的 ASP.NET Web Forms 頁面?

一個最小的導入頁面需要三個控制項:檔案上傳輸入框、提交按鈕和 GridView。 在您的 <form runat="server"> 元素內加入以下 ASPX 標記:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload Excel File"
    OnClick="btnUpload_Click" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"
    CssClass="table table-bordered" />
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload Excel File"
    OnClick="btnUpload_Click" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"
    CssClass="table table-bordered" />
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload Excel File" OnClick="btnUpload_Click" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" CssClass="table table-bordered" />
$vbLabelText   $csharpLabel

CssClass 屬性可以將網格連接到您的 Bootstrap 樣式表中(如果您正在使用),從而為您提供樣式化的行和邊框,而無需額外的配置。

在後台程式碼中,處理按鈕點擊事件。 以下模式將上傳的文件儲存到臨時伺服器路徑,使用 IronXL 載入該文件,並將產生的 DataTable 綁定至網格:

using IronXL;
using System.Data;
using System.IO;

void btnUpload_Click(object sender, EventArgs e)
{
    if (!FileUpload1.HasFile) return;

    string uploadDir = Server.MapPath("~/Uploads/");
    Directory.CreateDirectory(uploadDir); // ensure directory exists

    string filePath = Path.Combine(uploadDir, Path.GetFileName(FileUpload1.FileName));
    FileUpload1.SaveAs(filePath);

    WorkBook workBook = WorkBook.Load(filePath);
    WorkSheet sheet = workBook.DefaultWorkSheet;
    DataTable dt = sheet.ToDataTable(true);

    GridView1.DataSource = dt;
    GridView1.DataBind();

    // Store for later export operations
    Session["CurrentData"] = dt;
}
using IronXL;
using System.Data;
using System.IO;

void btnUpload_Click(object sender, EventArgs e)
{
    if (!FileUpload1.HasFile) return;

    string uploadDir = Server.MapPath("~/Uploads/");
    Directory.CreateDirectory(uploadDir); // ensure directory exists

    string filePath = Path.Combine(uploadDir, Path.GetFileName(FileUpload1.FileName));
    FileUpload1.SaveAs(filePath);

    WorkBook workBook = WorkBook.Load(filePath);
    WorkSheet sheet = workBook.DefaultWorkSheet;
    DataTable dt = sheet.ToDataTable(true);

    GridView1.DataSource = dt;
    GridView1.DataBind();

    // Store for later export operations
    Session["CurrentData"] = dt;
}
Imports IronXL
Imports System.Data
Imports System.IO

Sub btnUpload_Click(sender As Object, e As EventArgs)
    If Not FileUpload1.HasFile Then Return

    Dim uploadDir As String = Server.MapPath("~/Uploads/")
    Directory.CreateDirectory(uploadDir) ' ensure directory exists

    Dim filePath As String = Path.Combine(uploadDir, Path.GetFileName(FileUpload1.FileName))
    FileUpload1.SaveAs(filePath)

    Dim workBook As WorkBook = WorkBook.Load(filePath)
    Dim sheet As WorkSheet = workBook.DefaultWorkSheet
    Dim dt As DataTable = sheet.ToDataTable(True)

    GridView1.DataSource = dt
    GridView1.DataBind()

    ' Store for later export operations
    Session("CurrentData") = dt
End Sub
$vbLabelText   $csharpLabel

此實作遵循事件處理程序內部邏輯的頂級語句風格,同時保留所需的 Web Forms 事件簽章。 請注意,Directory.CreateDirectory 是防禦性調用的-如果 Uploads 資料夾已經存在,則呼叫不會執行任何操作。

使用 IronXL 在 ASP.NET C# 中將 Excel 匯入 GridView:上傳的電子表格資料將在 GridView 控制項中呈現

使用者選擇 .xlsx 檔案並點擊上傳按鈕後,網格會填入電子表格內容。 列名取自 Excel 檔案的第一行,所有後續行都成為網格中的資料行。

如何驗證上傳的文件?

在生產環境中使用時,處理前應檢查檔案副檔名和 MIME 類型。 IronXL 會對不支援的檔案格式拋出異常,但最好在操作檔案系統之前,就在控制器層級拒絕錯誤的上傳:

string ext = Path.GetExtension(FileUpload1.FileName).To低的erInvariant();
string[] allowed = { ".xls", ".xlsx" };

if (!allowed.Contains(ext))
{
    lblError.Text = "Only .xls and .xlsx files are accepted.";
    return;
}
string ext = Path.GetExtension(FileUpload1.FileName).To低的erInvariant();
string[] allowed = { ".xls", ".xlsx" };

if (!allowed.Contains(ext))
{
    lblError.Text = "Only .xls and .xlsx files are accepted.";
    return;
}
Imports System.IO

Dim ext As String = Path.GetExtension(FileUpload1.FileName).ToLowerInvariant()
Dim allowed As String() = {".xls", ".xlsx"}

If Not allowed.Contains(ext) Then
    lblError.Text = "Only .xls and .xlsx files are accepted."
    Return
End If
$vbLabelText   $csharpLabel

您還應該透過 IIS 請求限製或在呼叫 SaveAs 之前檢查 FileUpload1.FileBytes.Length 是否達到閾值來強制執行最大檔案大小。

如何存取特定的工作表和儲存格區域?

當 Excel 工作簿包含多個工作表時,您需要按名稱定位特定工作表,而不是依賴 DefaultWorkSheet。 IronXL 提供了一個 GetWorkSheet 方法,該方法接受工作表標籤名稱作為字串。

using IronXL;
using System.Data;

WorkBook workBook = WorkBook.Load("sales-report.xlsx");

// Access a named sheet
WorkSheet salesSheet = workBook.GetWorkSheet("Q4 Sales");

// Read a specific cell range
var topTen = salesSheet["A1:E11"];

// Convert the entire workbook to a DataSet (one DataTable per sheet)
DataSet allSheets = workBook.ToDataSet();

// Bind the first sheet's DataTable to the grid
GridView1.DataSource = allSheets.Tables[0];
GridView1.DataBind();
using IronXL;
using System.Data;

WorkBook workBook = WorkBook.Load("sales-report.xlsx");

// Access a named sheet
WorkSheet salesSheet = workBook.GetWorkSheet("Q4 Sales");

// Read a specific cell range
var topTen = salesSheet["A1:E11"];

// Convert the entire workbook to a DataSet (one DataTable per sheet)
DataSet allSheets = workBook.ToDataSet();

// Bind the first sheet's DataTable to the grid
GridView1.DataSource = allSheets.Tables[0];
GridView1.DataBind();
Imports IronXL
Imports System.Data

Dim workBook As WorkBook = WorkBook.Load("sales-report.xlsx")

' Access a named sheet
Dim salesSheet As WorkSheet = workBook.GetWorkSheet("Q4 Sales")

' Read a specific cell range
Dim topTen = salesSheet("A1:E11")

' Convert the entire workbook to a DataSet (one DataTable per sheet)
Dim allSheets As DataSet = workBook.ToDataSet()

' Bind the first sheet's DataTable to the grid
GridView1.DataSource = allSheets.Tables(0)
GridView1.DataBind()
$vbLabelText   $csharpLabel

當您的應用程式需要顯示來自多個工作表的資料或允許使用者選擇要查看的工作表時,ToDataSet 方法非常有用。 傳回的 DataSet 中的每個 DataTable 都對應一個 Excel 工作表,並且表名與工作表標籤名相符。

使用 IronXL 在 ASP.NET C# 中將 Excel 匯入 GridView:將命名工作表資料綁定到 GridView

如何在綁定到 GridView 之前篩選行?

如果您只想取得 Excel 中的一部分行(例如,"狀態"欄位等於"活動"的行),請讀取由 ToDataTable 產生的 DataTable,套用 DataView 篩選器,並將篩選篩選後的視圖:

DataTable dt = sheet.ToDataTable(true);
DataView dv = new DataView(dt)
{
    RowFilter = "Status = 'Active'"
};

GridView1.DataSource = dv;
GridView1.DataBind();
DataTable dt = sheet.ToDataTable(true);
DataView dv = new DataView(dt)
{
    RowFilter = "Status = 'Active'"
};

GridView1.DataSource = dv;
GridView1.DataBind();
Dim dt As DataTable = sheet.ToDataTable(True)
Dim dv As New DataView(dt) With {
    .RowFilter = "Status = 'Active'"
}

GridView1.DataSource = dv
GridView1.DataBind()
$vbLabelText   $csharpLabel

DataView.RowFilter 接受標準的 SQL WHERE 子句語法——與 Microsoft Learn 上 DataColumn.Expression 屬性中記錄的表達式語言相同——無需載入資料庫即可進行排序和篩選。

如何比較 Excel GridView 綁定的導入方法?

Excel 到 GridView 綁定的不同方法各有優缺點。 下表總結了最常用的方法,您可以根據自己的情況選擇合適的方法。

ASP.NET GridView綁定Excel導入方法的比較
方法 需要司機 XLS 支援 XLSX 支援 伺服器依賴性 程式碼複雜度
IronXL(ToDataTable) 低的
OLEDB / JET ACE/JET發動機 部分 32/64 位元驅動程式 高的
Open XML SDK 高的
EPPlus 無(生產需要商業許可) 中等的

IronXL 同時支援傳統 XLS 和現代 XLSX 格式,無需伺服器端驅動程式安裝,且在所列選項中程式碼複雜度最低。 對於已經使用IronPDFIronOCR等其他 Iron Software 產品的團隊來說,一個 Iron Software 授權即可涵蓋整個套件。

如何將 GridView 資料匯出回 Excel?

使用 IronXL 完成從 Excel 到網格再到 Excel 的往返過程同樣簡潔。 這種模式適用於"下載為 Excel"按鈕,使用戶能夠匯出目前在網格中顯示的任何內容。

void btnExport_Click(object sender, EventArgs e)
{
    DataTable dt = Session["CurrentData"] as DataTable;
    if (dt == null) return;

    WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet ws = workBook.CreateWorkSheet("Export");

    // Write header row
    for (int col = 0; col < dt.Columns.Count; col++)
        ws.SetCellValue(0, col, dt.Columns[col].ColumnName);

    // Write data rows
    for (int row = 0; row < dt.Rows.Count; row++)
        for (int col = 0; col < dt.Columns.Count; col++)
            ws.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);

    string exportDir = Server.MapPath("~/Exports/");
    Directory.CreateDirectory(exportDir);
    string exportPath = Path.Combine(exportDir, "export.xlsx");
    workBook.SaveAs(exportPath);

    Response.Clear();
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("Content-Disposition", "attachment; filename=export.xlsx");
    Response.TransmitFile(exportPath);
    Response.End();
}
void btnExport_Click(object sender, EventArgs e)
{
    DataTable dt = Session["CurrentData"] as DataTable;
    if (dt == null) return;

    WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet ws = workBook.CreateWorkSheet("Export");

    // Write header row
    for (int col = 0; col < dt.Columns.Count; col++)
        ws.SetCellValue(0, col, dt.Columns[col].ColumnName);

    // Write data rows
    for (int row = 0; row < dt.Rows.Count; row++)
        for (int col = 0; col < dt.Columns.Count; col++)
            ws.SetCellValue(row + 1, col, dt.Rows[row][col]?.ToString() ?? string.Empty);

    string exportDir = Server.MapPath("~/Exports/");
    Directory.CreateDirectory(exportDir);
    string exportPath = Path.Combine(exportDir, "export.xlsx");
    workBook.SaveAs(exportPath);

    Response.Clear();
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("Content-Disposition", "attachment; filename=export.xlsx");
    Response.TransmitFile(exportPath);
    Response.End();
}
Imports System
Imports System.Data
Imports System.IO

Sub btnExport_Click(sender As Object, e As EventArgs)
    Dim dt As DataTable = TryCast(Session("CurrentData"), DataTable)
    If dt Is Nothing Then Return

    Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim ws As WorkSheet = workBook.CreateWorkSheet("Export")

    ' Write header row
    For col As Integer = 0 To dt.Columns.Count - 1
        ws.SetCellValue(0, col, dt.Columns(col).ColumnName)
    Next

    ' Write data rows
    For row As Integer = 0 To dt.Rows.Count - 1
        For col As Integer = 0 To dt.Columns.Count - 1
            ws.SetCellValue(row + 1, col, If(dt.Rows(row)(col)?.ToString(), String.Empty))
        Next
    Next

    Dim exportDir As String = Server.MapPath("~/Exports/")
    Directory.CreateDirectory(exportDir)
    Dim exportPath As String = Path.Combine(exportDir, "export.xlsx")
    workBook.SaveAs(exportPath)

    Response.Clear()
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    Response.AddHeader("Content-Disposition", "attachment; filename=export.xlsx")
    Response.TransmitFile(exportPath)
    Response.End()
End Sub
$vbLabelText   $csharpLabel

Response.TransmitFile 呼叫將已儲存的檔案串流傳輸到瀏覽器,從而觸發下載對話方塊。 Content-Disposition: attachment 標頭確保瀏覽器下載檔案而不是嘗試內聯顯示檔。

使用 IronXL 在 ASP.NET C# 中將 Excel 匯入 GridView:將資料表匯出回 Excel 文件

IronXL匯出時常用的格式選項有哪些?

除了原始資料之外,IronXL 還允許您在儲存之前套用儲存格格式。 您可以設定粗體標題、列寬、數字格式和背景顏色:

// Bold the header row
ws["A1:Z1"].Style.Font.Bold = true;

// Apply a currency format to column C (index 2), rows 2 onward
ws[$"C2:C{dt.Rows.Count + 1}"].FormatString = IronXL.Styles.BuiltinFormats.Accounting2;

// Auto-fit column widths (IronXL approximates based on content length)
ws.AutoSizeColumn(0);
ws.AutoSizeColumn(1);
// Bold the header row
ws["A1:Z1"].Style.Font.Bold = true;

// Apply a currency format to column C (index 2), rows 2 onward
ws[$"C2:C{dt.Rows.Count + 1}"].FormatString = IronXL.Styles.BuiltinFormats.Accounting2;

// Auto-fit column widths (IronXL approximates based on content length)
ws.AutoSizeColumn(0);
ws.AutoSizeColumn(1);
' Bold the header row
ws("A1:Z1").Style.Font.Bold = True

' Apply a currency format to column C (index 2), rows 2 onward
ws($"C2:C{dt.Rows.Count + 1}").FormatString = IronXL.Styles.BuiltinFormats.Accounting2

' Auto-fit column widths (IronXL approximates based on content length)
ws.AutoSizeColumn(0)
ws.AutoSizeColumn(1)
$vbLabelText   $csharpLabel

這些格式化呼叫使用IronXL 單元格樣式 API ,它反映了 Excel 檔案格式的物件模型,而無需互通。

下一步計劃是什麼?

現在,您可以使用 IronXL 建立一個完整的、無需驅動程式的管道,將 Excel 檔案匯入 ASP.NET GridView,並將 GridView 資料匯出回 Excel。 接下來,我們可以在此基礎上探索以下幾個面向:

-閱讀IronXL 文件以取得完整的 API 參考,包括公式計算、儲存格區域操作和圖表建立。 -瀏覽IronXL 程式碼範例庫,以取得涵蓋 CSV 匯入、密碼保護工作簿、條件格式等的即用型程式碼片段。

對於 .NET Core 和 ASP.NET Core 應用程序,相同的 IronXL API 可在 Razor Pages 和 MVC 控制器中使用。 IronXL ASP.NET Core 指南詳細介紹了檔案上傳處理和依賴注入模式之間的差異。

在購買之前,先使用IronXL 免費試用版測試項目中的所有功能。 試用許可證無需信用卡。

常見問題解答

在 ASP.NET C# 中使用 IronXL.Excel 將 Excel 匯入 GridView 有何優勢?

使用 IronXL 可簡化在 ASP.NET C# 中將 Excel 資料匯入 GridView 的流程,無需複雜的 OLEDB 連線字串及驅動程式安裝。開發人員只需透過簡單的程式碼,即可載入 XLS 和 XLSX 檔案,將其轉換為 DataTables,並在 GridView 控制項中顯示。

IronXL 如何處理不同的 Excel 文件格式?

IronXL 支援多種 Excel 檔案格式,包括 XLS 和 XLSX,使其成為將資料匯入 GridView 的多功能工具。它確保在不同 Excel 版本間的相容性與易用性。

IronXL 能否將 Excel 檔案轉換為 DataTables?

是的,IronXL 能夠將 Excel 檔案轉換為 DataTables,隨後可輕鬆地在 ASP.NET C# 的 GridView 控制項中顯示。此功能能簡化資料處理與視覺化的流程。

IronXL 適合用於大型 Excel 文件嗎?

IronXL 專為高效處理大型 Excel 檔案而設計,使其成為需要將大量資料匯入 ASP.NET C# 中 GridView 的專案中,一個值得信賴的選擇。

使用 IronXL 可避免哪些常見問題?

透過使用 IronXL,開發人員可避免處理 OLEDB 連線字串、伺服器驅動程式相容性及複雜資料匯入流程等常見問題,從而縮短除錯時間。

IronXL 是否需要任何特殊的伺服器設定?

不,IronXL 無需特殊伺服器設定或額外驅動程式,這簡化了部署流程並降低了維護負擔。

IronXL 如何提升開發生產力?

IronXL 透過提供一種簡單且高效的方式,將 Excel 資料匯入 ASP.NET C# 中的 GridView,從而提升開發效率,讓開發人員無需受制於資料匯入的複雜性,得以專注於其他關鍵任務。

IronXL 能否與現有的 ASP.NET C# 應用程式整合?

是的,IronXL 可輕鬆整合至現有的 ASP.NET C# 應用程式中,讓您無需大幅變更應用程式架構,即可將 Excel 資料無縫匯入 GridView。

IronXL 支持哪些編程語言?

IronXL 主要設計用於 C# 和 ASP.NET 環境,為這些程式語言提供強大的支援與整合功能。

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

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我