使用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 網頁應用程式中檢視 Excel 文件。

先決條件

  • 基本了解 ASP.NET MVC
  • 已在您的機器上安裝 Visual Studio
  • 已安裝 IronXL 圖書館。你可以在他們的官方文件中找到安裝指南。

開始使用

首先,讓我們在 Visual Studio 中建立一個新的 ASP.NET MVC 專案。

  1. 開啟 Visual Studio。
  2. 點擊 文件 > 新建 > 專案
  3. 在新專案視窗中,選擇 ASP.NET Web Application。 (.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. Solution Explorer 中右鍵點擊您的項目,然後導航到 Manage NuGet Packages

  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 表,並包含表名和 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. 建立 View

在您的 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 檔案中的數據

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 1,023,839 查看許可證 >