あるシステム屋による開発の記録

JavaやVB.Netを使ったシステムを開発している筆者が、日々気付いたこと・思ったことや過去に経験したことを記していきます。

ASP + C#でGridViewをExcelに出力する

ASP + C#でGridViewをExcelに出力(ダウンロード)する方法について。
以下のようにする。

GridViewの作成


Excelに出力したい項目を保持するGridView(変数名をGridView1としておく)を作成する。
注意点としては、以下の3点:
・ページャ機能がOFFになっていること
・ソート機能がOFFになっていること
・TemplateFieldを保持しないこと

特に3点目が重要で、TemplateFieldを持っていたとしても
Visible = falseにすれば回避できるとのことだが、
画面に表示するためのGridViewでTemplateFieldを使わないというのは
なかなか厳しいんではないだろうか。

そこでぼくはExcel出力専用のGridViewを用意し、
それをiframeタグでstyle="display: none"として作成したダミーフレームの中に
配置することにした。

GridViewをExcelの形式で出力(ダウンロード)する


GridViewができれば、後はそれをExcelの形式で出力(ダウンロード)するのみ。
以下のようにする:

Response.Clear();
Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", fileName));
Response.Charset = "";
Response.ContentType = "application/vnd.ms-excel";

StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
GridView2.RenderControl(htmlWrite);

Response.Write(stringWrite.ToString());
Response.End();
※ Charset の指定は要らないか、Shift-Jisあたりを指定しておけばよいと思われる。

これをみれば分かるように、ContentTypeでExcelの形式であるとしていながら、
HtmlTextWriterを使って出力しており、
見た目はExcelでも中身はHtmlになっている。

ためしに開かれたExcelを"名前を付けて保存"してみると、
デフォルトのファイルの種類がhtmlになっているはず。
これをそのままhtmlとして保存して、テキストエディタで開いてみると、
htmlのtableの形式になっているのが分かると思う。

ファイルを開かずに保存した場合や、名前を付けて保存でExcel形式を選択した場合は
ちゃんとExcel形式で保存されるので、特に問題はないのではないだろうか。


  1. 2009/11/26(木) |
  2. C#
  3. | トラックバック:0
  4. | コメント:0

モーダルウィンドウからのファイルダウンロード

C# + ASPでファイルをダウンロードするには、イベントメソッドの中とかで
あるシステム屋による開発の記録 ASP + C# + SQL Serverでファイルダウンロードを行う
のように書けばよいが、
これがモーダルウィンドウからのファイルダウンロードだと
これだけではうまくいかないことがある。
# うまくいっているというケースもあるようで、一概には言えない

モーダルウィンドウからファイルダウンロードを行うには、
ダミーのiframeをdisplay: noneで以下のように作成しておいて、

<iframe src="" style="display: none" id="downloadFrame"></iframe>
※ srcの指定は要らないかもしれない

このフレームに対して
javascriptでdownloadFrame.location=... で遷移先のダウンロードを行うための
aspxファイル(download.apsxとか)を指定することでファイルダウンロードを行う。

例えば、C#では以下のようにする:

Page.ClientScript.RegisterStartupScript(this.GetType(), "filedownload",
    <script language='javascript'>downloadFrame.location='download.aspx?" +
    "[key1]=[value1] &" +
    "[key2]=[value2] &" +
    "[key3]=[value3] ;</script>");

RegisterStartupScriptで、処理を行った後に、第3引数のjavascriptを実行できる。
ちなみに第1引数はこの形で、第2引数は何でもよいと思われる。

遷移先のaspx名の後ろに"?"で区切ってパラメータを複数渡すことができ、
例えば遷移先のdownload.aspx.csのPage_Loadの引数の
senderに対して以下のように記述することで渡したパラメータを取得できる:

Page pg = (Page)sender;
string[] cqsAry = pg.ClientQueryString.Split('&');
string [value1] = cqsAry[0].Split('=')[1];
string [value2] = cqsAry[1].Split('=')[1];
string [value3] = cqsAry[2].Split('=')[1];



  1. 2009/11/26(木) |
  2. C#
  3. | トラックバック:0
  4. | コメント:0

ASP + C# + SQL Serverでファイルダウンロードを行う

あるシステム屋による開発の記録 ASP + C# + SQL Serverでファイルアップロードを行う
でファイルアップロードについて触れたので、
今回はC#でのDBを使用したファイルダウンロードについて。

参考にしたのは以下のサイト:
@IT:.NET TIPS [ASP.NET]データベースに登録したバイナリ・データを表示するには? - C# VB.NET Webフォーム

やり方としては以下の通り:

1. テーブル作成
IMAGE型のカラムを持つテーブルを作成し、
バイナリデータを保存しておく。
※ このあたりは以下を参照:
あるシステム屋による開発の記録 ASP + C# + SQL Serverでファイルアップロードを行う

2. バイナリデータの取得
SQLを使って1.で作成したバイナリデータを取得する。
以下のような感じ:

※ commandはSqlCommandクラスのインスタンス
command.CommandText = "SELECT [column_name] FROM U[table_name] WHERE ....";
command.Prepare();

SqlDataReader reader = command.ExecuteReader();

if (reader.Read())
{
    Byte[] fileObj = (Byte[])reader["UPLOAD_FILE"];
}

当然受け取る型はByte[]とする。

3. Responseに対してファイル出力を行う
上記記事の例とはちょっと変えて、以下のようにした:

Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + [file_name] + "\"");

Response.BinaryWrite(fileObj(2.で取得したByte[]型の変数));
Response.Flush();
Response.End();

上記記事の例だとAppendHeaderやFlushがなかったり、
ContentTypeに登録時のものを設定したりしている。

Flushは要らないのかもしれないが、AppendHeaderはファイル名を指定するのには必要。
ただしファイル名に日本語は使用できないかもしれない(調査中)。

また、AppendHeaderで"attachment"と指定することで
ファイルを開くか保存するかのダイアログを表示することができる。
ちなみにここで"inline"を指定するとダイアログを表示せずにブラウザで開くことができる。

それから、ContentTypeは"application/octet-stream"を指定しておけば、
たいていのファイルには対応できると思う。
厳密にやるには上記記事のように登録時のものを使う方がよいと思われる。


  1. 2009/11/23(月) |
  2. C#
  3. | トラックバック:0
  4. | コメント:0

C#で数値の絶対値、符号を取得する

C#で数値の絶対値や符号を取得する方法について。

◆ 数値の絶対値を取得する
int(Int32)型であれば、以下のようにする:

int absValue = System.Math.Abs(int);

int(Int32)のほか、long(Int64)、double型などにも対応している。

◆ 数値の符号を取得する

int sign = System.Math.Sign(int);

↓では「このメソッドが必要となる場面は、恐らくないでしょう。」としているけど、
C# - 指定した数値の符号を示す値を取得する
わりと使えると思うけどなぁ。


  1. 2009/11/22(日) |
  2. FC2
  3. | トラックバック:0
  4. | コメント:0

経済ってそういうことだったのか会議

「経済ってそういうことだったのか会議」
2009年2月読了。

大学教授であり、NHK教育の番組「ピタゴラスイッチ」の企画・監修も勤める佐藤雅彦さんと、
金融担当大臣などいろいろな大臣を歴任された竹中平蔵さんの、
"経済"を題材にした会談(会話?)に基づく本。

佐藤さんが抱いていた経済に関する素朴な疑問を
竹中さんが分かりやすい言葉で解説するという形式で、
お二方の会話がそのまま活字になっているという感じ。

帯に「新・経済の入門書」と書かれているだけあって、
経済というとまだよく分かっていいないぼくにとっても
非常に分かりやすく読むことができ、経済についてもっと知りたくなった。


  1. 2009/11/22(日) |
  2. 読書
  3. | トラックバック:0
  4. | コメント:0

ブログパーツ CHEER ENGINEER、KITT終了

このサイトでもいくつかブログパーツを貼り付けているが、
そのうちCHEER ENGINEERとKITTがそのサービスを終了した。

特にCHEER ENGINEERは以下にも書いているように
そのサービス開始から登録していたものだっただけに残念ではある。
あるシステム屋による開発の記録 SEかプログラマか

こういうサービスを運営していくのも何かと苦労があるんだろう。


  1. 2009/11/22(日) |
  2. ブログパーツ
  3. | トラックバック:0
  4. | コメント:0

Google Readerの未読アイテム0

RSS ReaderにはGoogle Readerを使っている。
ここのところ後で読もうと思っていた記事がたまっていたり、
単純にRSSに目を通す時間すらなかったりで
未読記事がたまっていたのだが、
つい先ほど未読記事が0の状態になった。

midoku0.jpg

気持ちが良いもんだ。


  1. 2009/11/22(日) |
  2. 未分類
  3. | トラックバック:0
  4. | コメント:0

ASP + C# + SQL Serverでファイルアップロードを行う

Webアプリケーションでファイルアップロードの機能を実装することはよくある。
以前Javaで実装したときは
ファイルサーバにファイルそのものをアップロードするというものだった。

今度はC#でもファイルアップロードを行うことになり、
今回はSQL Serverの中にバイナリデータを登録することで
ファイルアップロードを実現することになった。

参考にしたのは以下のサイト:
@IT:.NET TIPS [ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには? - C# VB.NET Webフォーム

やり方としては以下の通り:
1. テーブル作成
ファイルを特定するキーやファイル名などのカラムのほかに、
IMAGE型でバイナリデータを登録するカラムを作成する。

2. ASPでファイルを指定する画面を作成
今回は一覧の中で1行ごとにファイルをアップロードできるようにする必要があったため、
GridViewの中にFileUploadコントロールを配置した。

3. 指定されたファイルのInputStreamをC#で取得し、DBに登録する
上記記事の例ではinputタグを使って、<input type="file" ... runat="Server" />みたいに書いていたが、
今回はASPのFileUploadコントロールを使用したので、ここが若干違う。

まずはFindControl(string)を使って、
以下のようにGridViewの1行(GridViewRow)からFileUploadコントロールを取得する:

FileUpload fu = (FileUpload)GridView1.Rows[0].FindControl("FILE_UPLOAD");

上記のfuに対して、以下のようにするとInputStreamが取得できる:

fu.PostedFile.InputStream

ファイルのバイト長であるContentLengthは

fu.PostedFile.ContentLength

で取得できるので、後は以下のように書けば
ファイルをバイナリデータとして登録できるByte[]型に変換することができる:

Byte[] aryData = new Byte[fu.PostedFile.ContentLength];
fu.PostedFile.InputStream.Read(aryData, 0, fu.PostedFile.ContentLength);


上記記事にも、

サーバ上の特定の場所にファイル・アップロード用のスペースを用意し、ファイル・システム上でデータを管理するという選択肢ももちろんある。しかし、この方法では適切にアクセス権限を設定しないと、不特定多数のユーザーにアップロードしたファイルが見えてしまうという欠点がある。特にワークフロー上で交換するファイルは、ユーザーごとの細かなアクセス制御が必要となることが多く、ファイル・システム上で制御するには何かと設定が面倒だ。

とあるように、ファイルを保管する場所がデータベースになることで
余計な心配をしなくて良いというのがいい。

Oracleとかでも同じようにできるのかな。


  1. 2009/11/21(土) |
  2. C#
  3. | トラックバック:0
  4. | コメント:0

頭のいい子が育つパパの習慣

「頭のいい子が育つパパの習慣」
2009年2月読了。

誕生日プレゼントだっつって嫁からいただいたので読んでみた。

印象に残ったのは、前書きにある以下の言葉:

親の収入や塾に投入した金額の多寡とも関係なく、
親の接し方ひとつで、子どもは伸びたり伸びなかったりするということである。


本書には父親として子どもにどう接するべきかということが
具体的に書かれている。

父親である前にまずは一人の人間として
しっかりしていなきゃいかんなと思った。


  1. 2009/11/21(土) |
  2. 読書
  3. | トラックバック:0
  4. | コメント:0

サクラエディタをインストールする

テキストエディタはそれぞれ好みがあると思うが、
ぼくはサクラエディタをよく使う。

今自宅で使っているPCにはまだサクラエディタが入っていなかったので、
インストールしてみた。

ダウンロードはこちらから:
Sakura Editor | Get Sakura Editor at SourceForge.net

exeがダウンロードされるので、
後はこれを実行して、基本的にはデフォルトの設定のまま「次へ」進むことで
インストールが完了する。

好みで「デスクトップにショートカットを作成」とか
「サクラで開くメニューを追加」とかにチェックを入れると良いかもしれない。

インストールの詳細は以下の通り:


[サクラエディタをインストールする]の続きを読む
  1. 2009/11/21(土) |
  2. インストールメモ
  3. | トラックバック:0
  4. | コメント:0

次のページ

ブログ内検索

カテゴリー

最近の記事

カレンダー

10 | 2009/11 | 12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -

月別アーカイブ

feedmeter & あわせて読みたい

フィードメーター - あるシステム屋によるJava開発の記録
あわせて読みたいブログパーツ

Yahoo logoole

プロフィール

Author:kamii
ピタゴラスイッチ好きなシステム開発屋@二児の父です。

メールフォーム

名前:
メール:
件名:
本文:

カウンター

checker

ページランク


ブログチャート

FoxMeter 3

Firefox3 Meter

Amazon商品一覧【新着順】

ASUS EeePC EEEPC1000H-WHITE 10インチ パールホワイト EEEPC1000H-WHI078X
ASUS EeePC EEEPC1000H-WHITE 10インチ パールホワイト EEEPC1000H-WHI078X

情報処理教科書 テクニカルエンジニア[データベース]2008年度版 (CD-ROM付) (情報処理教科書)
情報処理教科書 テクニカルエンジニア[データベース]2008年度版 (CD-ROM付) (情報処理教科書)

情報処理教科書 ソフトウェア開発技術者 2007年度版 (情報処理教科書)
情報処理教科書 ソフトウェア開発技術者 2007年度版 (情報処理教科書)

現在時刻

全エントリ表示

全てのエントリを表示する

RSSフィード

リンク

このブログをリンクに追加する

By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

ブロとも申請フォーム

この人とブロともになる