主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

ASP .NET C# で DB を Excel にエクスポート

最終更新日 2007-11-12 03:42:48 (1年以上前の記事です)

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 として追加して事なきを得ました。

最終更新日 2007-11-12 03:42:48

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank2, rank3, rank7, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google