跳至页脚内容
USING IRONXL

如何在ASP.NET C# 中将 Excel 导入 GridView

使用IronXL将 Excel 数据导入ASP.NET C# 中的 GridView 非常简单。 您加载一个工作簿,将工作表转换为GridView控件——无需OLEDB驱动程序或复杂的连接字符串。

>亲自体验一下:获取IronXL的免费试用版,跟随下面的代码示例进行操作。

如何安装IronXL以实现 Excel GridView 集成?

在编写任何代码之前,您需要将IronXL添加到您的ASP.NET项目中。 最快捷的方法是NuGet,可以通过 Visual Studio 包管理器控制台或.NET CLI 进行安装。

Install-Package IronXL.Excel

安装完成后, 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 中的最快方法是什么?

最快的方法将GridView.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

DataTable的列名。 当您使用GridView时,ASP.NET会自动为每个Excel标题创建一个列。

ToDataTable 如何处理混合数据类型?

在调用string。 如果您的应用程序需要类型化列——例如,价格数据的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

如果使用Bootstrap样式表,CssClass属性会将网格连接到样式表,使您无需额外配置即可获得样式化的行和边框。

在后台代码中,处理按钮点击事件。 下面的模式将上传的文件保存到临时服务器路径,使用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 事件签名。 注意,Uploads文件夹已经存在,该调用不操作。

在ASP.NET C#中使用IronXL将Excel导入GridView:在GridView控件中渲染上传的电子表格数据

用户选择.xlsx文件并点击上传按钮后,网格就会填充电子表格内容。 列名取自 Excel 文件的第一行,所有后续行都成为网格中的数据行。

如何验证上传的文件?

在生产环境中使用时,处理前应检查文件扩展名和 MIME 类型。 IronXL会对不支持的文件格式抛出异常,但最好在操作文件系统之前,就在控制器级别拒绝错误的上传:

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

if (!allowed.Contains(ext))
{
    lblError.Text = "Only .xls and .xlsx files are accepted.";
    return;
}
string ext = Path.GetExtension(FileUpload1.FileName).ToLowerInvariant();
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请求限制或在调用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方法很有用。 返回的DataTable对应于一个Excel工作表,并且表名与工作表标签名匹配。

在ASP.NET C#中使用IronXL将Excel导入GridView:将命名工作表数据绑定到GridView

如何在绑定到 GridView 之前筛选行?

如果您只需要Excel行的一个子集——例如,"Status"列等于"Active"的行——读取由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) 无ne 无ne 低的
OLEDB / JET ACE/JET发动机 部分的 32/64 位驱动程序 高的
Open XML SDK 无ne 无ne 高的
EPPlus 无ne 无(生产需要商业许可) 中等的

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头确保浏览器下载而不是尝试内联显示文件。

在ASP.NET C#中使用IronXL将Excel导入GridView:DataTable导出回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,其无须Interop即可反映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 小时在线。
聊天
电子邮件
打电话给我