跳至頁尾內容
USING IRONXL

如何在 Blazor 中使用 IronXL 導出到 Excel

將資料匯出到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)
        {
    // If the program fails to return file
            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)
        {
    // If the program fails to return file
            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
            ' If the program fails to return file
            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 = "";
            // Generate sample data - replace with actual data source
            var salesData = GetSalesData();
            // Generate Excel file
            var fileBytes = ExcelService.GenerateSalesReport(salesData);
            // Trigger download using a memory stream to handle the file
            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.";
            // Log exception details for debugging
        }
        finally
        {
            isExporting = false;
        }
    }
    private List<SalesData> GetSalesData()
    {
        // Return your actual data here
        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 }
        };
    }
}
@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 = "";
            // Generate sample data - replace with actual data source
            var salesData = GetSalesData();
            // Generate Excel file
            var fileBytes = ExcelService.GenerateSalesReport(salesData);
            // Trigger download using a memory stream to handle the file
            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.";
            // Log exception details for debugging
        }
        finally
        {
            isExporting = false;
        }
    }
    private List<SalesData> GetSalesData()
    {
        // Return your actual data here
        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 }
        };
    }
}
@page "/excel-export"
@Imports 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 Then
            <span>Generating...</span>
        Else
            <span>Export Sales Report</span>
        End If
    </button>
    @If Not String.IsNullOrEmpty(errorMessage) Then
        <div class="alert alert-danger mt-2">@errorMessage</div>
    End If
</div>
@code {
    Private isExporting As Boolean = False
    Private errorMessage As String = ""
    Private Async Function ExportSalesReport() As Task
        Try
            isExporting = True
            errorMessage = ""
            ' Generate sample data - replace with actual data source
            Dim salesData = GetSalesData()
            ' Generate Excel file
            Dim fileBytes = ExcelService.GenerateSalesReport(salesData)
            ' Trigger download using a memory stream to handle the file
            Using stream As New MemoryStream(fileBytes)
                Using streamRef As New DotNetStreamReference(stream)
                    Await JS.InvokeVoidAsync("downloadFileFromStream", $"SalesReport_{DateTime.Now:yyyyMMdd}.xlsx", streamRef)
                End Using
            End Using
        Catch ex As Exception
            errorMessage = "Export failed. Please try again."
            ' Log exception details for debugging
        Finally
            isExporting = False
        End Try
    End Function

    Private Function GetSalesData() As List(Of SalesData)
        ' Return your actual data here
        Return New List(Of SalesData) From {
            New SalesData With {.Date = DateTime.Now, .Product = "Widget A", .Quantity = 100, .Revenue = 5000},
            New SalesData With {.Date = DateTime.Now.AddDays(-1), .Product = "Widget B", .Quantity = 75, .Revenue = 3750}
        }
    End Function
}
$vbLabelText   $csharpLabel

此元件在匯出過程中為使用者提供反饋,優雅地處理錯誤,並生成帶時間戳的文件名稱。 DotNetStreamReference包裝使得二進位資料的串流到JavaScript更加高效。

輸出

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

如何在Blazor中使用IronXL匯出至Excel:圖1 - 範例Blazor頁面

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

如何在Blazor中使用IronXL匯出至Excel:圖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");
            // Add headers
            details["A1"].Value = "SKU";
            details["B1"].Value = "Name";
            details["C1"].Value = "Quantity";
            // Apply bold font for headers
            var headerRange = details["A1:C1"];
            headerRange.Style.Font.Bold = true;
            for (int i = 0; i < items.Count; i++)
            {
                var row = i + 2; // start from row 2
                var item = items[i];
                details[$"A{row}"].Value = item.SKU;
                details[$"B{row}"].Value = item.Name;
                details[$"C{row}"].Value = item.Quantity;
                // Highlight low stock items
                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");
            // Add headers
            details["A1"].Value = "SKU";
            details["B1"].Value = "Name";
            details["C1"].Value = "Quantity";
            // Apply bold font for headers
            var headerRange = details["A1:C1"];
            headerRange.Style.Font.Bold = true;
            for (int i = 0; i < items.Count; i++)
            {
                var row = i + 2; // start from row 2
                var item = items[i];
                details[$"A{row}"].Value = item.SKU;
                details[$"B{row}"].Value = item.Name;
                details[$"C{row}"].Value = item.Quantity;
                // Highlight low stock items
                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")
            ' Add headers
            details("A1").Value = "SKU"
            details("B1").Value = "Name"
            details("C1").Value = "Quantity"
            ' Apply bold font for headers
            Dim headerRange = details("A1:C1")
            headerRange.Style.Font.Bold = True
            For i As Integer = 0 To items.Count - 1
                Dim row = i + 2 ' start from row 2
                Dim item = items(i)
                details($"A{row}").Value = item.SKU
                details($"B{row}").Value = item.Name
                details($"C{row}").Value = item.Quantity
                ' Highlight low stock items
                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中使用IronXL匯出至Excel:圖3 - 進階功能範例輸出

結論

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

準備好以專業的Excel匯出功能增強您的Blazor應用程式了嗎? 開始您的免費試用以進行生產部屬。

常見問題

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

您可以使用IronXL在Blazor Server應用中匯出Excel檔案。IronXL允許您直接從您的伺服器建立、格式化和下載Excel檔案,無需Microsoft Office。

我是否需要Microsoft Office來處理Blazor中的Excel檔案?

不,IronXL使您能夠處理Excel檔案,無需Microsoft Office。它提供了在您的Blazor應用中直接建立和操作Excel檔案的功能。

在Blazor中使用IronXL進行Excel匯出的優點是什麼?

IronXL提供與Blazor的無縫整合,使您能夠輕鬆建立、格式化和匯出Excel檔案。它簡化了流程,消除了對Microsoft Office的需求,並支持各種Excel格式。

IronXL能與其他Blazor元件整合嗎?

是的,IronXL能無縫整合Blazor元件,使您可以輕鬆地在應用程式中新增Excel匯出功能。

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

是的,IronXL提供全面的功能來格式化Excel檔案,包括樣式單元格、調整列寬和設置複雜的公式,全部在您的Blazor Server應用中進行。

如何在Blazor中處理匯出到Excel的大型資料集?

IronXL旨在高效處理大型資料集,確保在Blazor Server環境中匯出大量資料到Excel檔案時運行順暢。

IronXL支持哪些Excel檔案格式?

IronXL支持各種Excel檔案格式,包括XLS,XLSX和CSV,允許您靈活地在Blazor應用中匯出和處理Excel資料。

IronXL能用於在Blazor中生成報告嗎?

當然可以,IronXL非常適合在Blazor應用中生成詳盡的報告。它提供強大的功能來匯編、格式化和匯出資料到專業的Excel報告中。

IronXL如何在匯出Excel檔案時確保資料完整性?

IronXL通過在匯出過程中準確保留資料的結構和格式來確保資料完整性,這讓它成為Blazor應用的可靠解決方案。

是否有方法可以在Blazor Server應用中使用IronXL自動化Excel檔案建立?

是的,IronXL可以用來在Blazor Server應用中自動化Excel檔案的建立和匯出,讓您能夠簡化工作流程並提高效率。

Curtis Chau
技術作家

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

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

Iron 支援團隊

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