Altbilgi içeriğine atla
IRONXL KULLANARAK

Blazor Kullanarak IronXL ile Excel Dosyalarını Nasıl Dışa Aktarılır

Verileri Excel'e aktarmak, neredeyse her Blazor web uygulamasının ihtiyaç duyduğu bir şeydir - ister satış raporları, ister envanter listeleri, ister müşteri faturaları oluşturuyor olun. Blazor Sunucu uygulamasında, bunu güvenilir bir şekilde yapmak, Microsoft Office gerektirmeden zorlayıcı olabilir. IronXL bunu basitleştirir: Excel dosyalarını doğrudan sunucudan oluşturabilir, biçimlendirebilir ve indirebilirsiniz, Office kurulumu gerekmez. Bu kılavuz, IronXL kullanarak üretime hazır bir Excel dışa aktarma özelliğini Blazor içinde inşa etmenin - proje kurulumundan hizmet tasarımına, ileri formatlama ve çok sayfalı raporlar oluşturmaya kadar - adımlarını anlatır.

Blazor Sunucu Projesinde IronXL Nasıl Kurulur?

Herhangi bir aktarma mantığı yazmadan önce, bir Blazor Sunucu projesine IronXL eklemeniz ve bir tarayıcı yan yükleme yardımcısı yapılandırmanız gerekir.

Blazor Sunucu Projesi Oluşturma

Visual Studio 2022 veya daha sonraki bir sürümde, .NET 10'u hedefleyerek yeni bir Blazor Sunucu projesi oluşturarak başlayın. Proje hazır olduğunda, IronXL'i NuGet Paket Yöneticisi Konsolu aracılığıyla yükleyin.

Install-Package IronXL.Excel

IronXL, .NET 6 ve sonrası ile çalışır, bu nedenle mevcut Blazor projeleri, çerçeveyi yükseltmeden bunu edinebilir. Alternatif kurulum yöntemleri - örneğin NuGet UI veya CLI - için IronXL kurulum kılavuzuna bakın.

JavaScript İndirme Yardımcısını Eklemek

Blazor Sunucu tarafında çalışır, bu yüzden bir dosya indirmeyi tetiklemek küçük bir JavaScript köprüsü gerektirir. Klasörünüzde wwwroot adlı bir dosya ekleyin excelExport.js:

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

Bu scripti _Host.cshtml dosyanıza ekleyin (veya .NET 8+ için App.razor):

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

Bu işlev Blazor'dan bayt akışını geçici bir blob URL'sine dönüştürür, tarayıcı indirmeyi tetikler, ardından bellek sızıntılarını önlemek için URL nesnesini temizler. Kasıtlı olarak minimaldir - zor iş sunucuda C# ile gerçekleşir.

Şimdi IronXL ile başlayın.
green arrow pointer

C# İçinde Bir Excel İhracat Servisi Nasıl Oluşturulur?

Excel oluşturmayı Razor bileşenlerinden ayırmak, kodu birden çok sayfada yeniden kullanılabilir ve test edilebilir hale getirir. Aşağıdaki model, IronXL'yi özel bir hizmet sınıfı içine sarar.

ExcelExportService'i Oluşturma

Yeni bir dosya oluşturun Services/ExcelExportService.cs:

using IronXL;
using System.IO;
using ExportExcel.Models;

public class ExcelExportService
{
    public byte[] GenerateSalesReport(List<SalesData> salesData)
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        workbook.Metadata.Author = "Sales Department";

        var worksheet = workbook.CreateWorkSheet("Monthly Sales");

        // Add column headers
        worksheet["A1"].Value = "Date";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Quantity";
        worksheet["D1"].Value = "Revenue";
        worksheet["E1"].Value = "Profit Margin";

        // Style the header row
        var headerRange = worksheet["A1:E1"];
        headerRange.Style.Font.Bold = true;
        headerRange.Style.BackgroundColor = "#4472C4";
        headerRange.Style.Font.Color = "#FFFFFF";

