フッターコンテンツにスキップ
IRONXLの使用

ASP .NET C# で Excel ファイルをダウンロード: XLSX、CSV などにデータをエクスポート

スプレッドシートのエクスポート機能を実装することは、EnterpriseWebアプリケーションにおいて一般的な要件ですが、これらのファイルを生成して配信する手作業のプロセスは、しばしば大きな技術的な複雑さを伴います。 開発者は、ブラウザの一貫した動作を確保し、データの破損を防ぐために、MemoryStream管理の微妙な点を理解し、正確なHTTPコンテンツ配置ヘッダーを設定する必要がある。

この記事では、 IronXLライブラリを使用して.NET C# MVCコントローラーでExcelファイルを作成およびダウンロードするために必要なすべての手順を説明します。 本稿では、Microsoft Officeをインストールしたり、Excel Interopに頼ったりすることなく、データをXLSX形式のExcelファイルにエクスポートする方法、CSVファイルをストリーミングする方法、アップロードしたデータを再エクスポート用に変換する方法、ダウンロードしたファイルをブラウザに返す方法などを解説します。IronXL IronXLNuGetをインストールし、無料トライアルを開始して、ソースコードの例を実際に試してみてください。

NuGet 購入の準備ができていませんか?

PM >  Install-Package IronXl.Excel

IronXLNuGet でチェックしてください。1000万回以上のダウンロードで、C#によるPDF開発を変革しています。 また、DLLをダウンロードできます。

コントローラーからExcelファイルを作成してダウンロードする方法は?

ASP.NET Coreで Excel ファイルをダウンロードするシナリオにおける基本的なパターンは、ワークブックの作成、ストリームへの書き込み、そしてストリームをファイル応答として返すという 3 つのステップで構成されます。 以下のコードは、XLSXファイルをゼロから作成し、ブラウザに送信する完全なMVCコントローラアクションを示しています。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc

Public Class ReportController
    Inherits Controller

    ' Export employee data as a downloadable Excel file
    Public Function DownloadExcel() As IActionResult
        ' Create a new workbook and worksheet
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet = workbook.CreateWorkSheet("Employees")
        ' Add header row with column names
        worksheet("A1").Value = "Name"
        worksheet("B1").Value = "Department"
        worksheet("C1").Value = "Salary"
        ' Populate cells with data values
        worksheet("A2").Value = "Alice Torres"
        worksheet("B2").Value = "Engineering"
        worksheet("C2").Value = 95000
        worksheet("A3").Value = "James Park"
        worksheet("B3").Value = "Marketing"
        worksheet("C3").Value = 78000
        ' Export workbook to a MemoryStream for download
        Dim stream = workbook.ToStream()
        Dim filename As String = "Employees.xlsx"
        Dim content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        ' Return file to the browser with content disposition attachment
        Return File(stream, content, filename)
    End Function
End Class
$vbLabelText   $csharpLabel

出力Excelファイル

 .NET C# で Excel ファイルをダウンロード: データを XLSX、CSV などにエクスポート: 画像 1 - .NET C# で Excel ファイルをダウンロードするための出力例

WorkBook.Create メソッドは新しい Excel ドキュメントを生成し、CreateWorkSheet メソッドは最初のワークシートをそのドキュメントに追加します。 セルに値を入力した後、 ToStreamメソッドはワークブック全体を MemoryStream に変換します。一時ファイルはディスクに書き込まれません。 コントローラの File() メソッドは、コンテンツディスポジション ヘッダーを attachment に設定します。これにより、ブラウザはファイルをレンダリングしようとするのではなく、ダウンロードするように指示されます。 3番目のパラメータは、ユーザーのダウンロードダイアログに表示されるファイル名を制御します。

このパブリックな IActionResult パターンは、.NET FrameworkとASP.NET Coreプロジェクトの両方で機能するため、データを Excel にエクスポートする必要がある Web アプリケーションにとって最適なアプローチとなっています。

データベースデータをダウンロード可能なスプレッドシートにエクスポートする方法は?

実際のシナリオのほとんどは、ハードコードされた値ではなく、データベーステーブルからデータをエクスポートすることを伴います。 処理手順は変わりません。データを照会し、ワークシートにデータを入力し、ファイルを返します。以下は、データベースからレコードを取得し、Excelドキュメントに書き込む処理をシミュレートした例です。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc

Public Class DataExportController
    Inherits Controller

    ' Export database records to an xlsx file for download
    Public Function ExportDatabaseReport() As IActionResult
        ' Simulate a database query returning order records
        Dim orders = New() {
            New With {.OrderId = 1001, .Customer = "Acme Corp", .Total = 4500.0D},
            New With {.OrderId = 1002, .Customer = "Globex Inc", .Total = 12300.5D},
            New With {.OrderId = 1003, .Customer = "Initech LLC", .Total = 890.75D}
        }
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet = workbook.CreateWorkSheet("Orders")
        ' Write headers
        worksheet("A1").Value = "Order ID"
        worksheet("B1").Value = "Customer"
        worksheet("C1").Value = "Total"
        ' Write each row of data from the query results
        For i As Integer = 0 To orders.Length - 1
            Dim row As Integer = i + 2
            worksheet($"A{row}").Value = orders(i).OrderId
            worksheet($"B{row}").Value = orders(i).Customer
            worksheet($"C{row}").Value = orders(i).Total
        Next
        Dim stream = workbook.ToStream()
        Dim filename As String = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx"
        Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename)
    End Function
End Class
$vbLabelText   $csharpLabel

出力

ASP .NET C# で Excel ファイルをダウンロード: データを XLSX、CSV などにエクスポート: 画像 2 - データベースから Excel ファイルにデータをエクスポートしたときの出力

本番環境では、orders配列はEntity Framework Coreクエリ、 Dapper呼び出し、または接続文字列を介してデータベースに接続された任意のデータアクセス層から取得されます。 このループは結果を繰り返し処理し、それぞれの値をワークシート上の適切なセルに書き込みます。 ファイル名に日付スタンプが含まれている点に注目してください。これはユーザーがファイルを繰り返しダウンロードする際に発生する問題を回避できる、ちょっとした工夫です。

IronXLのセルアドレス指定システム(worksheet[$"A{row}"])は読みやすさを維持し、 WorkBook APIは有効なXLSXファイルを作成するための面倒な処理をすべて内部的に行います。 数式、スタイル設定、複数シートのワークブックなどを含むより複雑なシナリオでも、同じアプローチが問題なく適用できます。

データをXLSXファイルではなくCSVファイルとしてダウンロードするにはどうすればよいですか?

軽量なCSVファイルの方が適している場合もあります。特に、本格的なExcelファイルのような豊富な機能を必要としない他のシステム、データベース、ツールにデータを取り込む場合はなおさらです。IronXLを使えば、フォーマットの切り替えは非常に簡単です。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc

Public Class CsvController
    Inherits Controller

    ' Export data as a CSV file download
    Public Function ExportCsv() As IActionResult
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet = workbook.CreateWorkSheet("Products")
        worksheet("A1").Value = "SKU"
        worksheet("B1").Value = "Product"
        worksheet("C1").Value = "Price"
        worksheet("A2").Value = "WDG-001"
        worksheet("B2").Value = "Widget Pro"
        worksheet("C2").Value = 29.99
        ' Convert to CSV stream instead of XLSX
        Dim stream = workbook.ToCsvStream()
        Dim filename As String = "Products.csv"
        Return File(stream, "text/csv", filename)
    End Function
End Class
$vbLabelText   $csharpLabel

出力CSVファイル

ASP .NET C# で Excel ファイルをダウンロード: データを XLSX、CSV などにエクスポート: 画像 3 - Excel ではなく CSV ファイルとしてダウンロードされたデータ

ToCsvStream メソッドは、最初のワークシートを CSV 形式のMemoryStreamとしてエクスポートします。 CSVファイルはデータ交換には非常に便利ですが、書式設定、数式、複数シート構造などはすべて削除されてしまいます。 これらの機能が必要な場合は、ToStream() または ToXlsxStream() を使用して XLSX ファイル形式を使用してください。 フォーマット変換の詳細については、スプレッドシート変換ガイドを参照してください。

アップロードしたファイルを別の形式で再エクスポートする方法は?

一般的なWebアプリケーションのシナリオとしては、ユーザーからアップロードされたファイルを受け取り、別の形式でエクスポートすることが挙げられます。例えば、XLS形式のファイルをXLSX形式に変換したり、従来形式で保存されたワークブックからCSVファイルを作成したりといった具合です。

public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

Public Function ConvertUpload(upload As IFormFile) As IActionResult
    Using memoryStream As New MemoryStream()
        upload.CopyTo(memoryStream)
        memoryStream.Position = 0
        ' Load uploaded Excel file from the stream
        Dim workbook = WorkBook.Load(memoryStream)
        ' Re-export as XLSX regardless of the original file extension or file type
        Dim stream = workbook.ToXlsxStream()
        Dim filename As String = Path.GetFileNameWithoutExtension(upload.FileName) & ".xlsx"
        Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename)
    End Using
End Function
$vbLabelText   $csharpLabel

出力: CSVをXLSX形式に変換

ASP .NET C# で Excel ファイルをダウンロード: データを XLSX、CSV などにエクスポート: 画像 4 - CSV ファイルを XLSX 形式に変換した出力例

