使用IRONXL

如何在ASP.NET中查看Excel

雷根·彭
雷根·彭
2023年六月27日
更新 2024年三月31日
分享:

本综合教程将演示如何使用 ASP.NET MVC 和 IronXL 构建 Excel 查看器。 该查看器将使用户能够直接从网页上显示、编辑和浏览 Excel 文件。

什么是IronXL?

IronXL 是一个功能强大的 .NET 库,提供与 Excel 操作相关的大量功能。 它提供了一个简化的 API,允许 .NET 开发人员编写、操作和读取 Excel 文档,支持包括 XLS、XLSX、CSV 等多种文件格式。

使用IronXL,您可以读取Excel文件,提取数据,添加或编辑工作表,创建或修改行和列,应用公式,保存更改等等。 所有这些操作都无需在您的计算机上安装 Microsoft Excel 即可完成。

IronXL 支持图像、样式、条件格式化,以及其他复杂的 Excel 功能,使其成为 .NET Excel 操作的综合解决方案。 它非常适合处理 ASP.NET MVC 应用程序的数据源和电子表格要求。 IronXL 库将用于在 ASP.NET Web 应用程序中查看 Excel 文件。

先决条件

  • 对 ASP.NET MVC 有基本了解
  • 您的计算机上安装了 Visual Studio
  • 安装了IronXL库。 您可以在其官方文档中找到安装指南。

入门

首先,让我们在 Visual Studio 中创建一个新的 ASP.NET MVC 项目。

  1. 打开 Visual Studio。

  2. 单击文件 > 新建 > 项目

  3. 在新建项目窗口中,选择ASP.NET Web 应用程序 (.NET Framework)模板。

    如何在ASP.NET中查看Excel,图1:在Visual Studio中创建一个新的ASP.NET Web应用程序

    在 Visual Studio 中创建一个新的 ASP.NET Web 应用程序

  4. 将项目命名为ExcelViewer,选择项目位置并点击Create按钮。

    如何在ASP.NET中查看Excel,图2:配置您的项目

    配置您的项目

    本文将重点介绍如何在此 ASP.NET MVC 应用程序中实现 Excel 查看器功能。

将 IronXL 添加到您的项目中

要处理 Excel 文件格式(例如 .xls、.xlsx 和 .csv),IronXL 提供了全面的功能来加载 Excel 文档、读取、写入甚至修改 Excel 数据。 它支持公式、图像、格式等。

  1. 解决方案资源管理器中右键单击你的项目,然后导航到管理NuGet 包。

  2. NuGet 包管理器中,搜索IronXL.Excel

  3. 单击安装将其添加到您的项目中。

    如何在 ASP.NET 中查看 Excel,图 3:在 NuGet 包管理器 UI 中搜索并安装 IronXL 包

    在NuGet包管理器UI中搜索并安装IronXL包

    您也可以使用软件包管理器控制台,使用以下命令安装 IronXL:

Install-Package IronXL.Excel

如何在ASP.NET中查看Excel,图4:从包管理器控制台安装IronXL包

从包管理器控制台安装IronXL包

现在 IronXL 已经安装完毕,让我们进入下一步。

建筑模型

ExcelModel

第一步是为 Excel 数据创建一个模型。 ExcelModel类将代表一个单独的Excel工作表,并包含工作表名称和Excel工作表中的数据。

namespace Excel_File_Viewer_IronXL.Models
{
    public class ExcelModel
    {
        public string SheetName { get; set; }
        public List<string []> Data { get; set; }
    }
}
namespace Excel_File_Viewer_IronXL.Models
{
    public class ExcelModel
    {
        public string SheetName { get; set; }
        public List<string []> Data { get; set; }
    }
}
Namespace Excel_File_Viewer_IronXL.Models
	Public Class ExcelModel
		Public Property SheetName() As String
		Public Property Data() As List(Of String ())
	End Class
End Namespace
$vbLabelText   $csharpLabel

ExcelModel 定义了两个属性,SheetNameDataSheetName 是用于保存每个 Excel 工作表名称的简单字符串。 Data 是一个字符串数组的列表,用于存储 Excel 表每一行的数据。

