跳至頁尾內容
使用 IRONXL

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

幾乎所有 Web 應用程式都需要將資料匯出到 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);
        }
    }
}
$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 }
        };
    }
}
$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();
        }
    }
}
$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 可讓您無需 Microsoft Office 即可處理 Excel 檔案。它提供了直接在 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 文件,從而簡化工作流程並提高效率。

喬迪·巴迪亞
軟體工程師
喬迪精通Python、C#和C++,除了在Iron Software運用這些技能外,他還從事遊戲程式設計。他參與產品測試、產品開發和研究等工作,為產品的持續改進做出了巨大貢獻。豐富的經驗讓他始終保持挑戰性和工作熱情,他表示這是他最喜歡在Iron Software工作的原因之一。喬迪在佛羅裡達州邁阿密長大,畢業於佛羅裡達大學,主修電腦科學和統計學。