        // Populate data rows
        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();
    }
}
using IronXL;
using System.IO;
using ExportExcel.Models;

public class ExcelExportService
{
    public byte[] GenerateSalesReport(List<SalesData> salesData)
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        workbook.Metadata.Author = "Sales Department";

        var worksheet = workbook.CreateWorkSheet("Monthly Sales");

        // Add column headers
        worksheet["A1"].Value = "Date";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Quantity";
        worksheet["D1"].Value = "Revenue";
        worksheet["E1"].Value = "Profit Margin";

        // Style the header row
        var headerRange = worksheet["A1:E1"];
        headerRange.Style.Font.Bold = true;
        headerRange.Style.BackgroundColor = "#4472C4";
        headerRange.Style.Font.Color = "#FFFFFF";

        // Populate data rows
        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();
    }
}
Imports IronXL
Imports System.IO
Imports ExportExcel.Models

Public Class ExcelExportService
    Public Function GenerateSalesReport(salesData As List(Of SalesData)) As Byte()
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        workbook.Metadata.Author = "Sales Department"

        Dim worksheet = workbook.CreateWorkSheet("Monthly Sales")

        ' Add column headers
        worksheet("A1").Value = "Date"
        worksheet("B1").Value = "Product"
        worksheet("C1").Value = "Quantity"
        worksheet("D1").Value = "Revenue"
        worksheet("E1").Value = "Profit Margin"

        ' Style the header row
        Dim headerRange = worksheet("A1:E1")
        headerRange.Style.Font.Bold = True
        headerRange.Style.BackgroundColor = "#4472C4"
        headerRange.Style.Font.Color = "#FFFFFF"

        ' Populate data rows
        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
    End Function
End Class
$vbLabelText   $csharpLabel

Hizmeti Kaydetme

Hizmeti DI konteynerine ekleyin Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<ExcelExportService>();

var app = builder.Build();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<ExcelExportService>();

var app = builder.Build();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.Extensions.DependencyInjection

Dim builder = WebApplication.CreateBuilder(args)

builder.Services.AddRazorPages()
builder.Services.AddServerSideBlazor()
builder.Services.AddScoped(Of ExcelExportService)()

Dim app = builder.Build()
app.MapBlazorHub()
app.MapFallbackToPage("/_Host")
app.Run()
$vbLabelText   $csharpLabel

Bu hizmet, IronXL'in birkaç önemli becerisini gösterir. Tek bir metot çağrısı ile yeni workbooklar ve worksheetler oluşturabilirsiniz, stilize edilmiş başlıklar uygulayabilir, herhangi bir veri kaynağından satırları doldurabilir ve =D2*0.15 gibi Excel formülleri gömebilirsiniz. AutoSizeColumn çağrısı, sütunların içeriklerini doğru bir şekilde gösterecek kadar geniş olmasını sağlar, veri uzunluğuna bakılmaksızın. Daha fazla biçimlendirme seçenekleri için, hücre stil rehberine bakın.

Bir Blazor Bileşeninden Excel İndirmeyi Tetikleme Nasıl Yapılır?

Hizmet hazır olduğunda, bunu çağırarak ve oluşan baytları tarayıcıya ileterek bir Razor bileşeni yazmanız gerekir.

Razor Bileşeni Yazma

Şurada bir sayfa oluşturun Pages/ExcelExportDashboard.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)
        {
            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 }
        };
    }
}
@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)
        {
            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 }
        };
    }
}
Imports ExportExcel.Models
Imports Microsoft.JSInterop

@page "/excel-export"

@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 = ""

            Dim salesData = GetSalesData()
            Dim fileBytes = ExcelService.GenerateSalesReport(salesData)

            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."
        Finally
            isExporting = False
        End Try
    End Function

    Private Function GetSalesData() As List(Of SalesData)
        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

Bileşenin Ne Yaptığı

isExporting bayrağı, düğmeyi oluşturma sırasında devre dışı bırakır ve yinelenen taleplerin önlenmesini sağlar. DotNetStreamReference wrapper, .NET bellek akışından JavaScript fonksiyonuna verimli ikili akış sağlar -- bu şekilde büyük base64 dizilerinden kaçınılarak yük boyutunu şişirmez. SalesReport_20260228.xlsx gibi zaman damgalı dosya adları, indirilen dosyaları ek bir yapılandırma olmadan düzenli tutar.

Tarayıcıda /excel-export'a yönlendiğinizde, bir dışa aktarma düğmesiyle kontrol paneli sayfası yüklenir:

Blazor Excel'e Aktarma: IronXL ile C# Kullanarak Tam Rehber: Resim 1 - Örnek Blazor sayfası

Düğmeye tıklamak, elektronik tabloyu oluşturur ve tarayıcı dosyayı otomatik olarak indirir:

Blazor Excel'e Aktarma: IronXL ile C# Kullanarak Tam Rehber: Resim 2 - Excel dosyasına aktarılan veri

Excel İhracatlarına Hangi Gelişmiş Biçimlendirmeleri Uygulayabilirsiniz?

Temel veri ihracatları birçok kullanım durumu için yeterlidir, ancak üretim uygulamaları sıklıkla koşullu biçimlendirme, çoklu çalışma sayfaları veya veri doğrulaması gerektirir. IronXL tüm bunları doğal olarak destekler.

Envanter Raporları için Koşullu Biçimlendirme

Aşağıdaki hizmet, düşük stoklu öğeleri kırmızı ile vurgular -- depo veya envanter yönetimi uygulamaları için yaygın bir gereksinimdir:

using IronXL;
using ExportExcel.Models;
using System.IO;

public class InventoryExportService
{
    public byte[] GenerateInventoryReport(List<InventoryItem> items)
    {
        var workbook = WorkBook.Create();
        var details = workbook.CreateWorkSheet("Inventory Details");

        // Column headers
        details["A1"].Value = "SKU";
        details["B1"].Value = "Name";
        details["C1"].Value = "Quantity";
        details["D1"].Value = "Reorder Level";
        details["E1"].Value = "Status";

        var headerRange = details["A1:E1"];
        headerRange.Style.Font.Bold = true;
        headerRange.Style.BackgroundColor = "#2E75B6";
        headerRange.Style.Font.Color = "#FFFFFF";

        for (int i = 0; i < items.Count; i++)
        {
            int 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;
            details[$"D{row}"].Value = item.ReorderLevel;
            details[$"E{row}"].Value = item.Quantity < item.ReorderLevel
                ? "Reorder Required"
                : "OK";

            if (item.Quantity < item.ReorderLevel)
            {
                // Highlight the entire row for low-stock items
                details[$"A{row}:E{row}"].Style.BackgroundColor = "#FFB6B6";
                details[$"C{row}"].Style.Font.Bold = true;
            }
        }

        details.AutoSizeColumn(0, true);
        details.AutoSizeColumn(1, true);

        using var stream = workbook.ToStream();
        return stream.ToArray();
    }
}
using IronXL;
using ExportExcel.Models;
using System.IO;

public class InventoryExportService
{
    public byte[] GenerateInventoryReport(List<InventoryItem> items)
    {
        var workbook = WorkBook.Create();
        var details = workbook.CreateWorkSheet("Inventory Details");

        // Column headers
        details["A1"].Value = "SKU";
        details["B1"].Value = "Name";
        details["C1"].Value = "Quantity";
        details["D1"].Value = "Reorder Level";
        details["E1"].Value = "Status";

        var headerRange = details["A1:E1"];
        headerRange.Style.Font.Bold = true;
        headerRange.Style.BackgroundColor = "#2E75B6";
        headerRange.Style.Font.Color = "#FFFFFF";

        for (int i = 0; i < items.Count; i++)
        {
            int 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;
            details[$"D{row}"].Value = item.ReorderLevel;
            details[$"E{row}"].Value = item.Quantity < item.ReorderLevel
                ? "Reorder Required"
                : "OK";

            if (item.Quantity < item.ReorderLevel)
            {
                // Highlight the entire row for low-stock items
                details[$"A{row}:E{row}"].Style.BackgroundColor = "#FFB6B6";
                details[$"C{row}"].Style.Font.Bold = true;
            }
        }

        details.AutoSizeColumn(0, true);
        details.AutoSizeColumn(1, true);

        using var stream = workbook.ToStream();
        return stream.ToArray();
    }
}
Imports IronXL
Imports ExportExcel.Models
Imports System.IO

