BlazorでIronXLを使用してExcelにエクスポートする方法
Excelにデータをエクスポートすることは、レポートの作成、在庫リストの作成、顧客の請求書の作成など、ほぼすべてのWebアプリが必要とするものです。 Blazor Serverアプリケーションでは、Microsoft Officeを必要とせずにこれを確実に達成することが難しい場合があります。 そこでIronXLが役立ちます。 サーバーから直接Excelファイルを作成、フォーマット、ダウンロードでき、Officeのインストールが不要で、Blazorとシームレスに統合されます。 このガイドでは、アプリにプロフェッショナルなExcelエクスポート機能を追加するのがいかに簡単かを見ていきます。さあ、始めましょう。
ExcelへのデータエクスポートのためのIronXLの始め方
Blazor ServerアプリケーションでIronXLを設定するには、最小限の設定が必要です。 まず、Visual Studio 2022以降で新しいBlazor Serverプロジェクトを作成し、.NET 6以上をターゲットにします。
NuGetパッケージマネージャーコンソールを通じてIronXLをインストールします(代替方法については完全なインストールガイドを参照してください):
Install-Package IronXL.Excel
次に、ファイルダウンロード用JavaScriptヘルパー関数を作成します。 wwwrootフォルダーに、新しいJavaScriptファイル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);
}
_Host.cshtmlファイルにこのスクリプトを含めます:
<script src="~/excelExport.js"></script>
<script src="~/excelExport.js"></script>
この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
このサービスは、新しいワークブックとワークシートの作成、フォーマットされたヘッダーの追加、データソースからのインポートデータでデータ行を埋めること、数式の適用、および潜在的なエラーの処理を含む、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
}
このコンポーネントは、エクスポート中にユーザーにフィードバックを提供し、エラーを優雅に処理し、タイムスタンプ付きのファイル名を生成します。 DotNetStreamReferenceラッパーは、JavaScriptへのバイナリデータの効率的なストリーミングを可能にします。
出力
コードを実行すると、エクスポート処理を行うためのボタンでページが読み込まれるのがわかります。

ボタンをクリックすると、新しい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
IronXLは複数のワークシートを容易に処理し、ビジネスルールに基づいた条件付きフォーマットを適用し、必要に応じてピボットテーブルやチャートなどの高度なExcel機能をサポートします。 詳細なAPIドキュメントについては、包括的なリファレンスガイドをご覧ください。

結論
IronXLは、Blazor ServerアプリケーションでのExcelファイル生成を、複雑な課題から単純なタスクに変えます。 その直感的なAPIは、Microsoft Officeのインストールの必要性を排除し、高度なExcel機能へのアクセスを提供します。 シンプルなデータエクスポートから数式やフォーマットを含む複雑なマルチシートレポートまで、IronXLは優れたパフォーマンスと信頼性でそれらをすべて処理します。
プロフェッショナルなExcelエクスポート機能でBlazorアプリケーションを強化する準備はできましたか? 本番展開のための無料トライアルを開始しましょう。
よくある質問
Blazor ServerアプリでExcelファイルをエクスポートするにはどうすればよいですか?
IronXLを使用すると、Microsoft Officeを必要とせずにサーバーから直接Excelファイルを作成、フォーマット、ダウンロードすることができます。
BlazorでExcelファイルを操作するのにMicrosoft Officeは必要ですか?
いいえ、IronXLはMicrosoft Officeを必要とせずにExcelファイルを操作することができます。それは、あなたのBlazorアプリケーション内で直接Excelファイルを作成し操作する機能を提供します。
BlazorでのExcelエクスポートにIronXLを使用する利点は何ですか?
IronXLはBlazorとシームレスに統合されており、Excelファイルの作成、フォーマット、エクスポートを容易にします。プロセスを簡略化し、Microsoft Officeの必要性を排除し、さまざまなExcel形式をサポートします。
はい、IronXLはExcelファイルをフォーマットする機能を豊富に提供します。
はい、IronXLはBlazorコンポーネントとシームレスに統合でき、簡単にアプリケーションにExcelエクスポート機能を追加できます。
BlazorでIronXLを使用してExcelファイルをフォーマットすることは可能ですか?
はい、IronXLはExcelファイルのフォーマットに豊富な機能を提供します。
BlazorでのExcelエクスポートで大規模なデータセットをどのように処理しますか?
IronXLは大規模データセットを効率的に処理するように設計されており、Blazor Server環境での広範なデータのエクスポート時にスムーズなパフォーマンスを保証します。
IronXLがサポートするExcelファイル形式は何ですか?
IronXLは、BlazorアプリケーションでのExcelデータのエクスポートおよび操作に柔軟性を持たせるために、XLS、XLSX、およびCSVを含むさまざまなExcelファイル形式をサポートしています。
IronXLはBlazorでのレポート生成に使用できますか?
もちろん、IronXLはBlazorアプリで詳細なレポート生成に最適です。
IronXLはExcelファイルをエクスポートする際にどのようにデータの整合性を保証しますか?
IronXLは、データの構造とフォーマットを正確に保持してデータの整合性を保証し、Blazorアプリケーションにとって信頼できるソリューションとなります。
IronXLを使用してBlazor ServerアプリでExcelファイルの作成を自動化する方法はありますか?
はい、IronXLを使用してBlazor ServerアプリでExcelファイルの作成とエクスポートを自動化することができ、ワークフローを合理化し効率を向上させます。



