GridView を使用してやる方法です。
GridView を使って Excel にエクスポートすると、どんな形式のクエリでも書式でもうまいことできるのでとても便利。
とりあえず環境
VisualStudio 2005
ASP .NET C#
簡単な手順
1) GridView と SqlDataSource を追加する
2) Select したいクエリを SqlDataSource に指定する
3) GridView の Columns を適切に追加したり書式とか整理したりする
4) GridView の RenderControl で出力してやる
これ見ても分からんのでコードを見るのがいいと思う。
protected void Page_Load(object sender, EventArgs e) { fileName = "output"; Response.Clear(); Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", fileName)); Response.Charset = ""; Response.ContentType = "application/vnd.xls"; StringWriter stringWrite = new StringWriter(); HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); GridView1.RenderControl(htmlWrite); Response.Write(stringWrite.ToString()); Response.End(); }
これだけです。ただ、これ実行するとおかしな例外が発生します。
Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server
これはどうやらバグらしいんですが、回避策としては VerifyRenderingInServerForm() 関数をオーバーライドしてやればいいみたいです。
public override void VerifyRenderingInServerForm(Control control) { }
さて、これで全部解決したと思ったら、もう一個例外を受け取りました。
RegisterForEventValidation can only be called during Render();
これは結構はまったのですが、原因は GridView の AutoGenerateColumns を true にした際に、テーブルの中に boolean 型のフィールドが存在し、それが HTML 上でチェックボックスに変換されてしまっていたために、 Render の中でそれ用の Validation 登録関数が呼ばれてしまっていたんですね。
なので、 AutoGenerateColumns を false にし、ちょっと面倒ですが Column を一つ一つ手動で Databound として追加して事なきを得ました。