Public Class InventoryExportService
    Public Function GenerateInventoryReport(items As List(Of InventoryItem)) As Byte()
        Dim workbook = WorkBook.Create()
        Dim details = workbook.CreateWorkSheet("Inventory Details")

        ' Column headers
        details("A1").Value = "SKU"
        details("B1").Value = "Name"
        details("C1").Value = "Quantity"
        details("D1").Value = "Reorder Level"
        details("E1").Value = "Status"

        Dim headerRange = details("A1:E1")
        headerRange.Style.Font.Bold = True
        headerRange.Style.BackgroundColor = "#2E75B6"
        headerRange.Style.Font.Color = "#FFFFFF"

        For i As Integer = 0 To items.Count - 1
            Dim row As Integer = i + 2
            Dim item = items(i)

            details($"A{row}").Value = item.SKU
            details($"B{row}").Value = item.Name
            details($"C{row}").Value = item.Quantity
            details($"D{row}").Value = item.ReorderLevel
            details($"E{row}").Value = If(item.Quantity < item.ReorderLevel, "Reorder Required", "OK")

            If item.Quantity < item.ReorderLevel Then
                ' Highlight the entire row for low-stock items
                details($"A{row}:E{row}").Style.BackgroundColor = "#FFB6B6"
                details($"C{row}").Style.Font.Bold = True
            End If
        Next

        details.AutoSizeColumn(0, True)
        details.AutoSizeColumn(1, True)

        Using stream = workbook.ToStream()
            Return stream.ToArray()
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

IronXL, hücre bazında biçimlendirmeyi oluşturma zamanında veri değerlerine göre uygular. Ayrıca koşullu biçimlendirme kuralları beyan edebilir veya aynı kitapta çoklu çalışma sayfalarını yönetebilirsiniz -- örneğin, bir sayfa mevcut stok için ve diğeri geçmiş siparişler için.

Tek Bir İhracata Çoklu Çalışma Sayfaları Ekleme

Verileri mantıklı sayfalara ayırmak, ayrı indirme gerektirmeden okunabilirliği arttırır:

