1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#でExcelテンプレートファイルを基にエクスポート機能を作成する方法-EPPlus

Last updated at Posted at 2024-11-11

EPPlus のバージョン 5 以降(最新のバージョン 7 を含む)を 商用目的で利用する場合は、商用ライセンスが必要になりました。
ライセンスに関するよくある質問

ASP.NET MVCで、C#を使用してExcelテンプレートファイルを基にエクスポート機能を作成し、AJAXでデータ通信を行うサンプルを以下に示します。ここでは、EPPlus を使用してExcelを操作し、jQueryAjax を使って非同期でデータを取得し、エクスポート処理を実行します。また、Bootstrap 5.3.2 を使って基本的なUIを構築します。

1. ASP.NET MVC コントローラーの作成

まず、エクスポート機能を担当するコントローラーを作成します。

using EPPlus;
using System;
using System.Data;
using System.IO;
using System.Web;
using System.Web.Mvc;

public class ExportController : Controller
{
    // エクスポートの処理
    [HttpPost]
    public ActionResult ExportToExcel()
    {
        // データを取得(サンプルとしてDataTableを使用)
        DataTable data = GetData();

        // テンプレートファイルのパス
        string templatePath = Server.MapPath("~/Templates/template.xlsx");

        // エクスポート先のファイルパス
        string outputPath = Server.MapPath("~/Downloads/exportedFile.xlsx");

        // Excelエクスポート処理
        ExcelExport export = new ExcelExport();
        export.ExportToExcel(templatePath, data, outputPath);

        // エクスポートしたファイルを返す
        return File(outputPath, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "exportedFile.xlsx");
    }

    // サンプルデータの取得(実際のデータを取得する処理に変更)
    private DataTable GetData()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Name");
        dt.Rows.Add(1, "John Doe");
        dt.Rows.Add(2, "Jane Smith");

        return dt;
    }
}

public class ExcelExport
{
    public void ExportToExcel(string templatePath, DataTable data, string outputPath)
    {
        FileInfo templateFile = new FileInfo(templatePath);
        
        // Excelパッケージを開く
        using (var package = new ExcelPackage(templateFile))
        {
            // 最初のワークシートを取得
            var worksheet = package.Workbook.Worksheets[0];

            // データテーブルの行数だけループしてセルに値を設定
            for (int row = 0; row < data.Rows.Count; row++)
            {
                for (int col = 0; col < data.Columns.Count; col++)
                {
                    worksheet.Cells[row + 2, col + 1].Value = data.Rows[row][col];
                }
            }

            // 出力ファイルを保存
            package.SaveAs(new FileInfo(outputPath));
        }
    }
}

2. ビューの作成 (CSHTML)

次に、AJAX を使用してエクスポートを非同期で呼び出すボタンと、進行状況の表示を作成します。

@{
    ViewBag.Title = "Excel Export";
}

<!-- BootstrapのCSS読み込み -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">

<div class="container">
    <h2>Excelエクスポートサンプル</h2>

    <!-- エクスポートボタン -->
    <button id="exportBtn" class="btn btn-primary">Excelエクスポート</button>

    <!-- ローディングのインジケータ -->
    <div id="loading" style="display:none;">
        <span class="spinner-border text-primary" role="status"></span>
        <span>エクスポート中...</span>
    </div>

    <div id="message" style="margin-top:20px;"></div>
</div>

<!-- jQuery, Bootstrap, Ajaxのスクリプト -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>

<script>
$(document).ready(function () {
    $('#exportBtn').click(function () {
        // ローディングインジケータの表示
        $('#loading').show();
        $('#message').text('');

        // AJAXリクエストを送信
        $.ajax({
            type: 'POST',
            url: '@Url.Action("ExportToExcel", "Export")',
            dataType: 'json',
            success: function (response) {
                // ダウンロードリンクを作成してダウンロードを開始
                window.location.href = response.fileUrl;
                $('#loading').hide();
            },
            error: function () {
                $('#loading').hide();
                $('#message').text('エクスポートに失敗しました。再試行してください。');
            }
        });
    });
});
</script>

3. エクスポートの流れ

  1. ビュー (CSHTML): ユーザーが「Excelエクスポート」ボタンをクリックすると、AJAXリクエストがバックエンドのExportToExcelアクションに送信されます。
  2. バックエンド (Controller): コントローラーのExportToExcelアクションは、Excelテンプレートを開き、データを埋め込んで新しいファイルとして保存し、その後そのファイルをレスポンスとして返します。
  3. AJAX成功時: AJAXが成功すると、サーバーから返されたファイルのURLを使って、ブラウザで直接ファイルのダウンロードが開始されます。

4. 動作

  • ボタンをクリックすると、非同期でExcelエクスポートが実行され、処理中はローディングインジケータが表示されます。
  • エクスポートが成功すると、ブラウザのダウンロードが自動的に開始されます。

5. Bootstrapでのローディング表示

エクスポート処理中にローディングインジケータを表示するために、Bootstrapのspinnerを使用しています。処理が終了すると、インジケータが非表示になり、ユーザーにフィードバックを提供できます。

6. 重要なポイント

  • EPPlusを使ってExcelファイルを操作しているため、Excelテンプレートファイルとデータを結びつけて新しいファイルを作成します。
  • サーバー側の処理は、ファイルを返すことでダウンロードが始まるようにしており、AJAXの成功時にwindow.location.hrefを使ってダウンロードリンクを設定します。

これにより、非同期でExcelエクスポートを行い、エクスポート完了後にブラウザで直接ファイルがダウンロードされるようになります。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?