跳至頁尾內容
USING IRONXL

Blazor匯出到Excel:使用C#中的IronXL的完整指南

將資料匯出到Excel是幾乎每個網頁應用程式都需要的功能,無論是用於生成報告、庫存清單還是客戶發票。 在Blazor Server應用程式中,要穩健地實現這一目標而不需要Microsoft Office可能具有挑戰性。 這就是IronXL發揮作用的地方。 它允許您直接從伺服器建立、格式化和下載Excel文件,無需安裝Office,並可無縫整合到Blazor中。 在本指南中,您將看到如何輕鬆地將專業的Excel匯出功能新增到您的應用程式中。我們開始吧。

使用IronXL將資料匯出到Excel的入門指南

在Blazor Server應用程式中設置IronXL需要最少的配置。 首先在Visual Studio 2022或更高版本中建立一個新的Blazor Server專案,目標設定為.NET 6或更高版本。

通過NuGet套件管理器控制台安裝IronXL(參見我們的完整安裝指南了解替代方法):

Install-Package IronXL.Excel

接下來,為文件下載建立一個JavaScript輔助函式。 在您的wwwroot資料夾中,新增一個名為excelExport.js的新JavaScript文件:

window.downloadFileFromStream = async (fileName, contentStreamReference) => {
    const arrayBuffer = await contentStreamReference.arrayBuffer();
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);
    const anchorElement = document.createElement('a');
    anchorElement.href = url;
    anchorElement.download = fileName ?? 'export.xlsx';
    anchorElement.click();
    anchorElement.remove();
    URL.revokeObjectURL(url);
}
window.downloadFileFromStream = async (fileName, contentStreamReference) => {
    const arrayBuffer = await contentStreamReference.arrayBuffer();
    const blob = new Blob([arrayBuffer]);
    const url = URL.createObjectURL(blob);
    const anchorElement = document.createElement('a');
    anchorElement.href = url;
    anchorElement.download = fileName ?? 'export.xlsx';
    anchorElement.click();
    anchorElement.remove();
    URL.revokeObjectURL(url);
}
JAVASCRIPT

在您的_Host.cshtml文件中包含此腳本:

<script src="~/excelExport.js"></script>
<script src="~/excelExport.js"></script>
HTML

此JavaScript函式處理瀏覽器端的下載機制,將來自Blazor Server應用程式的位元組流轉換為可下載文件。該函式建立一個臨時的blob URL,觸發下載並清理資源以防止記憶體洩漏。

如何使用IronXL將資料來源匯出到Excel文件?

建立Excel匯出服務來處理您的業務邏輯。 此服務將IronXL的功能封裝起來,並提供可重用的方法以適應Blazor Excel匯出的不同情境:

using IronXL;
using System.IO;
using ExportExcel.Models;
public class ExcelExportService
{
    public byte[] GenerateSalesReport(List<SalesData> salesData)
    {
        try
        {
            var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
            workbook.Metadata.Author = "Sales Department";
            var worksheet = workbook.CreateWorkSheet("Monthly Sales");
            worksheet["A1"].Value = "Date";
            worksheet["B1"].Value = "Product";
            worksheet["C1"].Value = "Quantity";
            worksheet["D1"].Value = "Revenue";
            worksheet["E1"].Value = "Profit Margin";
            var headerRange = worksheet["A1:E1"];
            headerRange.Style.Font.Bold = true;
            headerRange.Style.BackgroundColor = "#4472C4";
            headerRange.Style.Font.Color = "#FFFFFF";
            int row = 2;
            foreach (var sale in salesData)
            {
                worksheet[$"A{row}"].Value = sale.Date.ToString("yyyy-MM-dd");
                worksheet[$"B{row}"].Value = sale.Product ?? "Unknown";
                worksheet[$"C{row}"].Value = sale.Quantity;
                worksheet[$"D{row}"].Value = sale.Revenue;
                worksheet[$"E{row}"].Value = $"=D{row}*0.15";
                row++;
            }
            worksheet.AutoSizeColumn(0, true);
            using var ms = workbook.ToStream();
            return ms.ToArray();
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("Failed to generate sales report", ex);
        }
    }
}
using IronXL;
using System.IO;
using ExportExcel.Models;
public class ExcelExportService
{
    public byte[] GenerateSalesReport(List<SalesData> salesData)
    {
        try
        {
            var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
            workbook.Metadata.Author = "Sales Department";
            var worksheet = workbook.CreateWorkSheet("Monthly Sales");
            worksheet["A1"].Value = "Date";
            worksheet["B1"].Value = "Product";
            worksheet["C1"].Value = "Quantity";
            worksheet["D1"].Value = "Revenue";
            worksheet["E1"].Value = "Profit Margin";
            var headerRange = worksheet["A1:E1"];
            headerRange.Style.Font.Bold = true;
            headerRange.Style.BackgroundColor = "#4472C4";
            headerRange.Style.Font.Color = "#FFFFFF";
            int row = 2;
            foreach (var sale in salesData)
            {
                worksheet[$"A{row}"].Value = sale.Date.ToString("yyyy-MM-dd");
                worksheet[$"B{row}"].Value = sale.Product ?? "Unknown";
                worksheet[$"C{row}"].Value = sale.Quantity;
                worksheet[$"D{row}"].Value = sale.Revenue;
                worksheet[$"E{row}"].Value = $"=D{row}*0.15";
                row++;
            }
            worksheet.AutoSizeColumn(0, true);
            using var ms = workbook.ToStream();
            return ms.ToArray();
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("Failed to generate sales report", ex);
        }
    }
}
Imports IronXL
Imports System.IO
Imports ExportExcel.Models

Public Class ExcelExportService
    Public Function GenerateSalesReport(salesData As List(Of SalesData)) As Byte()
        Try
            Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
            workbook.Metadata.Author = "Sales Department"
            Dim worksheet = workbook.CreateWorkSheet("Monthly Sales")
            worksheet("A1").Value = "Date"
            worksheet("B1").Value = "Product"
            worksheet("C1").Value = "Quantity"
            worksheet("D1").Value = "Revenue"
            worksheet("E1").Value = "Profit Margin"
            Dim headerRange = worksheet("A1:E1")
            headerRange.Style.Font.Bold = True
            headerRange.Style.BackgroundColor = "#4472C4"
            headerRange.Style.Font.Color = "#FFFFFF"
            Dim row As Integer = 2
            For Each sale In salesData
                worksheet($"A{row}").Value = sale.Date.ToString("yyyy-MM-dd")
                worksheet($"B{row}").Value = If(sale.Product, "Unknown")
                worksheet($"C{row}").Value = sale.Quantity
                worksheet($"D{row}").Value = sale.Revenue
                worksheet($"E{row}").Value = $"=D{row}*0.15"
                row += 1
            Next
            worksheet.AutoSizeColumn(0, True)
            Using ms = workbook.ToStream()
                Return ms.ToArray()
            End Using
        Catch ex As Exception
            Throw New InvalidOperationException("Failed to generate sales report", ex)
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

此服務展示了IronXL的關鍵功能,包括建立新的工作簿和工作表,新增格式化標頭,使用從資料來源匯入的資料填充資料行,應用公式,以及處理潛在的錯誤。 AutoSizeColumn方法確保欄位能夠正確顯示,無論內容長度如何。 如需更多進階格式化選項,請參考我們的儲存格樣式指南

如何在Blazor中實現文件下載?

建立一個使用匯出服務並處理使用者互動的Razor元件:

@page "/excel-export"
@using ExportExcel.Models
@inject ExcelExportService ExcelService
@inject IJSRuntime JS
<h3>Excel Export Dashboard</h3>
<div class="export-section">
    <button class="btn btn-primary" @onclick="ExportSalesReport" disabled="@isExporting">
        @if (isExporting)
        {
            <span>Generating...</span>
        }
        else
        {
            <span>Export Sales Report</span>
        }
    </button>
    @if (!string.IsNullOrEmpty(errorMessage))
    {
        <div class="alert alert-danger mt-2">@errorMessage</div>
    }
</div>
@code {
    private bool isExporting = false;
    private string errorMessage = "";
    private async Task ExportSalesReport()
    {
        try
        {
            isExporting = true;
            errorMessage = "";
            var salesData = GetSalesData();
            var fileBytes = ExcelService.GenerateSalesReport(salesData);
            using var stream = new MemoryStream(fileBytes);
            using var streamRef = new DotNetStreamReference(stream);
            await JS.InvokeVoidAsync("downloadFileFromStream",
                $"SalesReport_{DateTime.Now:yyyyMMdd}.xlsx", streamRef);
        }
        catch (Exception ex)
        {
            errorMessage = "Export failed. Please try again.";
        }
        finally
        {
            isExporting = false;
        }
    }
    private List<SalesData> GetSalesData()
    {
        return new List<SalesData>
        {
            new() { Date = DateTime.Now, Product = "Widget A",
                   Quantity = 100, Revenue = 5000 },
            new() { Date = DateTime.Now.AddDays(-1), Product = "Widget B",
                   Quantity = 75, Revenue = 3750 }
        };
    }
}

此元件在匯出過程中為使用者提供反饋,優雅地處理錯誤,並生成帶時間戳的文件名稱。 DotNetStreamReference 包裝器能夠有效地將二進制資料流傳輸到JavaScript。

輸出

當我們運行程式碼時,我們將看到我們的頁面已載入,並有一個按鈕用於處理匯出過程。

Blazor 匯出到 Excel:使用 IronXL 在 C# 中的完整指南:圖像 1 - 範例 Blazor 頁面

當我們點擊按鈕時,資料將被保存到一個新的Excel文件中,並下載匯出的文件。

Blazor 匯出到 Excel:使用 IronXL 在 C# 中的完整指南:圖像 2 - 資料匯出到一個 Excel 文件

IronXL可以為您的Excel匯出增加哪些進階功能?

IronXL支援複雜的Excel功能,以獲得專業的匯出效果。 對於庫存管理情境,您可以新增條件格式化多個工作表

using IronXL;
using ExportExcel.Models;
using System.IO;
namespace ExportExcel.Services
{
    public class InventoryExportService
    {
        public byte[] GenerateInventoryReport(List<InventoryItem> items)
        {
            var workbook = WorkBook.Create();
            var details = workbook.CreateWorkSheet("Inventory Details");
            details["A1"].Value = "SKU";
            details["B1"].Value = "Name";
            details["C1"].Value = "Quantity";
            var headerRange = details["A1:C1"];
            headerRange.Style.Font.Bold = true;
            for (int i = 0; i < items.Count; i++)
            {
                var row = i + 2;
                var item = items[i];
                details[$"A{row}"].Value = item.SKU;
                details[$"B{row}"].Value = item.Name;
                details[$"C{row}"].Value = item.Quantity;
                if (item.Quantity < item.ReorderLevel)
                {
                    details[$"C{row}"].Style.BackgroundColor = "#FFB6B6";
                }
            }
            using var stream = workbook.ToStream();
            return stream.ToArray();
        }
    }
}
using IronXL;
using ExportExcel.Models;
using System.IO;
namespace ExportExcel.Services
{
    public class InventoryExportService
    {
        public byte[] GenerateInventoryReport(List<InventoryItem> items)
        {
            var workbook = WorkBook.Create();
            var details = workbook.CreateWorkSheet("Inventory Details");
            details["A1"].Value = "SKU";
            details["B1"].Value = "Name";
            details["C1"].Value = "Quantity";
            var headerRange = details["A1:C1"];
            headerRange.Style.Font.Bold = true;
            for (int i = 0; i < items.Count; i++)
            {
                var row = i + 2;
                var item = items[i];
                details[$"A{row}"].Value = item.SKU;
                details[$"B{row}"].Value = item.Name;
                details[$"C{row}"].Value = item.Quantity;
                if (item.Quantity < item.ReorderLevel)
                {
                    details[$"C{row}"].Style.BackgroundColor = "#FFB6B6";
                }
            }
            using var stream = workbook.ToStream();
            return stream.ToArray();
        }
    }
}
Imports IronXL
Imports ExportExcel.Models
Imports System.IO

