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

WindowsアプリからWebサービスでEXCELダウンロード

1
投稿者投稿内容
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-10-27 13:09
Excel:2003
C#
WinXP-pro
VS2003

いつも参考にさせていただいております。

以前、こちらを参考&アドバイスを頂き、
WEBアプリにてEXCELファイルのダウンロードを行っておりました。

今回、Windowsアプリ(スマートクライアントではありません)で
WebサービスにてEXCELのダウンロードを行いたいという要望がありまして調査中です。
とりあえず単純に、ASP.NETで処理していた部分をWebサービス側に持って来ました。

[Webサービス] TestService.asmx
 -------------------------------------------
[WebMethod]
public string test()
{
System.IO.FileInfo fileInfo = new System.IO.FileInfo("D:/test.xls");
long nSize = fileInfo.Length;
Context.Response.ContentEncoding =
System.Text.Encoding.GetEncoding("shift-jis");
Context.Response.ContentType = "application/octet-stream-dummy";
Context.Response.AppendHeader("Content-Disposition",
"attachment; filename=" + "test.xls");
Context.Response.WriteFile(fileInfo.FullName, 0, nSize);
Context.Response.Flush();
Context.Response.Close();
return "OK"; // リターンは返す必要がないかもしれません
}

Windowsアプリ側
-------------------------------------------
using Client.TestHost; // Web参照

TestService service = new TestService();
string ff = service.test();
-------------------------------------------

Webサービスのみをテストで起動すると、ダウンロードを促す画面が表示され、
[開く]ボタンをクリックすると指定したEXCELファイルが表示されました。
このWebサービスをWindowsアプリから呼んでみたのですが、
VSのWebReferenceのSystem.Web.Services.Protocols.SoapDocumentMethodAttribute属性の部分で、
「System.ArgumentOutOfRangeException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : 負の値ではない数値が必要です」
となってしまいます。

そもそもこの方法でうまくいくのかもわからず、
とりあえず手をつけ始めている次第です。
どなたかアドバイスいただけないでしょうか?
よろしくお願いいたします。


nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-10-27 15:44
こんにちは。

なんかWebサービスの作り方が間違っているような。。。
(といっても自分も詳しくないですが)
Webサービスで公開するメソッドが返すデータは、Responseオブジェクトで返すような作りにするのではなく、通常のメソッドと同様にreturnで返すべきものだと思います。
(いや、ホントに詳しくないからResponseオブジェクトで返すことも可能かもしれないが)

だからこの場合、ファイルを読み込んでそのデータ自体をreturnし、Windowsアプリケーション側で復元し保存してやればよいのだと思います。
以下未検証ですが、次のようなコードでいけるのではないかと。

Webサービス側
コード:
[WebMethod] 
public byte[] test() 
{
	FileStream rfs = new FileStream(@"D:\test.xls", FileMode.Open, FileAccess.Read);
	byte[] readBuffer = new byte[rfs.Length];
	rfs.Read(readBuffer, 0, (int)rfs.Length);
	rfs.Close();
	
	return readBuffer;
}



Windowsアプリ側
コード:
[WebMethod] 

	TestService service = new TestService(); 
	byte[] readBuffer = service.test();

	// ファイルの書き込み(c:\work\test.xlsは適当。ファイルの保存ダイアログだして保存先を決めさせるのがいいと思う)
	FileStream wfs = new FileStream(@"c:\work\test.xls", FileMode.Create, FileAccess.ReadWrite);
	wfs.Write(readBuffer, 0, readBuffer.Length);
	wfs.Close();




みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-10-27 16:37
noderaさん、早速のレスありがとうございます!

ばっちりです。
アドバイス通りで、ファイルのダウンロードができました。
確かにWebサービスのリターンについては強引でしたね。
Webサービス単体のテストでダウンロードダイアログが出てEXCELが表示されたので
つい行けるかな?と思って試してみました。

この方法ですとダウンロードダイアログは表示されず直接クライアントのフォルダに
コピーされますので、
System.Net.WebClientのDownloadFileメソッドでも実現できますね。
WebアプリなどでEXCELのダウンロードを行う場合、ダイアログで「開く」を選択すると
自動的にEXCELファイルが開いたので便利だったのですが。

とにかく疑問が解消され、とてもすっきりです。
ありがとうございました!
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-10-27 21:36
 その前に、Web サービスってどんなもん、ってことを、勉強してみませんか?


 基本的に、SOAP XML のやりとりをするので、それ以外のものは返せません。
Web アプリケーションと同じようにしたということは、
返信するストリームを全く乗っ取ってしまったと言うことです。
 ということは、SOAP XML 中に乗っけてやればいいわけです。


 と書いておいてたら、すでにレスが。。。

引用:

みつんさんの書き込み(2005-10-27 16:37)より:

この方法ですとダウンロードダイアログは表示されず直接クライアントのフォルダにコピーされますので、System.Net.WebClientのDownloadFileメソッドでも実現できますね。
WebアプリなどでEXCELのダウンロードを行う場合、ダイアログで「開く」を選択すると自動的にEXCELファイルが開いたので便利だったのですが。


 Windows アプリケーションの方で、SaveFileDialog を実装すればいいですよね?
(っつうか、IEというアプリケーションがそういう作りになっている、と)
 開く対象のファイルが安全かどうかも確認せずに開けることが便利かどうかわかりませんが(まぁ、自動検査していれば大丈夫だろうけど)、保存後にプロセスをキックしてやれば、ユーザからは“自動的に”Excel が起動しますよね?
___________________________________________________________________
□ written by Jitta on 2005/10/27
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2004-Sept.2006

_________________
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-10-28 12:05
Jittaさん、いつもありがとうございます。

引用:

 Windows アプリケーションの方で、SaveFileDialog を実装すればいいですよね?
(っつうか、IEというアプリケーションがそういう作りになっている、と)
 開く対象のファイルが安全かどうかも確認せずに開けることが便利かどうかわかりませんが(まぁ、自動検査していれば大丈夫だろうけど)、保存後にプロセスをキックしてやれば、ユーザからは“自動的に”Excel が起動しますよね?



はい、全く持ってその流れでいきたいと思います。
自分でキックいたします。

「Web サービスはSOAP XMLを返す。」基本でしたね。
今回もみなさま、色々ありがとうございました。
1

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