跳至页脚内容
使用 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上找到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 索引器单独读取单元格值,并在填充强类型 DataTable 之前将其转换为适当的 .NET 类型。

对于简单的显示,在 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许可证即可涵盖整个Suite。

如何将 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 导入 GridView 有什么好处?

使用IronXL可以简化在ASP.NET C# 中将 Excel 数据导入 GridView 的过程,无需复杂的 OLEDB 连接字符串和驱动程序安装。它允许开发人员加载 XLS 和 XLSX 文件,将其转换为 DataTable,并通过简洁的代码在 GridView 控件中显示它们。

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

IronXL支持多种 Excel 文件格式,包括 XLS 和 XLSX,使其成为将数据导入 GridView 的多功能工具。它确保了与不同 Excel 版本的兼容性和易用性。

IronXL能否将 Excel 文件转换为 DataTables?

是的, IronXL可以将 Excel 文件转换为 DataTable,然后可以轻松地在ASP.NET C# 的 GridView 控件中显示这些 DataTable。此功能简化了数据处理和可视化过程。

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环境,为这些编程语言提供强大的支持和集成。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我