Namespace ExportExcel.Services
    Public Class InventoryExportService
        Public Function GenerateInventoryReport(items As List(Of InventoryItem)) As Byte()
            Dim workbook = WorkBook.Create()
            Dim details = workbook.CreateWorkSheet("Inventory Details")
            details("A1").Value = "SKU"
            details("B1").Value = "Name"
            details("C1").Value = "Quantity"
            Dim headerRange = details("A1:C1")
            headerRange.Style.Font.Bold = True
            For i As Integer = 0 To items.Count - 1
                Dim row = i + 2
                Dim item = items(i)
                details($"A{row}").Value = item.SKU
                details($"B{row}").Value = item.Name
                details($"C{row}").Value = item.Quantity
                If item.Quantity < item.ReorderLevel Then
                    details($"C{row}").Style.BackgroundColor = "#FFB6B6"
                End If
            Next
            Using stream = workbook.ToStream()
                Return stream.ToArray()
            End Using
        End Function
    End Class
End Namespace
$vbLabelText   $csharpLabel

IronXL能夠輕鬆處理多個工作表,應用基於業務規則的條件格式化,並在需要時支持進階的Excel功能,如樞紐分析表和圖表。 如需詳細的API文件,請存取我們的完整參考指南

Blazor 匯出到 Excel:使用 IronXL 在 C# 中的完整指南:圖像 3 - 進階功能範例輸出

結論

IronXL將Blazor Server應用程式中Excel文件的生成從一個複雜的挑戰轉變為一個簡單的任務。 其直觀的API消除了對Microsoft Office安裝的需求,同時提供了存取進階Excel功能的能力。 從簡單的資料匯出到具有公式和格式的複雜多工作表報告,IronXL全部處理良好,性能卓越且可靠。

準備好以專業的Excel匯出功能增強您的Blazor應用程式了嗎? 立即開始免費試用IronXL,或探索我們的授權選項以進行生產部署。

常見問題

如何在Blazor Server應用程式中匯出Excel檔案?

您可以使用IronXL在Blazor Server應用程式中匯出Excel檔案,通過直接從您的伺服器建立、格式化及下載XLSX檔案來達成,無需Microsoft Office。

使用IronXL在Blazor中是否需要安裝Microsoft Office?

不,IronXL不需要在您的伺服器上安裝Microsoft Office即可在Blazor應用程式中建立、格式化及匯出Excel檔案。

IronXL是否可以與Blazor應用程式整合?

是的,IronXL可以與Blazor應用程式無縫整合,讓您輕鬆新增Excel匯出功能。

在網頁應用程式中匯出Excel檔案的一些常見用途是什麼?

常見用途包括生成報告、建立庫存清單,以及生成Excel格式的客戶發票。

是否有使用IronXL匯出Excel檔案的程式碼範例?

是的,本指南提供程式碼範例以幫助您在Blazor Server應用程式中使用IronXL實現Excel匯出功能。

是否可以在Blazor中使用IronXL格式化Excel檔案?

是的,IronXL允許您格式化Excel檔案,包括設置樣式、新增公式等,直接在Blazor應用程式中實現。

使用IronXL可以建立哪些型別的Excel檔案?

您可以使用IronXL建立XLSX檔案,這是一種廣泛使用的Excel檔案格式,與大多數試算表應用程式相容。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話