[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.085 ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた
ADOでExcel(*.xls)に接続 .GetRowsで全件読み込んでみた
本文(発行内容)
<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とわかりやすくアクセスする方法って、なさそう・・・・
-【けんぞう!】---------------------------------------------------------
ASPが利用可能なレンタルサーバーをお探しのアナタ、
http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介
『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳)
------------------------------------------------------------------------
/*
* 4.終わりの挨拶 </HTML>
*/
今回は、
ASPでADOを使用して*.xlsと接続して、
.GetRowsで全件メモリ上の配列に取り込んでみました。
なんか、まだ、サクっとxxxx!B3みたいに出来なかったけど、
参考になったかなぁ・・・・
いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、
今後とも、よろしくお願いします。
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告