ExcelViewModel

接下来,让我们创建ExcelViewModel。 该模型是一个包装器,其中包含一个文件、一条消息和一个ExcelModel列表,表示文件中所有表格的数据。

using Microsoft.AspNetCore.Http;
using System.Collections.Generic;

namespace Excel_File_Viewer_IronXL.Models
{
    public class ExcelViewModel
    {
        public IFormFile File { get; set; }
        public string Message { get; set; }
        public List<ExcelModel> ExcelData { get; set; }
    }
}
using Microsoft.AspNetCore.Http;
using System.Collections.Generic;

namespace Excel_File_Viewer_IronXL.Models
{
    public class ExcelViewModel
    {
        public IFormFile File { get; set; }
        public string Message { get; set; }
        public List<ExcelModel> ExcelData { get; set; }
    }
}
Imports Microsoft.AspNetCore.Http
Imports System.Collections.Generic

Namespace Excel_File_Viewer_IronXL.Models
	Public Class ExcelViewModel
		Public Property File() As IFormFile
		Public Property Message() As String
		Public Property ExcelData() As List(Of ExcelModel)
	End Class
End Namespace
$vbLabelText   $csharpLabel

该类将用作视图模型。 它有一个IFormFile属性用于文件上传,一个Message字符串用于显示任何消息,以及一个List<ExcelModel>用于存储检索到的Excel数据。

5. 创建ExcelController以加载Excel文件进行数据提取

然后创建一个新的ExcelController。 这里就是魔法发生的地方! Excel 文件通过 IronXL 的 WorkBook.Load 函数加载,循环遍历工作表,提取数据并将其添加到 ExcelViewModel

using Excel_File_Viewer_IronXL.Models;
using IronXL;
using System.Collections.Generic;
using System.Web.Mvc;
using System;
using System.Linq;

public class ExcelController : Controller
{
    // GET: Excel
    public ActionResult Index()
    {
        var model = new ExcelViewModel();

        // Define the file path
        string filePath = Server.MapPath("~/App_Data/Test.xlsx"); 

    // Replace 'Test.xlsx' with your file name

        List<ExcelModel> data = new List<ExcelModel>();

        try
        {
            // Load workbook directly from a file path
            var workbook = WorkBook.Load(filePath);
            foreach (var worksheet in workbook.WorkSheets)
            {
                data.Add(new ExcelModel
                {
                    SheetName = worksheet.Name,
                    Data = worksheet.Rows.Select(r => r.ToArray().Select(c => c.Value.ToString()).ToArray()).ToList()
                });
            }

            model.ExcelData = data;
            model.Message = "File processed successfully!";
        }
        catch (Exception ex)
        {
            model.Message = $"Error occurred while processing file: {ex.Message}";
        }

        return View(model);
    }
}
using Excel_File_Viewer_IronXL.Models;
using IronXL;
using System.Collections.Generic;
using System.Web.Mvc;
using System;
using System.Linq;

public class ExcelController : Controller
{
    // GET: Excel
    public ActionResult Index()
    {
        var model = new ExcelViewModel();

        // Define the file path
        string filePath = Server.MapPath("~/App_Data/Test.xlsx"); 

    // Replace 'Test.xlsx' with your file name

        List<ExcelModel> data = new List<ExcelModel>();

        try
        {
            // Load workbook directly from a file path
            var workbook = WorkBook.Load(filePath);
            foreach (var worksheet in workbook.WorkSheets)
            {
                data.Add(new ExcelModel
                {
                    SheetName = worksheet.Name,
                    Data = worksheet.Rows.Select(r => r.ToArray().Select(c => c.Value.ToString()).ToArray()).ToList()
                });
            }

            model.ExcelData = data;
            model.Message = "File processed successfully!";
        }
        catch (Exception ex)
        {
            model.Message = $"Error occurred while processing file: {ex.Message}";
        }

        return View(model);
    }
}
Imports Excel_File_Viewer_IronXL.Models
Imports IronXL
Imports System.Collections.Generic
Imports System.Web.Mvc
Imports System
Imports System.Linq

