使用IRONXL

如何在ASP.NET中查看Excel

這個綜合性教程將演示如何使用 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 檔案中的數據