QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

ASP.NETでEXCELファイル出力したい

はじめまして!

過去ログを全部読んだ上で常連の皆様方におかれましては、うんざりするような
初歩的な質問をさせて頂きますことをお許し下さい。

社内システムを初めてASP.NETで構築しようと目論んでいるのですが、
Datagridに動的に表示した項目をExcel出力してダウンロードさせる
具体的な手法がよく解りません。

「書籍情報の検索システム」を構築しようとしているのですが、処理内容には…
①ユーザがWEBフォームで検索条件、表示項目を選択

②条件にあった書籍の情報をWEB上のDatagrid(チェックボックス付き)に一覧表示

③チェックのついた行のレコードをEXCELファイル(罫線付き)に出力する。
という、極めて単純なシステム(のハズ^^;)です。

で、よく解らない点としましては…
・複数のユーザの出力要求に対し、どのようなファイル名称でサーバに格納すればいいのか?
 (クライアントPCのIP情報、端末名称等は.NETアプリ側で拾えないんですよね?)
・ユーザが当該ExcelファイルをDLする時に自分が作成したファイル
 しか選べ(見え)ないようにするにはどのようにすればいいのか?
・罫線つきのExcelをコードで書く自信もないので、マクロを仕込んだ
 テンプレートをサーバに置いておいて、それをどうにかしないといけないんでしょうか?
 そうなるとどこまでを.NET側でやってどこからをExcel側でやれば良いのでしょう
 か?
・実際にファイルが生成されてから(コモンダイアログみたいな何か?で)DL選択させる
 までをどのようなコードで記述すれば良いのかもよく見えません。

ちなみに弊社の環境は…
・クライアントマシンのOSはWin95
・ExcelのバージョンはExcel97 SR−2
・サーバはWin2000(サーバ上のExcelも97)
・開発言語はVB.NET(WEBフォーム)
・DBMSはSQL−Server2000
・WEBブラウザはIEの5.5(SP2)
となっています。

ご教示のほど、宜しくお願い致します。

質問者:moondog

回答

こんにちは。

③チェックのついた行のレコードをEXCELファイル(罫線付き)に出力する。

実は私も③番のことが良くわからなくて、
ずっとログを探してみました。
(検索したり、全スレッドをなめたりしました)
ヒントになるログが見つかりませんでした。

ログの検索方法でいいんです、ご教授ください。

投稿者:KAN

編集 履歴 (0)

すみません。訂正です。

誤:ログの検索方法でいいんです、ご教授ください。

正:ログの検索方法でもいいんです、ご教授ください。

よろしくお願いします。

投稿者:KAN

編集 履歴 (0)

①から②まではまぁ、ASP.NETのサンプルになるような内容ですが
③をやるとなると「極めて単純」の範疇からははずれますね。

で、実現方法そのものが複数ありますが、それらは過去ログの
中にきちんと説明されているものばかりだったと思います。

やろうとしてることは複数の実現手段があり、結構
面倒なことである。ただし、その方法については
それなりに説明されている、というのを頭にいれておいて
もういちどログを読むと整理できるかもしれませんね。

#なにが簡単でなにがむずかしいのかわからないのが
 初心者なんだろけどね。

投稿者:小野@どっとねっとふぁん

編集 履歴 (0)

こんにちは。

KANさんの書き込み (2003-05-15 19:08) より:

③チェックのついた行のレコードをEXCELファイル(罫線付き)に出力する。

実は私も③番のことが良くわからなくて、

ずっとログを探してみました。

 問題は2つあると思います。

 1.「チェックのついたレコード」を特定する/出力する
 2.ECXCELで、罫線を付ける

 1は、DataGridを上から回しながら、チェックのついた行だけ処理対象とする、ということでいいですよね。

 2は、私はEXCELで罫線を引を引く処理をマクロ記録し、それをVB.NET上に移しました。

というようなのでよろしいでしょうか。

投稿者:Jitta

編集 履歴 (0)

早速のレス、ありがとうございました。

もう一度Excel関連のログを洗い直してみます。

投稿者:moondog

編集 履歴 (0)

--------------------------------------------------------------------------------

Jittaさんの書き込み より:

1は、DataGridを上から回しながら、チェックのついた行だけ処理対象とする、ということでいいですよね。

2は、私はEXCELで罫線を引を引く処理をマクロ記録し、それをVB.NET上に移しました。
--------------------------------------------------------------------------------

ご返答、ありがとうございます。
マクロ記録を参照するなんて、考えもしなかったんです。
大変参考になりました。

で、.NETからExcelに書込み処理なんですが、
[Insert]処理ができて、[Update]処理はどうしてもできなかったんです。
多分SQL文のカラムの書き方がおかしいと思いますが、
一応、ソースを載せておきます。
よろしくお願いします。

