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



:::note warn
EPPlus のバージョン 5 以降（最新のバージョン 7 を含む）を 商用目的で利用する場合は、商用ライセンスが必要になりました。
<a href="https://epplussoftware.com/ja/LicenseOverview/LicenseFAQ">ライセンスに関するよくある質問</a>
:::

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

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

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

```csharp
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` を使用してエクスポートを非同期で呼び出すボタンと、進行状況の表示を作成します。

```html
@{
    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エクスポートを行い、エクスポート完了後にブラウザで直接ファイルがダウンロードされるようになります。