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 です。