public byte[] GenerateMultiSheetReport(
    List<SalesData> sales,
    List<InventoryItem> inventory)
{
    var workbook = WorkBook.Create(ExcelFileFormat.XLSX);

    // Sheet 1 -- Sales summary
    var salesSheet = workbook.CreateWorkSheet("Sales");
    salesSheet["A1"].Value = "Date";
    salesSheet["B1"].Value = "Revenue";
    salesSheet["A1:B1"].Style.Font.Bold = true;

    for (int i = 0; i < sales.Count; i++)
    {
        salesSheet[$"A{i + 2}"].Value = sales[i].Date.ToString("yyyy-MM-dd");
        salesSheet[$"B{i + 2}"].Value = sales[i].Revenue;
    }

    // Sheet 2 -- Inventory snapshot
    var invSheet = workbook.CreateWorkSheet("Inventory");
    invSheet["A1"].Value = "SKU";
    invSheet["B1"].Value = "Name";
    invSheet["C1"].Value = "Quantity";
    invSheet["A1:C1"].Style.Font.Bold = true;

    for (int i = 0; i < inventory.Count; i++)
    {
        invSheet[$"A{i + 2}"].Value = inventory[i].SKU;
        invSheet[$"B{i + 2}"].Value = inventory[i].Name;
        invSheet[$"C{i + 2}"].Value = inventory[i].Quantity;
    }

    using var stream = workbook.ToStream();
    return stream.ToArray();
}
public byte[] GenerateMultiSheetReport(
    List<SalesData> sales,
    List<InventoryItem> inventory)
{
    var workbook = WorkBook.Create(ExcelFileFormat.XLSX);

    // Sheet 1 -- Sales summary
    var salesSheet = workbook.CreateWorkSheet("Sales");
    salesSheet["A1"].Value = "Date";
    salesSheet["B1"].Value = "Revenue";
    salesSheet["A1:B1"].Style.Font.Bold = true;

    for (int i = 0; i < sales.Count; i++)
    {
        salesSheet[$"A{i + 2}"].Value = sales[i].Date.ToString("yyyy-MM-dd");
        salesSheet[$"B{i + 2}"].Value = sales[i].Revenue;
    }

    // Sheet 2 -- Inventory snapshot
    var invSheet = workbook.CreateWorkSheet("Inventory");
    invSheet["A1"].Value = "SKU";
    invSheet["B1"].Value = "Name";
    invSheet["C1"].Value = "Quantity";
    invSheet["A1:C1"].Style.Font.Bold = true;

    for (int i = 0; i < inventory.Count; i++)
    {
        invSheet[$"A{i + 2}"].Value = inventory[i].SKU;
        invSheet[$"B{i + 2}"].Value = inventory[i].Name;
        invSheet[$"C{i + 2}"].Value = inventory[i].Quantity;
    }

    using var stream = workbook.ToStream();
    return stream.ToArray();
}
Public Function GenerateMultiSheetReport( _
    sales As List(Of SalesData), _
    inventory As List(Of InventoryItem)) As Byte()

    Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)

    ' Sheet 1 -- Sales summary
    Dim salesSheet = workbook.CreateWorkSheet("Sales")
    salesSheet("A1").Value = "Date"
    salesSheet("B1").Value = "Revenue"
    salesSheet("A1:B1").Style.Font.Bold = True

    For i As Integer = 0 To sales.Count - 1
        salesSheet($"A{i + 2}").Value = sales(i).Date.ToString("yyyy-MM-dd")
        salesSheet($"B{i + 2}").Value = sales(i).Revenue
    Next

    ' Sheet 2 -- Inventory snapshot
    Dim invSheet = workbook.CreateWorkSheet("Inventory")
    invSheet("A1").Value = "SKU"
    invSheet("B1").Value = "Name"
    invSheet("C1").Value = "Quantity"
    invSheet("A1:C1").Style.Font.Bold = True

    For i As Integer = 0 To inventory.Count - 1
        invSheet($"A{i + 2}").Value = inventory(i).SKU
        invSheet($"B{i + 2}").Value = inventory(i).Name
        invSheet($"C{i + 2}").Value = inventory(i).Quantity
    Next

    Using stream = workbook.ToStream()
        Return stream.ToArray()
    End Using
End Function
$vbLabelText   $csharpLabel

Defter özelliklerini, aralık işlemlerini ve grafik desteğini kapsayan tam API referansı için IronXL API belgelerine bakın.

Blazor Excel'e Aktarma: IronXL ile C# Kullanarak Tam Rehber: Resim 3 - Gelişmiş özellikler örnek çıktısı

Hataları ve Büyük Veri Kümelerini Etkin Bir Şekilde Nasıl Yönetebilirsiniz?

Excel ihracat işlemleri, veri kümeleri büyük olduğunda sessizce başarısız olabilir veya performansı düşebilir. Aşağıdaki modeller her iki endişeyi de ele alır.

Servis Katmanında Hata Yönetimi

Oluşturma mantığını bileşen yerine servis içinde sarmalamak, tüm çağrıcılar arasında hata yönetimini tutarlı kılar. Önerilen model, IronXL istisnalarının yayılmasını sağlamaktır, ardından başarısız olan hangi raporla ilgili bağlamla bir alan özgü istisna içinde yeniden sarmalamaktır:

