使用IRONXL

如何在ASP.NET中查看Excel

已更新 2024年3月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框架)** 模板。

    如何在 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 Package Manager 中,搜索 IronXL.Excel

  3. 點擊 Install 將其添加到您的專案。

    如何在 ASP.NET 中查看 Excel,圖 3:在 NuGet Package Manager UI 中搜索並安裝 IronXL 套件

    在 NuGet 包管理器 UI 中搜尋並安裝 IronXL 套件

    您也可以透過以下命令使用套件管理器主控台安裝IronXL:

Install-Package IronXL.Excel

如何在 ASP.NET 中查看 Excel,圖4:從套件管理器控制台安裝 IronXL 套件

從套件管理器主控台安裝 IronXL 套件

現在安裝了IronXL,我們來進行下一步。

建立模型

ExcelModel

第一步是為 Excel 資料創建一個模型。 ExcelModel 類將代表單一 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
VB   C#

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
VB   C#

此類別將用作視圖模型。 它有一個(n) IFormFile 屬性用於檔案上傳,一個 Message 字串用於顯示任何訊息,和一個 List`儲存檢索到的 Excel 數據。

5. 建立 ExcelController 以加載 Excel 文件進行數據提取

然後建立一個新的 ExcelController。 這就是魔法發生的地方! 使用 IronXL 載入 Excel 文件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
VB   C#

在這裡,初始化一個(n)ExcelViewModel 然後載入Workbook使用 IronXL,遍歷每個工作表,並為每個 WorkSheet 創建一個(n)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
VB   C#

在此代碼範例中,nav nav-tabs 將生成一個標籤列表,每個標籤代表 Excel 文件中的一個工作表。相應的標籤內容將以表格格式顯示該工作表的數據。 通過進行一些更改,添加了一個瀏覽按鈕以手動選擇 Excel 文件。

運行程式

在您完成所有步驟並正確設置專案後,就可以開始執行它了。 您應該會看到一個網頁,其上有以您 Excel 文件中的工作表名稱命名的標籤。點擊標籤將以表格格式顯示相應工作表的數據。

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

Excel 檢視器

結論

您剛剛使用 IronXL 創建了一個 ASP.NET Excel 查看器。! 這個強大的程式庫使用户能夠以更高效和便於管理的方式處理 Excel 文件。 有了 IronXL,在 .NET 環境中處理 Excel 文件從未如此輕鬆。

IronXL提供一個免費試用,讓您可以在無需預付費用的情況下探索和了解其廣泛功能。一旦您測試過並發現它是適合您的完美解決方案,許可證價格從 $749 開始。

< 上一頁
如何在 C# 中將 XLS 轉換為 XLSX 文件
下一個 >
如何在 C# 中寫入 CSV 檔案中的數據