Public Class ExcelController
	Inherits Controller

	' GET: Excel
	Public Function Index() As ActionResult
		Dim model = New ExcelViewModel()

		' Define the file path
		Dim filePath As String = Server.MapPath("~/App_Data/Test.xlsx")

	' Replace 'Test.xlsx' with your file name

		Dim data As New List(Of ExcelModel)()

		Try
			' Load workbook directly from a file path
			Dim workbook = WorkBook.Load(filePath)
			For Each worksheet In workbook.WorkSheets
				data.Add(New ExcelModel With {
					.SheetName = worksheet.Name,
					.Data = worksheet.Rows.Select(Function(r) r.ToArray().Select(Function(c) c.Value.ToString()).ToArray()).ToList()
				})
			Next worksheet

			model.ExcelData = data
			model.Message = "File processed successfully!"
		Catch ex As Exception
			model.Message = $"Error occurred while processing file: {ex.Message}"
		End Try

		Return View(model)
	End Function
End Class
$vbLabelText   $csharpLabel

在这里,初始化ExcelViewModel,然后使用IronXL加载WorkBook,遍历每个WorkSheet,对于每个WorkSheet,我们创建一个包含工作表名称和数据的ExcelModel。 然后将ExcelModel添加到ExcelViewModel中的ExcelData列表。

将加载并显示以下 Excel 文件的数据:

如何在ASP.NET中查看Excel,图5:示例Excel文件

示例Excel文件

6.创建视图

在你的Views/Excel目录中,创建一个新的HTML文件Index.cshtml以显示Excel数据。 然后使用 Bootstrap 的nav-tabs来表示 Excel 文件中的每个工作表。每个工作表将是一个单独的标签,标签的内容将是工作表的数据。

@model Excel_File_Viewer_IronXL.Models.ExcelViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Excel File Viewer</h2>

@if (Model.ExcelData != null)
{
    <ul class="nav nav-tabs" id="myTab" role="tablist">
        @for (int i = 0; i < Model.ExcelData.Count; i++)
        {
            <li class="nav-item">
                <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href="#content-@i" role="tab" aria-controls="content-@i" aria-selected="@(i == 0)">
                    @Model.ExcelData [i].SheetName
                </a>
            </li>
        }
    </ul>
    <div class="tab-content" id="myTabContent">
        @for (int i = 0; i < Model.ExcelData.Count; i++)
        {
            <div class="tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role="tabpanel" aria-labelledby="tab-@i">
                <table class="table table-bordered">
                    @foreach (var row in Model.ExcelData [i].Data)
                    {
                        <tr>
                            @foreach (var cell in row)
                            {
                                <td>@cell</td>
                            }
                        </tr>
                    }
                </table>
            </div>
        }
    </div>
}
@model Excel_File_Viewer_IronXL.Models.ExcelViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Excel File Viewer</h2>

@if (Model.ExcelData != null)
{
    <ul class="nav nav-tabs" id="myTab" role="tablist">
        @for (int i = 0; i < Model.ExcelData.Count; i++)
        {
            <li class="nav-item">
                <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href="#content-@i" role="tab" aria-controls="content-@i" aria-selected="@(i == 0)">
                    @Model.ExcelData [i].SheetName
                </a>
            </li>
        }
    </ul>
    <div class="tab-content" id="myTabContent">
        @for (int i = 0; i < Model.ExcelData.Count; i++)
        {
            <div class="tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role="tabpanel" aria-labelledby="tab-@i">
                <table class="table table-bordered">
                    @foreach (var row in Model.ExcelData [i].Data)
                    {
                        <tr>
                            @foreach (var cell in row)
                            {
                                <td>@cell</td>
                            }
                        </tr>
                    }
                </table>
            </div>
        }
    </div>
}
model ReadOnly Property () As Excel_File_Viewer_IronXL.Models.ExcelViewModel
	ViewBag.Title = "Index"
End Property

