IRONXLの使用

BlazorでCSVにエクスポートする方法

リーガン・パン
リーガン・パン
2023年5月23日
更新済み 2024年3月31日
共有:

今日は、BlazorとIronXLを使用してExcelファイルをCSV形式に変換する方法について説明します。 このチュートリアルの終わりまでには、ExcelデータをCSVなど様々な形式でエクスポートする基本的なBlazorアプリケーションを作成できるようになります。

IronXLの紹介

IronXLは強力な.NET Excelライブラリであり、XLS、XLSX、XLSM、XLTX、CSVを含む幅広い形式でExcelファイルを操作するために設計されています。Microsoft OfficeやExcel Interopを必要とせずに、開発者がプログラムでExcelデータを読み取り、書き込み、操作することを可能にします。

IronXLを使用すると、Excelワークブックを作成、ロード、および保存できるほか、個々のセルまたは範囲にデータの読み書きも可能です。 また、高度な機能として、書式設定数式グラフ、およびピボットテーブルをサポートしています。 IronXLはさまざまな.NETフレームワークと互換性があり、C#やVB.NETのような人気の言語で使用できます。

ExcelファイルをCSVに変換する手順

Blazorプロジェクトの設定

まず、Blazor Serverプロジェクトを新規作成する必要があります。 Visual Studioを開き、新しいプロジェクトを作成し、「Blazor Server App」テンプレートを選択してください。 プロジェクトに名前を付け、「作成」をクリックしてください。

プロジェクトが作成されたら、Pages フォルダーを開き、Index.razor ファイルを見つけます。ここで Blazor コンポーネントが追加され、ファイルのアップロードと変換を処理するためにコーディングされます。

IronXLのインストール

コードの記述を始める前に、IronXLライブラリをインストールする必要があります。 Visual Studioでパッケージ マネージャー コンソールを開き、次のコマンドを実行してください。

Install-Package IronXL.Excel

このコマンドは、BlazorプロジェクトにIronXLライブラリをインストールします。 これでコードの記述を始める準備が整いました!

ファイルアップロードコンポーネントの作成

まず、ユーザーが既存のExcelファイルをアップロードできる基本的なファイルアップロードコンポーネントを作成します。次に、Microsoft.AspNetCore.Components.Forms 名前空間から InputFile コンポーネントが追加されます。 Index.razor ファイルの、"@page "/" 行の下に次のコードを追加してください。

@using Microsoft.AspNetCore.Components.Forms
@using IronXL
@using System.IO
@using System.Threading.Tasks

<div class="container">
    <h3>File Upload</h3>

    <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" />
    <h3>Selected File: @originalFileName</h3>
    <h3 style="color:bisque">Is File converted: <span>@message</span></h3>
</div>
@using Microsoft.AspNetCore.Components.Forms
@using IronXL
@using System.IO
@using System.Threading.Tasks

<div class="container">
    <h3>File Upload</h3>

    <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" />
    <h3>Selected File: @originalFileName</h3>
    <h3 style="color:bisque">Is File converted: <span>@message</span></h3>
</div>
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'@using Microsoft.AspNetCore.Components.Forms @using IronXL @using System.IO @using System.Threading.Tasks <div class="container"> <h3> File Upload</h3> <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" /> <h3> Selected File: @originalFileName</h3> <h3 style="color:bisque"> @Is File converted: <span> @message</span></h3> </div>
$vbLabelText   $csharpLabel

このコードは、ファイルアップロードコンポーネントを設定し、ボタンとファイル変換のステータスを表示するメッセージ領域を含んでいます。 InputFileコンポーネントのaccept属性は、受け入れるファイル形式を指定します。

ファイル変換コードの記述

それでは、ファイルのアップロードと変換を処理するコードを書きましょう。 このタスクを達成するために、IronXL、Blazor、及びC#の組み合わせが使用されます。 IronXL を使用してCSV を Excel ファイルに変換できます。

次のコードをIndex.razorファイルに追加します。先ほど追加したdiv要素の下に配置してください。