try/catch bloğunu workbook oluşturmanın etrafında koyun GenerateSalesReport, Exception yakalayın ve InvalidOperationException("Failed to generate sales report", ex) olarak yeniden fırlatın. Blazor bileşeninde InvalidOperationException yakalayın ve iç detayları açığa vurmadan kullanıcı dostu bir mesaj gösterin. Hizmet yapıcısına enjekte edilen ILogger<t> kullanarak iç istisnayı kaydedin, böylece geliştirme ekibi hataları belirli bir workbook operasyonuna kadar izleyebilir. Son kullanıcılara ham istisna mesajlarını asla yüzeye çıkarmayın -- dosya yolları, bellek adresleri veya yığın izleri sunucu iç mekanını gösterebilir.

Blazor'da yapılandırılmış hata kaydını motive etmek için resmi Microsoft belgelerindeki hata yönetimi en iyi uygulamalarına göz atın. .NET'te test edilebilir hizmetler oluşturma konusunda daha fazla rehber için, Microsoft bağımlık enjeksiyonu belgesi burada kullanılan ExcelExportService ile tam olarak aynı deseni açıklıyor.

Büyük Veri Kümeleri için Performans Düşünceleri

Birkaç bin satırı aşan veri kümeleri için şu yaklaşımları göz önünde bulundurmalısınız:

Excel İhracat Performans Stratejileri
Strateji Ne Zaman Kullanılır IronXL Desteği
Yanıta doğrudan akış Files >10 MB workbook.ToStream()
Verileri ihracattan önce sayfalara bölün Filtrelerle sürülen UI ihracatları Çalışma kitabını oluşturmadan önce hizmette uygula
Arka plan işi + indirme bağlantısı Reports taking >5 seconds SignalR veya anketle birleştirin
Büyük sayfalarda AutoSizeColumn'u devre dışı bırakın Sheets with >500 rows Bunun yerine sabit sütun genişlikleri ayarlayın

IronXL's ToStream() metodu, önce tüm dosyayı bir bayt dizisine yüklemeden doğrudan bir çıktı akışına yazar, bu da büyük workbooklar için bellek kullanımını daha düşük tutar. Ek performans kılavuzu için, IronXL ile büyük Excel dosyalarını okuma ve yazma konularına bakın.

IronXL Başka Hangi Excel Özelliklerini Destekliyor?

Temel ihracatın ötesinde, IronXL gerçek dünyadaki raporlama gereksinimlerini kapsayan geniş bir Excel özellikleri yelpazesi sunar.

Formüller, İsimlendirilmiş Aralıklar ve Sayı Biçimlendirme

Herhangi bir Excel formülünü doğrudan bir hücreye yazacağınızla aynı sözdizimini kullanarak yerleştirebilirsiniz. IronXL formülleri okuma zamanında değerlendirir, böylece oluşturulan dosyanın tüketicileri elektronik tabloyu açar açmaz hesaplanan sonuçları görür. İsimlendirilmiş aralıklar, zamanla formüllerin daha okunabilir ve sürdürülebilir olmasını sağlar:

// Aggregate formulas on a summary row
worksheet["E2"].Value = "=SUM(D2:D100)";
worksheet["F2"].Value = "=AVERAGE(C2:C100)";
worksheet["G2"].Value = "=COUNTIF(B2:B100,\"Widget A\")";

// Named ranges improve formula readability
worksheet["D2:D100"].Name = "RevenueColumn";
worksheet["E2"].Value = "=SUM(RevenueColumn)";

// Number and date formatting prevents type misinterpretation
worksheet["D2"].Value = 12345.67m;
worksheet["D2"].FormatString = "#,##0.00";
worksheet["A2"].Value = DateTime.Now;
worksheet["A2"].FormatString = "dd/MM/yyyy";
// Aggregate formulas on a summary row
worksheet["E2"].Value = "=SUM(D2:D100)";
worksheet["F2"].Value = "=AVERAGE(C2:C100)";
worksheet["G2"].Value = "=COUNTIF(B2:B100,\"Widget A\")";

// Named ranges improve formula readability
worksheet["D2:D100"].Name = "RevenueColumn";
worksheet["E2"].Value = "=SUM(RevenueColumn)";