Dim xsConnectionString As String
xsConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
xsConnectionString += "Data Source=" & sDirFileExcelMakingFile & ";"
xsConnectionString += "Extended Properties=Excel 8.0;"
Dim xobjConn As New System.Data.OleDb.OleDbConnection(xsConnectionString)
Dim Sql_Str, SqlCommand

Try
xobjConn.Open()
Catch etype As Exception
'--- エラー処理
Exit Sub
End Try

'--- このインサート文はうまくいきますが。。。
Sql_Str = "INSERT INTO [Sheet$Print_Area] VALUES('.........
SqlCommand = New System.Data.OleDb.OleDbCommand(Sql_Str, xobjConn)
SqlCommand.ExecuteNonQuery()
SqlCommand.Dispose()

'--- 更新はできないんです。カラムの書き方がおかしい?
'Sql_Str = "update [List$Print_Area] set [COLUMN($B$4)] = 'W'"
SqlCommand = New System.Data.OleDb.OleDbCommand(Sql_Str, xobjConn)
SqlCommand.ExecuteNonQuery()
SqlCommand.Dispose()

よろしければ、更新文の正誤をお教え頂ければ幸いです。
よろしくお願いいたします。

投稿者:KAN

編集 履歴 (0)

KANさんの書き込み (2003-05-16 12:03) より:

で、.NETからExcelに書込み処理なんですが、

[Insert]処理ができて、[Update]処理はどうしてもできなかったんです。

多分SQL文のカラムの書き方がおかしいと思いますが、

一応、ソースを載せておきます。

 おお!!ExcelへSQL文でデータを送れるんですか!!そう言えば、技術情報にもそれらしき記述があったなぁ・・・。勉強になりました!!
 しかし、それなら逆に困りました。私がやった方法は、CreateObjectでExcelを起動させて、クリップボード経由でデータをセルに貼り付けていました。だから、エクセルのマクロ記録を利用して、罫線を引けたのです。

 ところで、「Sql_Str = "update [List$Print_Area] set [COLUMN($B$4)] = 'W'"」ですが、COLUMN($B$4)だと、B4のセル固定じゃないですか?

投稿者:Jitta

編集 履歴 (0)

(一応、まとめ&問題提起します)

ExcelにSQL文([SELECT][INSERT])はできましたが、
[Update]文はできなかったんです。
[Delete]文はテストしてませんでした。
ご存知の方がおりましたら、ぜひご教授ください。

で、先ほど[CreateObject("Excel.Application")]をテストしました。
最初は、[ActiveXコンポーネント作成できない]っていうエラーが出まくりです。
ユーザー「ASPNET」に「独自の起動アクセス許可を使う」権限を与えてから、
問題なく使えるようになりました。
Jittaさんから教えて頂いた「マクロ記録を利用して、罫線を引く」こともできました。
ありがとうございます。

実は現在の開発では、雛型のExcelファイルが用意されており、
それをコピーしてから[GetObject("c:\xxx\xxx.xls")]が使えるなら、
最高にいいと思ってます。。。
どうも[ActiveXコンポーネント作成できない]っていうエラーが出てきます。
確かに一回目の実行で、[GetObject("c:\xxx\xxx.xls")]が通ったんですけど。。。

よろしくお願いします。

-------------------------------------------------------------------

 ところで、「Sql_Str = "update [List$Print_Area] set [COLUMN($B$4)] = 'W'"」ですが、COLUMN($B$4)だと、B4のセル固定じゃないですか?
-------------------------------------------------------------------
確かにその通りです^^;。
そのカラムの書き方がわからなくて、適当に書いて[Update]文を検証してみたかったんです。
わかりづらかったことを書いてしまって、すみませんでした。

投稿者:KAN

編集 履歴 (0)

KANさんの書き込み (2003-05-16 19:56) より:

実は現在の開発では、雛型のExcelファイルが用意されており、

それをコピーしてから[GetObject("c:xxxxxx.xls")]が使えるなら、

最高にいいと思ってます。。。

 その、「XXXX.xls」を保存するときに、「名前を付けて保存」で「テンプレート」として保存すればどうですか?必ず新しいワークブック(ファイル)ができますよ。ただし、最初に保存するときは「テンプレート」フォルダが開かれるので注意と、元のファイルを編集するときはダブルクリックではなく、コンテキストメニューから「開く」(デフォルトは「新規作成」)を選択しなければなりません。また、新しいワークブックは保存しなければファイルになりません。
[ メッセージ編集済み 編集者: Jitta 編集日時 2003-05-19 11:05 ]

投稿者:Jitta

編集 履歴 (0)

以前、ADO.NETを使ってExcelへ出力したことがあり、下記のURLを参考にしました。

http://support.microsoft.com/?kbid=316934

この方法では、Deleteは出来ないようです。
また、罫線を引く、といったデータを取り扱う以外の事も無理っぽいですね。
(以前やったときは、参照の追加からCOMでExcel Object Libraryを取り込みました)

参考になれば幸いです。

投稿者:あみぃ

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。