スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ブログテンプレート変更


このブログでは長いこと同じテンプレートを使ってきたが、
ここら辺で心機一転してテンプレートを変えて
ブログのデザインを一新してみようと思い立ち、
とりあえずテンプレートの変更と、
すぐに必要な修正を施してみた。

これから少しずついじっていってみたい。

スポンサーサイト

GridViewをExcelに出力するときの色やフォーマットの指定方法


ASP + C#でGridViewをExcel出力するのは、以下の記事で書いたとおり:
あるシステム屋による開発の記録 ASP + C#でGridViewをExcelに出力する

今回はそのGridViewの背景色やstyle属性を変更することで
出力されるExcelの背景色やフォーマットを変更することについて。

背景色変更


以下のようにしてGridViewの背景色を変更する。

GridView1.HeaderRow.Cells[i].BackColor = ColorTranslator.FromHtml("#86B3EE");

データがある行のGridView1.HeaderRow.Cells[i]のBackColorを指定するというのが肝心で、
GridView1.HeaderRowのBackColorを指定してしまうと
Excelに出力したときにヘッダ行(1行目)のすべての背景色が
指定した色に変わってしまう。

今回はCSSで指定してある他の色とあわせる必要があったため、
ColorTranslator.FromHtmlを使ってHTMLでの色の指定からColor構造体に変換している。

他にもいろいろColor構造体への変換方法はあるみたい。
また、Colorクラスのフィールドを直接指定することもできる。
HTML色見本 : 色見本
Colorクラスの全フィールド : Color メンバ
↑ これだとどんな色なのかが分かりにくい。
どんな色なのかを知るには、こっちの方が良いかも。
C#でColorの値をリストアップしてみる - takoashiの開発記録

GridViewのstyle変更 → Excelのフォーマット変更


GridViewをExcelに出力するとき、
そのセルがどんな形式なのかが自動的に判断されてしまい、
数値に変換できる形式(例えば"000001")であれば
そのセルは数値だということになり、先頭のゼロが排除されてしまう("1"と表示される)。

これを防ぐには、強制的にセルの形式(フォーマット)を指定する必要がある。
以下のようにしてGridViewのstyleを指定してExcel出力を行う:

GridView1.Rows[loop].Cells[i].Style.Add("mso-number-format", "\\@");

これで、このGridViewをExcel出力したときに
i番目のCellsが文字列であると指定したことになり、
0から始まる値でも0が排除されずにちゃんと表示される。


FC2 Blogの管理画面が使いやすくなった


FC2 Blogの管理画面が使いやすく、というか見やすくなった。
何で今までそうしていなかったのかと思うくらい、
横に広くなったように感じる、というか実際なっていると思う。

フォントもちょっと変えてる?
行間もちょっと広げてる?

px指定だったのを、%指定に変えたとかなのかな。


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形式で保存されるので、特に問題はないのではないだろうか。


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


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];



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.で作成したバイナリデータを取得する。
以下のような感じ:

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

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

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

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

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

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

◆ 参考
主なMIMEやサンプルソース
ASP.NET(C#)でファイルダウンロード: niyoな日記

MIME一覧
MIMEタイプ一覧


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


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

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

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

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

◆ 数値の符号を取得する

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

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


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


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

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

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

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


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


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

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

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


Google Readerの未読アイテム0


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

midoku0.jpg

気持ちが良いもんだ。


Adsense
ブログ内検索
カテゴリー
最近の記事
カレンダー
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開発の記録
あわせて読みたいブログパーツ
プロフィール

kamii

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

メールフォーム

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

カウンター
checker
ページランク


ブログチャート
現在時刻
全エントリ表示

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

RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。