CSV でダウンロードというのはこれだけ技術が進歩した現在でも根強く残っている
ユーザーは CSV のデータが欲しいわけではない、Excel で扱えるデータが欲しいのだ
手っ取り早いのと前例が多いために、妥協の果てに CSV に落ち着くのである
しかし .NET においては下記のようにした方が CSV よりもコーディングも少ないし付加できる情報も CSV より多いと思うわけで
private void Button1_Click(object sender, System.EventArgs e)
{
DataGrid grid = new DataGrid();
grid.HeaderStyle.BackColor = Color.Gray;
grid.HeaderStyle.Font.Bold = true;
grid.ItemStyle.BackColor = Color.SkyBlue;
grid.AlternatingItemStyle.BackColor = Color.LightYellow;
grid.DataSource = this.CreateDataSource();
grid.DataBind();
base.Response.ContentType = "application/vnd.ms-excel";
base.Response.AppendHeader("content-disposition", "attachment;filename=hoge.xls");
using (HtmlTextWriter writer = new HtmlTextWriter(base.Response.Output))
{
try
{
grid.RenderControl(writer);
writer.Flush();
base.Response.End();
}
finally
{
writer.Close();
}
}
}
CreateDataSource は Northwind の Employees からデータを取得しているだけです
新たに DataGrid を new しているのは、通常画面側ではスタイルの指定に CSS を使用しているであろうから
そうでなければ、画面の DataGrid をそのまま RenderControl してやればいい
別に表形式だけに限らない
要は HTML で表現できるならなんでもいいのだ
HtmlGenericControl div = new HtmlGenericControl("div");
してやって、Control を Add してやって RenderControl してやれば大抵の表現はできる
これならサーバに何もインストールする必要もなく、表現豊かな Excel ファイルがダウンロードできる
がんばって Excel が吐き出す HTML を解析すれば、書式の指定だって不可能じゃない
000001 が 1 にならなくてすむし、分数が日付に変換されないようにすることも可能だ(しんどいけど)
ASP.NET ではせっかく各コントロールが HTML 情報を持ってるんだから積極的に使ってやるべきだ