<ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた>
こんにちは、三流プログラマーのKen3です。 前回のASP ADO Excel読み込みの続きで、 .GetRowsメソッドで少し遊べそうだったので、連続発行します。/* * 1.今回のキッカケ */
掲示板で下記の質問をもらいました ------ ><ADOでExcelファイル(*.xls)とやっと接続できた(ほっ)>のページ、とって >も役に立ちました! >サーバーにエクセルが入ってないのに、一生懸命 >Set xlApp = Server.CreateObject("Excel.Application") >でつなごうとしてました(^^*) > >で、すみません、初歩的なことを教えてください・・・ >Set xlApp = Server.CreateObject("Excel.Application")では、セルの値を参照 >する時に、 ><% Response.Write xlSht.Range("b3").Value %> >でよかったのですが、このように、ADOを使う場合はどういう指定になるんで >しょうか。。 > >ACCESSのDBなら、 ><%= rs.Fields("test").Value %>ですよね。 ------ と、 b3のセルへのアクセス方法について、質問をもらいました。 に対して、前回解答したのが、 http://www.ken3.org/cgi-bin/test/test084-1.asp で、 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test084.xls") & ";" strSQL = "select * from [Sheet1$]" Rs.Open strSQL, Con, 0 とExcel接続、シート指定でレコードセットを作成して、 列名無しで接続できるが、先頭行が強引にフィールド名となってしまう。 B3のセルに対して、アクセスするには、 先頭行(A1やB1,C1,D1)がフィールド名となっているので、 Open時のカーソルは、A2,B2,C2と2行目からのスタートなので、 3行目に行くために、.MoveNextで1行空読みして、 Response.Write "Rs.MoveNext<br>" Rs.MoveNext '1行飛ばす Response.Write "Rs.Fields(1)は<big>[" & Rs.Fields(1) & "]</big>です<br>" なんて感じで逃げてました。 なんかなぁ・・・イマイチ(笑)と思いつつ、イロイロと探ってました。/* * 2.ADO .GetRows を発見 */
http://www.ken3.org/cgi-bin/group/asp_ado_excel.asp に ADO Excel接続関係の情報をまとめてます。 ADOでMDBを使いSQLを発行して遊んでいるサンプルは、 http://www.ken3.org/cgi-bin/group/asp_ado_mdb.asp にまとめてます。 と 宣伝を入れつつ、 いろいろとWeb上で探していたら、 ADOで .GetRows を使用して、 ~~~~~~~~~~~~~~ MDBからデータを一気にメモリに展開しているサンプルを見かけた。 おっ、 ADOは接続が違うだけで、共通で使えると聞いたような、さっそく使ってみました。/* * 3.サンプルを作ってみた(行列の違いでハマった) */
読み込むテストデータは下記のような感じです。 A列 B列 C列 D列 1: 列の項目名がなかったら? 2: c2どうなるの? 3: b3のセルはここ 4: a4のせるはここ 5: d5に1つ端っこ 6: 名前 三流君 7: 住所 東京都の田舎町 8: 好きな球団 横浜ベイスターズ 9: 10: 名前範囲も付けてません END? ※シート名はデフォルトのよくみかける[Sheet1]に作りました、 ブック名はtest084.xlsで、aspと同じディレクトリにFTPでUPしてあります ↑が作成した表のイメージです。 このtest084.xlsに対して、接続文字を作成して、 シートをテーブル代わりにしてADOでアクセスします。 '接続文字 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test084.xls") & ";" 'SQL文 Sheet1$として、シートのみ指定してみます strSQL = "select * from [Sheet1$]" '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly ここまでは、前回のコピー、 で、やっと 今回説明したい.GetRowsの登場 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 'rs.GetRowsで読み込む dataBOX = Rs.GetRows() 'レコードセットを配列にする あれれ、たった1行? こんな感じで、Rs.GetRows()とすると、 2次元配列でレコードセットの内容を作成してくれます。 あとは、テストで表示してみました。 Response.Write "dataBOX(3,5)=[" & dataBOX(3,5) & "].." あれ?エラーだよ Microsoft VBScript 実行時エラー エラー '800a0009' インデックスが有効範囲にありません。: '[number: 5]' /cgi-bin/test/test085-1.asp, 行 58 なんで? 実は、返された配列のdataBOXの中身は、 変数(列,行)の並びだったんですね。 ~~~~~~~~~~~ ExcelのCells(行,列)と見事に間違えてしまいました。 あと、先頭行は、やはり項目名として使われているので注意が必要です。 それと、 えっ、まだあるの? 配列が0番目から始まるので、やはりExcelのCells(行,列)は1からと混同しないでね。 あとは、まだあるの?えっと(オイオイ) あっ、当たり前の話だけど、全件メモリ上の配列に読み込むので 件数などが少ないデータで使ってね(考えて使ってね) ※件数少なければ、.GetRowsで一気に読むのもありかなぁ。 http://www.ken3.org/cgi-bin/test/test085-1.asp で、テストできます。 ※実行して、Cells(行,列)との違いを見てください。 ソースは、下記のような感じです(test085-1.asp) <%@LANGUAGE=VBScript%> <html> <head> <title>ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた</title> </head> <body> <h1>ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた</h1> test085-1.asp<br> ASPからADOを使用してExcel(*.xls)に接続して、<br> [Sheet1$]でシートにアクセスして、レコードセットを作成後、<br> <strong>rs.GetRows</strong>でレコードセットから配列を作成する<br> <br> <hr> <% 'ADO DB Recordset オブジェクトを作成する、英文そのままじゃん Set rs=Server.CreateObject("ADODB.Recordset") '接続文字 Con = "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & _ Server.MapPath("test084.xls") & ";" Response.Write "作った、使った接続文字列は<br>" Response.Write "<CODE>Con = <b>" & Con & "</b></CODE><hr>" 'SQL文 Sheet1$として、シートのみ指定してみます strSQL = "select * from [Sheet1$]" Response.Write "作った、使ったSQL文字列は<br>" Response.Write "<CODE>strSQL = <b>" & strSQL & "</b></CODE><hr>" '接続文字列、SQLを渡して、レコードセットを開く Rs.Open strSQL, Con, 0 '0=adOpenForwardOnly Response.Write "<CODE>Rs.Open strSQL, Con, 0</CODE>" Response.Write "で、レコードセットを作成しました<hr>" 'rs.GetRowsで読み込む dataBOX = Rs.GetRows() 'レコードセットを配列にする Response.Write "<CODE>dataBOX = <b>rs.GetRows</b></CODE>" Response.Write "で、レコードセットを配列イメージで読み込む<hr>" Response.Write "配列のイメージを表示する<br>" Response.Write "dataBOX(3,0)=[" & dataBOX(2,0) & "]<br>" Response.Write "dataBOX(1,1)=[" & dataBOX(1,1) & "]<br>" Response.Write "dataBOX(0,2)=[" & dataBOX(0,2) & "]<br>" Response.Write "dataBOX(0,4)=[" & dataBOX(0,4) & "].." Response.Write "dataBOX(1,4)=[" & dataBOX(1,4) & "]<br>" Response.Write "dataBOX(0,5)=[" & dataBOX(0,5) & "].." Response.Write "dataBOX(1,5)=[" & dataBOX(1,5) & "]<br>" Response.Write "dataBOX(0,6)=[" & dataBOX(0,6) & "].." Response.Write "dataBOX(1,6)=[" & dataBOX(1,6) & "]<br>" Response.Write "dataBOX(0,8)=[" & dataBOX(0,8) & "].." Response.Write "dataBOX(3,8)=[" & dataBOX(3,8) & "]<br>" Rs.Close %> こんな感じで、<b>.GetRows</b>で配列に取り込み使用可能<br> </font> <hr> </body> </html> う〜ん、なかなかB3とわかりやすくアクセスする方法って、なさそう・・・・/* * 4.終わりの挨拶 </HTML> */
今回は、 ASPでADOを使用して*.xlsと接続して、 .GetRowsで全件メモリ上の配列に取り込んでみました。 なんか、まだ、サクっとxxxx!B3みたいに出来なかったけど、 参考になったかなぁ・・・・ いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。
次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません
広告:
DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く
VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]