// Number and date formatting prevents type misinterpretation
worksheet["D2"].Value = 12345.67m;
worksheet["D2"].FormatString = "#,##0.00";
worksheet["A2"].Value = DateTime.Now;
worksheet["A2"].FormatString = "dd/MM/yyyy";
' Aggregate formulas on a summary row
worksheet("E2").Value = "=SUM(D2:D100)"
worksheet("F2").Value = "=AVERAGE(C2:C100)"
worksheet("G2").Value = "=COUNTIF(B2:B100,""Widget A"")"

' Named ranges improve formula readability
worksheet("D2:D100").Name = "RevenueColumn"
worksheet("E2").Value = "=SUM(RevenueColumn)"

' Number and date formatting prevents type misinterpretation
worksheet("D2").Value = 12345.67D
worksheet("D2").FormatString = "#,##0.00"
worksheet("A2").Value = DateTime.Now
worksheet("A2").FormatString = "dd/MM/yyyy"
$vbLabelText   $csharpLabel

Adlandırılmış aralıkları tanımlamak ve sayı formatını açıkça ayarlamak için IronXL, ikisini de aralık nesnesinde özellikler olarak sunar. Bu, Excel'in para birimi değerlerini düz metin olarak işlememesini engeller -- verilerin dizgi olarak saklandığı veritabanlarından finansal verileri ihraç ederken yaygın bir sorundur.

Desteklenen Excel Dosya Formatları

IronXL, .xlsx, .xls, .csv ve .tsv dahil olmak üzere birden çok Excel formatını okuyabilir ve yazabilir. Format kaydetme zamanında belirlenir, bu nedenle aynı hizmet sınıfı küçük bir parametre değişikliği ile hem Excel hem de CSV ihracatlarını destekleyebilir:

// Export as CSV for systems that consume flat files
workbook.SaveAs("report.csv");

// Or stream as CSV for download
using var ms = workbook.ToStream(ExcelFileFormat.CSV);
// Export as CSV for systems that consume flat files
workbook.SaveAs("report.csv");

// Or stream as CSV for download
using var ms = workbook.ToStream(ExcelFileFormat.CSV);
' Export as CSV for systems that consume flat files
workbook.SaveAs("report.csv")

' Or stream as CSV for download
Using ms As Stream = workbook.ToStream(ExcelFileFormat.CSV)
End Using
$vbLabelText   $csharpLabel

Bu esneklik, ERP platformları veya veri depoları gibi ardışık sistemlerin belirli bir dosya formatı beklediği entegrasyonlarda önemlidir. IronXL ve diğer Excel kütüphaneleri arasında tam özellik karşılaştırması için IronXL özellikler sayfasına bakın.

Microsoft, debugging sırasında .xlsx dosyalarının iç yapısını anlamanız gerektiğinde OOXML dosya formatlarını anlama için iyi bir referans sağlar. IronXL için NuGet paketi ayrıca NuGet.org üzerinde tam sürüm geçmişi ve uyumluluk notlarıyla listelenmiştir.

Blazor Projeleri İçin IronXL Nasıl Başlanır?

IronXL, herhangi bir zaman sınırlaması olmadan test ve yapı üretmeye izin veren ücretsiz bir geliştirme lisansı altında mevcuttur. Üretim uygulamaları için, bir dağıtım lisansı gereklidir.

NuGet üzerinden doğrudan ücretsiz bir deneme sürümü indir -- başlamak için kayıt gerekmez. Dağıtıma hazır olduğunuzda, uygulamanın ölçeğine uyan planı bulmak için IronXL lisanslama seçeneklerini gözden geçirin.

