Excel ファイルの作成とダウンロード

この記事では ASP.NET にて Excel ファイルを作成して、それをダウンロードする方法を紹介します。

ClosedXML の利用方法

ここでは Excel ファイルを ClosedXML ライブラリを利用して作成します。

ClosedXML については、C# 入門の「ClosedXML を用いて Excel ファイルを操作する方法」にて説明していますので、 馴染みのない人はまずはそちらをみてください。

ClosedXML は Web アプリケーション専用ではなく、 Windows アプリケーションでも利用可能です。

このページでは ASP.NET で ClosedXML を利用する方法及びその結果作成された Excel ファイルをクライアントにダウンロードさせる方法を示します。

ASP.NET で ClosedXML を利用するには、ASP.NET の bin フォルダにアセンブリ ClosedXML.dll と DocumentFormat.OpenXML.dll をコピーするだけで OK です。

もし、ASP.NET の開発環境が Visual Studio である場合は、NuGet パッケージマネージャからインストール可能です。

> Install-Package ClosedXML

Excel ファイルの作成とダウンロード

ここで作成するプログラムは次の通りです。

Web Form 上にボタンが一つあります。

これをクリックすると、直ちに Excel ファイルのダウンロードが開始します。

ダウンロードされた Excel ファイルを開くと次のように確かにデータが確認できます。

まず、ASPX ファイルは次のように単に Button を配置しているだけです。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button 
            ID="Button1" 
            runat="server" 
            OnClick="Button1_Click" 
            Text="Download Products" />
    </div>
    </form>
</body>
</html>

クリックイベントのハンドラは Button1_Click メソッドとします。Button1_Click では、 データベースからデータを読み込み DataTable オブジェクトにセットしています。Northwind の Products テーブルの中身をいれてます。

そして、その DataTable オブジェクトを、ここで作成する DownloadExcelDataTable メソッドに渡しています。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using ClosedXML.Excel;

public partial class _Default : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        var dt = GetNorthwindProductTable();
        DownloadExcelDataTable(dt);
    }

    protected void DownloadExcelDataTable(DataTable dt)
    {
        using (var stream = new MemoryStream())
        {
            // Excel ファイル作成
            var workbook = new XLWorkbook();
            workbook.Worksheets.Add(dt);
            workbook.SaveAs(stream);

            // ダウンロード
            Response.Clear();
            Response.Buffer = true;
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("Content-Length", stream.Length.ToString());
            Response.AddHeader("Content-Disposition", "attachment; filename=test1.xlsx");
            Response.BinaryWrite(stream.ToArray());
            Response.Flush();
            Response.End();
        }
    }

    static DataTable GetNorthwindProductTable()
    {
        ...
    }
}

DownloadExcelDataTable メソッドでは次のことをしています。

ClosedXML を用いて Excel ファイルを作成し、それをメモリストリーム (MemoryStream) として保存します。 そのメモリストリームを ASP.NET の BinaryWrite を用いてクライアントに出力しています。

ブラウザで直ちに開くのではなく、内容をファイルとしてダウンロードさせるようにクライアントに認識させるには、 Contents-Disposition ヘッダで attachment を指定します。ダウンロードするときにファイル名を指定したい場合はここで指定します。

ちなみに、ファイル名内に , などの HTTP ヘッダで使われる特殊文字が使われる場合は二重引用符で括れば OK です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 ASP.NET 入門