- PR -

JavaScriptでCSVファイルに書き出す

1
投稿者投稿内容
ふみぱいん
会議室デビュー日: 2006/07/14
投稿数: 6
投稿日時: 2006-07-15 08:22
今、サーバーがC#.NETで、クライアントは.NET aspxを使用して、システム開発をしています。ieなどで表示した画面の一覧のデータを、hiddenのinputフィールドにサーバー側から吐き出しておき、その内容を、javascript で、CSVファイルに書き出す方法を現在思案中ですが、壁に突き当たっております。だれか、いいアイデアがありましたら、教えていいただけませんでしょうか・・・。
ふみぱいん
会議室デビュー日: 2006/07/14
投稿数: 6
投稿日時: 2006-07-15 10:32
C#側では、以下のようにして画面に吐き出し・・・
System.Text.StringBuilder strb = new System.Text.StringBuilder();
for(i=0; i< 2; i++)
{
 for(y=0; y< 7; y++)
 {
   strb.Append(CSVHeaders[i,y]).Append(",");
 }
 strb.Append("\\r\\n");
}
strb.Append("\\r\\n");

for(i=0; i<TblContents.Length; i++)
{
 for(y=0; y<TblContents[i].Length; y++)
 {
   strb.Append(TblContents[i][y]).Append(",");
 }
 strb.Append("\\r\\n");
}

JavaScriptでは、以下のようにしていますが。
function fncSaveTxt()
{
 alert("始まり");
 FileName = Form1.hdnName.value;
 FileName = FileName + ".csv";
 var fr = self.frSave.document;
 var Data = Form1.hdnCSVdata.value;
 fr.write(Data);
 fr.execCommand("SaveAs",true, FileName);
}
this.hdnCSVdata.Value = strb.ToString();

ちょっと無理やりという感じがするかもしれませんが・・・。
これだと、拡張子を強引に.csvにしているだけで、
保存時には、html/txtでしか拡張子選択肢がありませんが・・・
また、エンコードが、shift-jis/unicodeと試してみましたが、
shift-jisですと、htmlのソースを保存してしまうようで、
また、unicodeだと、テキストデータとして保存してしまうようです。
また、改行コードも、上記のものは認識されず。
そして、エクセルで開いたときには、1つのセルに全テキストが
入れ込まれているような感じになってます。

ファイル形式自体が、csvでは無いからだとは、思いますが。
何か他にいいアイデアがあれば、教えて下さい。

_( ~ o ~ )_


[ メッセージ編集済み 編集者: ふみぱいん 編集日時 2006-07-15 10:39 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-07-17 21:49
引用:

ふみぱいんさんの書き込み (2006-07-15 08:22) より:
今、サーバーがC#.NETで、クライアントは.NET aspxを使用して、システム開発をしています。ieなどで表示した画面の一覧のデータを、hiddenのinputフィールドにサーバー側から吐き出しておき、その内容を、javascript で、CSVファイルに書き出す方法を現在思案中ですが、壁に突き当たっております。だれか、いいアイデアがありましたら、教えていいただけませんでしょうか・・・。


 言いたいことが正確に伝わらなければ、質問には答えてもらえないと思うのですが、これには同意していただけるでしょうか。

 同意いただけるとして、意味のわからない言葉が多数あります。

*サーバーがC#.NETで、クライアントは.NET aspxを使用して
 さっぱり不明。道具を、使い方を理解せずに使うことはできないと思います。
 ASP.NET で、サーバ側コードを C# で書いて、ウェブ アプリケーションを作成している、ということでしょうか。


*ieなどで表示した画面の一覧のデータを、
 「IE 等、ブラウザの画面に表示した一覧データを」、ではないかと思うのですが、どうでしょう?


*壁に突き当たっております。だれか、いいアイデアがありましたら、教えていいただけませんでしょうか・・・。
 ただ「壁に突き当たっております」だけで、どういう状態になっているのかわからなければ、誰も何とも答えようがないと思います。
 単に「良いアイデアがありましたら」と言われても、どういう状態になって欲しいのかわからなければ、誰も何とも答えようがないと思います。
ふみぱいん
会議室デビュー日: 2006/07/14
投稿数: 6
投稿日時: 2006-07-19 11:01
>言いたいことが正確に伝わらなければ、質問には答えてもらえないと思うのですが、これには同意していただけるでしょうか。

すみませんね。私もまだ初心者ですから、どう説明していいやら。

>*サーバーがC#.NETで、クライアントは.NET aspxを使用して
 さっぱり不明。道具を、使い方を理解せずに使うことはできないと思います。

まさしくその通りですが、現在の状況は、使い方を知らずに開発をやらされている状況でして、まさに手探り状態。

>ASP.NET で、サーバ側コードを C# で書いて、ウェブ アプリケーションを作成している、ということでしょうか。

Webサーバー(IIS)で、サーバーではC#.NETを使用して、ウェッブアプリを作成しています。画面はaspxを使用。

> ただ「壁に突き当たっております」だけで、どういう状態になっているのかわからなければ、誰も何とも答えようがないと思います。
その内容については、私の二回目の書き込みでお分かりかと思いますが。

しかし、もう解決方法を見つけましたので、とにかく、私の書き込みにたいしてコメントを書いてくださって有難うございます。

ぱいん

[ メッセージ編集済み 編集者: ふみぱいん 編集日時 2006-07-19 11:01 ]
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-07-19 11:14
よろしければ、どのように解決したのか教えていただけませんか?

(折角公開されている掲示板なのだし、自分の事だけを考えての書き込みではなく、ここを読んでいる人にも勉強になる書き込みを考えた方がいいのではと思います。)
ふみぱいん
会議室デビュー日: 2006/07/14
投稿数: 6
投稿日時: 2006-07-19 13:04
仮に見出しが5列で、9行のデータをaspxのテーブルに出力したとしたら・・・
〔C#側で(サーバー)〕
string[][] strData = new string[10][];
strData[0] = new string[]{"見出し1","見出し2","見出し3","見出し4","見出し5"};
for(int i=1; i<10; i++){
  strData[i] = new string[5];
}
for(i=1; i<10; i++){
 for(int y=0; y<5; y++){
   strData[i][y] = "データ";
 }
}
このデータで、画面のテーブル作成処理を行い、画面が表示される。

〔画面側の処理〕
このデータを画面に設定したあと、画面でCSV出力ボタンを押されたら、

〔サーバーの処理〕
javascriptで、
document.Form1.submit();

としてC#の Page_Loadイベントが実行され
以下、C#での処理です。

StringBuilderを使用して、strData配列に格納された表のデータ値を、CSV形式にして(「,」や「\r\n」(改行コード)を挿入)strbに設定しています。

System.Text.StringBuilder strb = new System.Text.StringBuilder();

for(i=0; i<strData.Length; i++)
{
 for(y=0; y < strData[i].Length; y++)
 {
   strb.Append(strData[i][y]).Append(",");
 }
 if(strb.ToString() != null && strb.ToString() != "")
 {
   strb.Remove(strb.Length-1, 1);
   strb.Append("\r\n");
 }
}

FileName = this.hdnName.Value; //画面からファイル名称を取得
//CSV出力処理
Response.ContentType = "application/octet-stream";
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("Shift-JIS");
//保存ファイル名称の文字化け現象を回避するための処理
Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(FileName + ".csv"));

Response.BinaryWrite(encoding.GetBytes(strb.ToString()));

Response.End();

ネット上のとある方の例を参考にさせてもらいましたが、
それだけでは、保存ファイル名の文字化けという現象が
起こりましたので、その解決策をmicrosoftのサイトで見つけ、
追加しました。


ぱいん

[ メッセージ編集済み 編集者: ふみぱいん 編集日時 2006-07-19 13:17 ]
1

スキルアップ/キャリアアップ(JOB@IT)