WorkBook.Loadメソッドは MemoryStream を受け入れるため、アップロードしたファイルを事前にディスクに保存する必要はありません。ソースが XLS、XLSX、または CSV ファイルであるかを自動的に検出し、それに応じて解析します。 そこから、ToXlsxStream() は、すべてのバイトが適切に構造化された、最新の XLSX 形式のクリーンな新しい MemoryStream を生成します。 これは、ユーザーからの送信データを、さらなる処理や保存の前に正規化するのに役立ちます。

エクスポート可能なファイル形式はどれですか?

IronXLは、複数のスプレッドシート形式およびデータ交換形式へのデータエクスポートをサポートしています。 以下の表は、利用可能な出力オプションとその最適な用途をまとめたものです。

|形式| ファイル拡張子 | ストリームメソッド | 最適な使用例 | |---|---|---|---| | XLSX | .xlsx | ToXlsxStream() | 書式設定と数式を備えた最新のExcelスプレッドシート | | XLS | .xls | ToXlsStream() | レガシーシステムとの互換性 | | CSV | .csv | ToCsvStream() | データベースインポート、データパイプライン、軽量エクスポート | | XML | .xml | ToXmlStream() | Enterpriseシステム統合 | | JSON | .json | SaveAsJson() | Web APIの応答とデータ交換 | | HTML | .html | ExportToHml() | スプレッドシートデータのウェブページ表示 |

すべてのストリームメソッドは、 ASP.NET CoreのFile()戻り値ヘルパーに直接接続できるMemoryStreamを返します。 バイト配列を使用する代替手段(ToByteArray())も利用可能です。これは、例えばブロブデータベースに保存する場合や、電子メールの応答ストリームに添付する場合など、バイト配列の方が便利なシナリオで使用できます。 これらのメソッドはすべて、 IronXL NuGetパッケージをインストールした直後から利用可能です。 各エクスポート形式の詳細な手順については、 Excelへのエクスポートに関するドキュメントを参照してください。

ビジネスアナリスト向けにXLSX形式でファイルをダウンロードする場合でも、データエンジニア向けにCSVファイルをエクスポートする場合でも、Enterprise統合向けにXMLを生成する場合でも、 IronXLは.NET Coreおよび.NET Frameworkアプリケーション全体でコードをクリーンに保ち、出力の信頼性を確保します。 次のプロジェクトでスプレッドシートのエクスポート機能を導入する準備はできていますか? 無料トライアルライセンスを取得するか、ライセンスオプションを確認して、今すぐ始めましょう。 詳しいセットアップ手順については、 IronXLの入門ガイドを参照してください。

よくある質問

C# を使用してASP.NET Coreで Excel ファイルをダウンロードするにはどうすればよいですか?

IronXLを利用することで、C# を使ってASP.NET Coreから Excel ファイルをダウンロードできます。IronXLを使用すると、MVC コントローラーから XLSX、CSV、XML などの様々な形式に直接データをエクスポートできます。これは、MemoryStream と File() メソッドを使用することで効率的に管理できます。

Excel ファイルをエクスポートするためにIronXLを使用する利点は何ですか?

IronXLは、MemoryStreamを効果的に管理し、HTTPコンテンツ配置ヘッダーを設定することで、Excelファイルのエクスポートプロセスを簡素化します。ブラウザの動作の一貫性を確保し、データの破損を防ぐため、エンタープライズWebアプリケーションに最適です。

IronXLはどのファイル形式にデータをエクスポートできますか?

IronXLは、XLSX、CSV、XMLなど、複数のファイル形式にデータをエクスポートできます。この汎用性により、開発者はさまざまなデータエクスポート要件をシームレスに処理できます。

Excel ファイルをエクスポートするときに、 IronXL はどのような技術的な課題を克服するのに役立ちますか?

IronXLは、MemoryStream管理や正確なHTTPコンテンツ配置ヘッダーの設定といった課題の解決に役立ちます。これらの機能により、エクスポートされたExcelファイルがブラウザで正しく処理され、データの破損を防ぐことができます。

IronXL はMVC コントローラーからデータをエクスポートするために使用できますか?

はい、 IronXLはMVCコントローラーからデータをエクスポートするために使用できます。Excel形式でデータを出力するための簡単な方法を提供するため、 ASP.NET Core Webアプリケーションにとって実用的な選択肢となります。

IronXL はExcel ファイルの生成プロセスをどのように改善しますか?

IronXL は、MemoryStream や HTTP ヘッダー管理などの複雑なタスクを自動化することでプロセスを改善し、開発者が技術的な複雑さではなくコア機能に集中できるようにします。

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね