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);
}
Bu scripti _Host.cshtml dosyanıza ekleyin (veya .NET 8+ için App.razor):
<script src="~/excelExport.js"></script>
<script src="~/excelExport.js"></script>
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.
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
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()
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
}
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:

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

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
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
Defter özelliklerini, aralık işlemlerini ve grafik desteğini kapsayan tam API referansı için IronXL API belgelerine bakın.

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:
| 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"
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
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.