@code {
    private string originalFileName;
    private string message = "";

    private async Task OnInputFileChange(InputFileChangeEventArgs e)
    {
        var file = e.File;
        originalFileName = file.Name;

        try
        {
            // Read the uploaded file into a memory stream
            using var memoryStream = new MemoryStream();
            await file.OpenReadStream().CopyToAsync(memoryStream);

            // Load the workbook using IronXL
            WorkBook workBook = WorkBook.Load(memoryStream);

            // Save the workbook as a CSV file
            string outputPath = "sample.csv";
            workBook.SaveAsCsv(outputPath);

            message = "Conversion completed!";
        }
        catch (Exception ex)
        {
            message = $"An error occurred: {ex.Message}";
        }
    }
}
@code {
    private string originalFileName;
    private string message = "";

    private async Task OnInputFileChange(InputFileChangeEventArgs e)
    {
        var file = e.File;
        originalFileName = file.Name;

        try
        {
            // Read the uploaded file into a memory stream
            using var memoryStream = new MemoryStream();
            await file.OpenReadStream().CopyToAsync(memoryStream);

            // Load the workbook using IronXL
            WorkBook workBook = WorkBook.Load(memoryStream);

            // Save the workbook as a CSV file
            string outputPath = "sample.csv";
            workBook.SaveAsCsv(outputPath);

            message = "Conversion completed!";
        }
        catch (Exception ex)
        {
            message = $"An error occurred: {ex.Message}";
        }
    }
}
code
If True Then
	private String originalFileName
	private String message = ""

'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'	private async Task OnInputFileChange(InputFileChangeEventArgs e)
'	{
'		var file = e.File;
'		originalFileName = file.Name;
'
'		try
'		{
'			' Read the uploaded file into a memory stream
'			var memoryStream = New MemoryStream();
'			await file.OpenReadStream().CopyToAsync(memoryStream);
'
'			' Load the workbook using IronXL
'			WorkBook workBook = WorkBook.Load(memoryStream);
'
'			' Save the workbook as a CSV file
'			string outputPath = "sample.csv";
'			workBook.SaveAsCsv(outputPath);
'
'			message = "Conversion completed!";
'		}
'		catch (Exception ex)
'		{
'			message = string.Format("An error occurred: {0}", ex.Message);
'		}
'	}
End If
$vbLabelText   $csharpLabel

このコードは、InputFile コンポーネントを使用してExcelスプレッドシートがアップロードされたときにトリガーされる OnInputFileChange と呼ばれるプライベートメソッドを定義します。 ExcelはXLSまたはXLSX形式に対応しています。 コードはアップロードされた基本的なExcelファイルを読み取り、WorkBookオブジェクトに読み込み、その後WorkBookをCSVファイルとして保存します。変換のステータスはページのメッセージ領域に表示されます。

コードの内訳

まず、完全なコードを見てください:

@page "/"
@using Microsoft.AspNetCore.Components.Forms
@using IronXL
@using System.IO
@using System.Threading.Tasks

<style>
    body{
        background-color: skyblue
    }
    .container {
        max-width: 800px;
        margin: 0 auto;
        font-family: Arial, sans-serif;
    }

    h3 {
        margin-top: 30px;
        font-size: 30px;
        margin-bottom: 30px;
    }

    .button {
        background-color: #4CAF50;
        border: none;
        color: white;
        padding: 15px 32px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 15px 0;
        cursor: pointer;
    }
    span{
        font-size: 20px;
    }
</style>

<div class="container">
    <h3>File Upload</h3>

    <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" />
    <h3>Selected File: @originalFileName</h3>
    <h3 style="color:bisque">Is File converted: <span>@message</span></h3>
</div>

@code {
    private string originalFileName;
    private string message = "";

    private async Task OnInputFileChange(InputFileChangeEventArgs e)
    {
        var file = e.File;
        originalFileName = file.Name;

        try
        {
            // Read the uploaded file into a memory stream
            using var memoryStream = new MemoryStream();
            await file.OpenReadStream().CopyToAsync(memoryStream);

            // Load the workbook using IronXL
            WorkBook workBook = WorkBook.Load(memoryStream);

            // Save the workbook as a CSV file
            string outputPath = "sample.csv";
            workBook.SaveAsCsv(outputPath);

            message = "Conversion completed!";
        }
        catch (Exception ex)
        {
            message = $"An error occurred: {ex.Message}";
        }
    }
}
@page "/"
@using Microsoft.AspNetCore.Components.Forms
@using IronXL
@using System.IO
@using System.Threading.Tasks