IronXL, tüm büyük .NET uygulama türlerinde çalışır -- Blazor Server, Blazor WebAssembly (sunucu işleme), ASP.NET Core MVC, konsol uygulamaları, ve Windows masaüstü uygulamaları. Kütüphane, .NET Framework 4.6.2'den .NET 10'a kadar desteklenen her bir .NET sürümü ile uyumlu olan .NET Standard 2.0'ı hedefler. Projenin ayrıca PDF oluşturma gerektirmesi durumunda, IronPDF IronXL ile yan yana entegre edilir, herhangi bir çakışma olmaksızın aynı servis katmanından Excel veya PDF olarak veri ihraç etmenize olanak tanır.

Daha fazla Blazor'a özgü örnek keşfetmek için, Blazor Excel ihracat eğitimine ve ASP.NET Core ihracat kılavuzuna bakın. Mevcut elektronik tabloları okumak için, C# Excel okuyucu eğitimi yaygın ithalat senaryolarını kapsar. Ayrıca, programlama yerine şablonlardan dosyalar oluşturması gereken projeler için sıfırdan yeni bir Excel defteri oluşturmayı gözden geçirebilirsiniz.

Sıkça Sorulan Sorular

Blazor Server uygulamalarında Excel'e veri nasıl aktarılır?

Blazor Server uygulamalarında verilere Excel'e aktarmak için IronXL kullanabilirsiniz. IronXL, Microsoft Office'e ihtiyaç duymadan, doğrudan sunucudan Excel dosyaları oluşturmanıza, biçimlendirmenize ve indirmenize olanak tanır.

Blazor'da IronXL kullanmak için Microsoft Office kurulu mu olmalı?

Hayır, Microsoft Office yüklü olması gerekmez. IronXL, Microsoft Office'ten bağımsız olarak Blazor Sunucu uygulamalarında Excel dosyalarını ele almanızı sağlar.

Blazor uygulamalarında IronXL kullanarak Excel dosyalarını biçimlendirebilir miyim?

Evet, IronXL, verilerinizin görünümünü Blazor Server uygulamanızdan doğrudan özelleştirmenizi sağlayarak Excel dosyalarını biçimlendirmeyi sağlar.

IronXL, Blazor Sunucu uygulamaları ile uyumlu mu?

Evet, IronXL, Blazor Sunucu uygulamalarıyla sorunsuz bir şekilde entegre olarak Excel dosyalarının kolayca aktarılmasını ve işlenmesini sağlar.

IronXL, Blazor uygulamalarında Excel aktarımı için ne gibi faydalar sağlar?

IronXL, Office gerektirmeden Excel dosyaları oluşturmayı ve manipüle etmeyi kolay bir şekilde sunarak Blazor uygulamalarında veri aktarımı için verimli bir çözüm sunar.

IronXL, Blazor Server uygulamalarında büyük Excel dosyalarını işleyebilir mi?

Evet, IronXL, Blazor Sunucu uygulamaları içinde büyük Excel dosyalarını verimli bir şekilde işlemek için tasarlanmıştır.

Blazor uygulamalarında IronXL ile hangi tür Excel dosyalarını oluşturabilirim?

IronXL ile Blazor uygulamanızda XLSX, XLS ve CSV dahil olmak üzere çeşitli Excel dosya türlerini oluşturabilirsiniz.

Blazor Sunucu uygulamalarından IronXL kullanarak Excel dosyalarını indirmek mümkün mü?

Evet, IronXL, son kullanıcılar için kesintisiz bir deneyim sağlayarak Blazor Sunucu uygulamasından doğrudan Excel dosyalarını indirmeyi destekler.

IronXL, Blazor'da diğer çözümlere kıyasla Excel aktarım işlevselliğini nasıl geliştirir?

IronXL, Microsoft Office ihtiyacını ortadan kaldırarak Blazor'daki Excel dosyalarını aktarma sürecini kolaylaştırır ve sunucu uygulamanızla doğrudan entegre olur.

IronXL, Blazor geliştiricileri için neden iyi bir seçimdir?

IronXL, güçlü Excel işleme yetenekleri sunduğundan, Office kurulumu gerektirmediğinden ve Blazor Sunucu uygulamalarına kolayca entegre olduğundan Blazor geliştiricileri için iyi bir seçimdir.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara