@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

クライアントへのEXCELファイルの保存

投稿者投稿内容
XYZ
会議室デビュー日: 2003/12/07
投稿数: 11
投稿日時: 2003-12-07 23:20
はじめまして。
VB.NETでWEBアプリケーションの開発をしております。
サーバー上で作成したEXCELファイルをクライアントに保存する機能を作成したいのですが、
開発経験の浅い私にはさっぱり方法がわかりません。
方法としては、EXCELへの貼り付け処理を行い(そこまではなんとかできました)、
そのまま処理を終了せずにクライアントに保存する方法と、
保存時に「名前を付けて保存」ダイアログを出す方法の両方を考えています。

申し訳ありませんが、どなたか教えていただけないでしょうか?
どうか、よろしくお願いします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-08 15:15
詳しい方法は過去にあがっているので、方法だけ。

EXCELへ貼り付けを行う
(PasteSpecialなど、クリップボードを使うものは禁止)

セッションIDなど、一意になるキーを含めたファイル名で保存

バイナリストリームで開く

Response.Writeを使って、バイナリファイルとして返送

ファイルを削除する
XYZ
会議室デビュー日: 2003/12/07
投稿数: 11
投稿日時: 2003-12-08 16:42
Jittaさん、ありがとうございます。
早速、試してみたのですが、
EXCELファイルをいったんサーバーに保存するところまではできたのですが、
「バイナリストリームで開く」というのがうまくいきません。
response.writeを使うところまでは書いたのですが、
保存もせず、ダイアログも表示されないで、
画面にファイル名が表示されるだけになってしまいます。
申し訳ありませんが、もう少し教えていただけないでしょうか。

わがままばかりで申し訳ありませんが、宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-08 17:50
引用:

XYZさんの書き込み (2003-12-08 16:42) より:

「バイナリストリームで開く」というのがうまくいきません。
response.writeを使うところまでは書いたのですが、
保存もせず、ダイアログも表示されないで、
画面にファイル名が表示されるだけになってしまいます。


HttpResponse.BinaryWrite()とか。←MSDN調べてね

あと、「ダウンロード」をキーにここの会議室も検索しておいてください。おそらく、「必要なヘッダの設定」もされていないと思います。
XYZ
会議室デビュー日: 2003/12/07
投稿数: 11
投稿日時: 2003-12-08 18:49
Jittaさん、ありがとうございます。

早速、試してみました。

以下はコードです
******************************************************
(excelに貼り付け、"C:\Inetpub\wwwroot\EXCEL\test.xls"に保存済み)

<ファイル名の指定>
Dim File_Name As String
File_Name = "C:\Inetpub\wwwroot\EXCEL\test.xls"


<MSDNのサンプルより参照>
Dim MyFileStream As FileStream
Dim FileSize As Long

MyFileStream = New FileStream(File_Name, FileMode.Open)
FileSize = MyFileStream.Length

Dim Buffer(CInt(FileSize)) As Byte
MyFileStream.Read(Buffer, 0, CInt(FileSize))
MyFileStream.Close()


<会議室の過去ログより参照>
Current.Response.AddHeader("content-disposition", "attachment;filename =" + File_Name)
Current.Response.ContentType = "application/excel"
Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift-Jis")


Current.Response.BinaryWrite(Buffer)

******************************************************
上記の内容で実行してみましたところ、ダウンロードは出来るようになりました。
ただ、いくつかおかしなところもあります。
「名前を付けて保存」画面で、デフォルトのファイル名がフォーム名になってしまいます。
さらに、ファイルの種類が「ドキュメント」となってしまいます。
これをexcelファイルで素直に保存できるようにできませんでしょうか?

それと、ダウンロード実行前に、「ファイルのダウンロード」という画面が出ますが
(ファイルを開くか、保存するかを選択するものです)
これを出ないようにすることは可能でしょうか?

いろいろお聞きして申し訳ありませんが、ご助言いただけますでしょうか?

お手数をおかけしますが、宜しくお願い致します。









Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-08 21:46
 私も、メインでやっているのは他の人なので詳しいところはわからないのですが。。。

>>>>>
<会議室の過去ログより参照>
Current.Response.AddHeader("content-disposition", "attachment;filename =" + File_Name)
Current.Response.ContentType = "application/excel"
<<<<<
この辺かも。attachmentは「添付」ですから、添付ファイルが「filename=」なのに、フォームのコンテキストタイプ(内容)を「application/excel」にしている、ことになるのではないかな?

詳しいところは「RFC**を参照」という投稿があったと思います。そこに書いてあります。
#え?わたし?翻訳支援ソフトが明日くらいに到着するはず…
XYZ
会議室デビュー日: 2003/12/07
投稿数: 11
投稿日時: 2003-12-09 10:33
Jittaさん、ありがとうございます。

こちらでもいろいろ試してみました。
Current.Response.AddHeader("content-disposition", "attachment;filename =" + File_Name)
のところで、File_Nameにパスまで入ってしまっていたので、"aaa.xls"とだけ指定したところ、
保存ダイアログにもその名称が出るようになりました。
ただ、そのファイル名に日本語が入ると、文字化けをしてしまいます。
これはおそらく、
System.Text.Encoding.GetEncoding("Shift-Jis")
のあたりに問題があるのでしょうね。
もう少しいじってみます。

保存ダイアログの前に、ファイルを開くか保存するかを聞くダイアログが出ることに
ついては、いろいろやりましたが、どうやっても出なくすることは出来ませんでした。
これはどうしようもないのでしょうか。
さらに調査してみます。

また何か情報がありましたら教えて下さい。
ありがとうございました。






Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-09 10:47
引用:

XYZさんの書き込み (2003-12-09 10:33) より:

保存ダイアログの前に、ファイルを開くか保存するかを聞くダイアログが出ることに
ついては、いろいろやりましたが、どうやっても出なくすることは出来ませんでした。
これはどうしようもないのでしょうか。
さらに調査してみます。


 コンテキストタイプが「アプリケーション」になっているから、でしょう。「download/octet-stream」かな?スレッドがあったような気もします。

 ファイル名が日本語の場合も、過去にスレッドがあがっています。探してみてください。

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