<style>
    body{
        background-color: skyblue
    }
    .container {
        max-width: 800px;
        margin: 0 auto;
        font-family: Arial, sans-serif;
    }

    h3 {
        margin-top: 30px;
        font-size: 30px;
        margin-bottom: 30px;
    }

    .button {
        background-color: #4CAF50;
        border: none;
        color: white;
        padding: 15px 32px;
        text-align: center;
        text-decoration: none;
        display: inline-block;
        font-size: 16px;
        margin: 15px 0;
        cursor: pointer;
    }
    span{
        font-size: 20px;
    }
</style>

<div class="container">
    <h3>File Upload</h3>

    <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" />
    <h3>Selected File: @originalFileName</h3>
    <h3 style="color:bisque">Is File converted: <span>@message</span></h3>
</div>

@code {
    private string originalFileName;
    private string message = "";

    private async Task OnInputFileChange(InputFileChangeEventArgs e)
    {
        var file = e.File;
        originalFileName = file.Name;

        try
        {
            // Read the uploaded file into a memory stream
            using var memoryStream = new MemoryStream();
            await file.OpenReadStream().CopyToAsync(memoryStream);

            // Load the workbook using IronXL
            WorkBook workBook = WorkBook.Load(memoryStream);

            // Save the workbook as a CSV file
            string outputPath = "sample.csv";
            workBook.SaveAsCsv(outputPath);

            message = "Conversion completed!";
        }
        catch (Exception ex)
        {
            message = $"An error occurred: {ex.Message}";
        }
    }
}
page "/" [using] Microsoft.AspNetCore.Components.Forms [using] IronXL [using] System.IO [using] ReadOnly Property body() As System.Threading.Tasks(Of style)
		background-color: skyblue
End Property
	.container
	If True Then
		max-width: 800px
		margin:
		0 auto
		font-family: Arial, sans-serif
	End If

	h3
	If True Then
		margin-top: 30px
		font-size: 30px
		margin-bottom: 30px
	End If

	.button
	If True Then
		background-color: #4CAF50
		border:
		none
		color:
		white
		padding:
		15px 32px
		text-align: center
		text-decoration: none
		display:
		inline-block
		font-size: 16px
		margin:
		15px 0
		cursor:
		pointer
	End If
	span
	If True Then
		font-size: 20px
	End If
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: </style> <div class="container"> <h3> File Upload</h3> <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" /> <h3> Selected File: originalFileName</h3> <h3 style="color:bisque"> @Is File converted: <span> message</span></h3> </div> @code
".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" /> (Of h3) Selected File: originalFileName</h3> <h3 style="color:bisque"> [Is] File converted: (Of span) message</span></h3> </div> code
If True Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: </style> <div class="container"> <h3> File Upload</h3> <InputFile class="button" OnChange="@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" /> <h3> Selected File: originalFileName</h3> <h3 style
"@OnInputFileChange" accept=".xls,.xlsx,.xlsm,.xltx,.csv,.tsv" /> (Of h3) Selected File: originalFileName</h3> <h3 style
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: </style> <div class="container"> <h3> File Upload</h3> <InputFile class="button" OnChange="@OnInputFileChange" accept
"button" OnChange="@OnInputFileChange" accept
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: </style> <div class="container"> <h3> File Upload</h3> <InputFile class="button" OnChange
"container"> (Of h3) File Upload</h3> <InputFile class="button" OnChange
</style> <div class="container"> (Of h3) File Upload</h3> <InputFile class
	private String originalFileName
	private String message = ""

'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'	private async Task OnInputFileChange(InputFileChangeEventArgs e)
'	{
'		var file = e.File;
'		originalFileName = file.Name;
'
'		try
'		{
'			' Read the uploaded file into a memory stream
'			var memoryStream = New MemoryStream();
'			await file.OpenReadStream().CopyToAsync(memoryStream);
'
'			' Load the workbook using IronXL
'			WorkBook workBook = WorkBook.Load(memoryStream);
'
'			' Save the workbook as a CSV file
'			string outputPath = "sample.csv";
'			workBook.SaveAsCsv(outputPath);
'
'			message = "Conversion completed!";
'		}
'		catch (Exception ex)
'		{
'			message = string.Format("An error occurred: {0}", ex.Message);
'		}
'	}
End If
$vbLabelText   $csharpLabel