'INSTANT VB TODO TASK: The following line could not be converted:
(Of h2) Excel File Viewer</h2> [if](Model.ExcelData != Nothing)
If True Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <ul class="nav nav-tabs" id="myTab" role="tablist"> for(int i = 0; i < Model.ExcelData.Count; i++)
	"myTab" role="tablist"> [for](Integer i = 0; i < Model.ExcelData.Count; i)
		If True Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <ul class="nav nav-tabs" id="myTab" role
	"nav nav-tabs" id="myTab" role
	<ul class="nav nav-tabs" id
	i += 1
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href="#content-@i" role="tab" aria-controls="content-@i" aria-selected="@(i == 0)"> @Model.ExcelData [i].SheetName </a> </li>
			"content-@i" aria-selected="@(i == 0)"> Model.ExcelData (i).SheetName </a> </li>
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href="#content-@i" role="tab" aria-controls="content-@i" aria-selected
			"tab" aria-controls="content-@i" aria-selected
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href="#content-@i" role="tab" aria-controls
			"#content-@i" role="tab" aria-controls
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href="#content-@i" role
			"tab" href="#content-@i" role
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle="tab" href
			"tab-@i" data-toggle="tab" href
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle
			"nav-link @(i == 0 ? "active" : "")" id="tab-@i" data-toggle
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <li class="nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id
			"nav-item"> <a class="nav-link @(i == 0 ? "active" : "")" id
			<li class="nav-item"> <a class
		End If
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: </ul> <div class="tab-content" id="myTabContent"> for(int i = 0; i < Model.ExcelData.Count; i++)
	"tab-content" id="myTabContent"> [for](Integer i = 0; i < Model.ExcelData.Count; i)
		If True Then
	</ul> <div class="tab-content" id
	i += 1
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <div class="tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role="tabpanel" aria-labelledby="tab-@i"> <table class="table table-bordered"> foreach(var row in Model.ExcelData [i].Data)
			"tab-@i"> <table class="table table-bordered"> foreach(var row in Model.ExcelData (i).Data)
					If True Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <div class="tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role="tabpanel" aria-labelledby="tab-@i"> <table class
			"tabpanel" aria-labelledby="tab-@i"> <table class
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <div class="tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role="tabpanel" aria-labelledby
			"content-@i" role="tabpanel" aria-labelledby
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: <div class="tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role
			"tab-pane fade @(i == 0 ? "show active" : "")" id="content-@i" role
			<div class="tab-pane fade @(i == 0 ? "show active" : "")" id
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'						(Of tr) @foreach(var cell in row)
'							{
'								<td> @cell</td>
'							}
						</tr>
					End If
				</table> </div>
		End If
	</div>
End If
$vbLabelText   $csharpLabel

在此代码示例中,nav nav-tabs 将生成一个标签列表,每个标签代表 Excel 文件中的一个工作表。相应的标签内容将以表格格式显示相应工作表的数据。 通过一些改动,添加了一个浏览按钮,以便手动选择 Excel 文件。

运行程序

完成所有步骤并正确设置项目后,就可以运行项目了。 您应该会看到一个网页,上面有以 Excel 文件中工作表名称命名的选项卡。单击选项卡将以表格格式显示相应工作表的数据。

如何在ASP.NET中查看Excel,图6:Excel查看器

Excel查看器

结论

您刚刚使用IronXL创建了一个ASP.NET Excel查看器! 这个功能强大的库使用户能够以更高效、更易于管理的方式处理 Excel 文件。 有了 IronXL 的帮助,在 .NET 环境中处理 Excel 文件变得前所未有的简单。

IronXL提供免费试用,让您在无需前期成本的情况下探索和了解其广泛的功能。一旦您测试并发现它是您需求的完美解决方案,许可证的价格从$749起。

雷根·彭
软件工程师
Regan毕业于雷丁大学,拥有电子工程学士学位。在加入Iron Software之前,他的前工作职位要求他专注于单一任务;他在Iron Software最喜欢的是能进行多种工作,无论是增加销售价值、技术支持、产品开发还是营销。他喜欢了解开发人员如何使用Iron Software的库,并利用这些知识不断改进文档和开发产品。
< 前一页
如何在C#中将XLS转换为XLSX文件
下一步 >
如何在C#中写入CSV文件数据