コードをさらに分解してみましょう:

  1. ファイルがアップロードされると、OnInputFileChange メソッドがトリガーされ、InputFileChangeEventArgs オブジェクトが渡されます。 このオブジェクトには、アップロードされたファイルの名前やサイズなどの情報が含まれています。

  2. 元のファイル名をページに表示するために、originalFileNameという変数に保存します。

  3. try-catchブロック内で、アップロードされたファイルの内容を読み取るために新しいMemoryStreamオブジェクトを作成します。 usingステートメントは、メモリストリームが不要になった際に適切に破棄されることを保証します。

  4. アップロードされたファイルの内容をメモリストリームに非同期でコピーするためにawaitキーワードを使用します。 これにより、ファイルを読み込んでいる間もこのアプリケーションの応答性が維持されます。

  5. 次に、WorkBook.Load メソッドを使用して、メモリ ストリームの内容を WorkBook オブジェクトに読み込みます。 このオブジェクトは、シート、セル、データを含むExcelワークブック全体を表します。

  6. 次に、変換されたCSVファイルの出力ファイル名を指定します。この場合、名前は「sample.csv」を使用します。

  7. WorkBook オブジェクトの SaveAsCsv メソッドは、指定された出力ファイル名でワークブックをCSVファイルとして保存するために使用されます。

  8. 変換が成功した場合、変換が完了したことを示すメッセージが表示されます。 エラーが発生した場合は、例外をキャッチしてエラーメッセージを表示します。

アプリケーションのテスト

Blazorアプリケーションが完成したので、テストする時が来ました! Visual Studioでアプリケーションを実行するにはF5キーを押してください。 アプリケーションが実行されたら、ページにファイルアップロードボタンが表示されるはずです。

BlazorでCSVにエクスポートする方法、図1: Blazorアプリケーションを実行する

Blazor アプリケーションを実行する

ボタンをクリックして、アップロードするExcelファイルを選択してください。 受け入れられるファイル形式は、InputFileコンポーネントのaccept属性にリストされています。

BlazorでCSVにエクスポートする方法、図2: Excelファイルを選択

Excelファイルを選択

ファイルを選択した後、アプリケーションはそのファイルを読み取り、IronXL を使用して CSV 形式に変換し、指定された出力ファイル名で変換されたファイルを保存します。 変換の状態および元のファイル名を示すメッセージが表示されるはずです。

BlazorでCSVにエクスポートする方法, 図3: 変換ステータス

変換状況

おめでとうございます! BlazorアプリケーションをIronXLを使用してExcelファイルをCSV形式でエクスポートできるように正常に構築しました。 以下のスクリーンショットは、上記プログラムの出力を示しています。

BlazorでCSVにエクスポートする方法、図4: 出力されたExcelファイル

出力Excelファイル

結論

このチュートリアルでは、IronXL を使用して Excel ファイルを CSV 形式にエクスポートできる Blazor アプリケーションを構築する方法を示しました。 以下は、IronXLの強力な機能を使って、ファイルアップロードコンポーネントの作成、ファイルのアップロード処理、およびExcelファイルをCSV形式に変換する方法を示したものです。

IronXLをBlazorアプリケーションに組み込むことで、データのインポート、操作、エクスポートなど、さまざまなExcel関連のタスクを簡単に処理できます。 これは、プロジェクトに幅広い可能性をもたらし、ユーザーにより充実した体験を提供するのに役立ちます。 BlazorでIronXLライブラリを使用してCSVをExcelに変換できます。

IronXL は、購入にコミットする前にその機能と性能をテストすることができる無料の試用を提供しています。 試用期間終了後、IronXLのライセンスは$749から開始します。

リーガン・パン
ソフトウェアエンジニア
レーガンはリーディング大学で電子工学の学士号を取得しました。Iron Softwareに入社する前の仕事では、一つのタスクに集中して取り組んでいました。Iron Softwareでは、営業、技術サポート、製品開発、マーケティングのいずれにおいても広範な業務に携わることが最も楽しいと感じています。彼は、Iron Softwareライブラリを開発者がどのように使用しているかを理解し、その知識を使ってドキュメントを継続的に改善し、製品を開発することを楽しんでいます。
< 以前
C#でExcelをDatagridviewに変換する方法
次へ >
C#でExcelをデータテーブルに変換する方法