DOBON.NET DOBON.NETプログラミング掲示板過去ログ

EXCELファイルの取り込みについて

環境/言語:[Win2000、VB.NET]
分類:[.NET]

いつもお世話になっております。

 今回、EXCEL形式のデータを取り込み、データテーブルにセットするという処理
を作成しています。

 作成するにあたり当初は、EXCELを起動させて手作業で取り込みを行う方法がベ
スト(この方法しか思いつかなかった)だと思っていました。利用させていただい
ている掲示板の過去レスを参照した所、ADO.NETを使用してできるという事が記述
されていました。どのように記述を行えばよいかわかりません。ネットでも検索
してみましたが、サンプルとして載っているページが見当たりませんでした。

○○を調べなさいとか、ヒントでもいいので教えてください。
(ちなみにマイクロソフトのページで記述のあったサンプルは、見れません。
派遣先での作業の為、フォルダを除く権限がありません)
以下がマイクロソフトのページの参照先
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/dv_wrcore/html/wrsamsamplespreadsheetwithtextpulledbyadonet.asp
■No10562に返信(178さんの記事)
>  今回、EXCEL形式のデータを取り込み、データテーブルにセットするという処理
> を作成しています。
>
>  作成するにあたり当初は、EXCELを起動させて手作業で取り込みを行う方法がベ
> スト(この方法しか思いつかなかった)だと思っていました。利用させていただい
> ている掲示板の過去レスを参照した所、ADO.NETを使用してできるという事が記述
> されていました。どのように記述を行えばよいかわかりません。ネットでも検索
> してみましたが、サンプルとして載っているページが見当たりませんでした。
>
> ○○を調べなさいとか、ヒントでもいいので教えてください。
> (ちなみにマイクロソフトのページで記述のあったサンプルは、見れません。
> 派遣先での作業の為、フォルダを除く権限がありません)
> 以下がマイクロソフトのページの参照先
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/dv_wrcore/html/wrsamsamplespreadsheetwithtextpulledbyadonet.asp

  マイクロソフトでは・・・
  http://support.microsoft.com/default.aspx?scid=kb;ja;316934#12

  ですが、見れないなら・・・
  Imports System.Data.OleDb
  として・・・
  Private m_sConn1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\ExcelData1.xls;" & _
"Extended Properties=""Excel 8.0;HDR=YES"""
  として、ADO.NETでのコネクションを作成して下さい。
  EXCELファイルへのパス指定と、EXCELのシート名がテーブル名として
  文字列を作成するようにすればOKです。
  尚、対照シートの1行目をフィールド情報とするかについては
  お解かりであると思っておりますので、あとは頑張って下さい。

以上。
ご回答ありがとうございます。岡田 之仁さん。

リンク先を参照して何とか作成できました。

一応出来たコードを記載します。

Dim strHDR As String

If 列名ある?=TRUE Then
'列名指定あり
strHDR = "YES"
Else
'列名指定なし
strHDR = "NO"
End If

'コネクション情報を作成
Dim m_sConn1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strXlsPath & ";" & _
"Extended Properties=""Excel 8.0;HDR=" & strHDR & ""

Dim objConn As New OleDbConnection(m_sConn1)
objConn.Open()
Dim objCmdSelect As New OleDbCommand("SELECT * FROM [" & strTargertSheetNM & "$]", objConn)
Dim objAdapter1 As New OleDbDataAdapter
objAdapter1.SelectCommand = objCmdSelect
Dim objDataset1 As New DataSet
objAdapter1.Fill(objDataset1, "XlsDT")

すみませんが、一点どうしても気にいらない処理があります。

 列名なしを指定した場合に自動で列名がF1、F2・・といった具合に作成されます。
その部分を固定の文字に置き換えたいのです。列名なしの指定時には、F1、F2
ではなくフィールド1、フィールド2・・といった具合に変更したいです。
 現在は、上記のコードの後に新しくデータテーブルを作成して(列名は、フィー
ルド1、フィールド2・・)、objDataset1の行データのみをコピーする処理を追加
しています。
 処理の順番がスマートではない気がします。もっとスマートに実現可能な方法があ
れば教えて頂けませんでしょうか。
(あくまでも列名なしの指定なので、Excelの1行目に列名をセットするのは無しで
考えます。)

よろしくお願いします。もう少し自分自身でも、考えてみます。結果がでたら解決済み
としたいと思います。
■No10582に返信(178さんの記事)
>  列名なしを指定した場合に自動で列名がF1、F2・・といった具合に作成されます。
> その部分を固定の文字に置き換えたいのです。列名なしの指定時には、F1、F2
> ではなくフィールド1、フィールド2・・といった具合に変更したいです。
>  現在は、上記のコードの後に新しくデータテーブルを作成して(列名は、フィー
> ルド1、フィールド2・・)、objDataset1の行データのみをコピーする処理を追加
> しています。
>  処理の順番がスマートではない気がします。もっとスマートに実現可能な方法があ
> れば教えて頂けませんでしょうか。
> (あくまでも列名なしの指定なので、Excelの1行目に列名をセットするのは無しで
> 考えます。)

  列名が無い場合は、必ずそうなりますネ!仕様のようです。
  DataSetとDataAdapter使われるので、レコードセットの配列番号のように
  取得させることができないので、必ず列名を指定しない方法に固定される
  のであれば・・・

  SELECT F1 as フィールド1,F2 as フィールド2,...

  として、各取得項目(列名)にエイリアスとして新たに列名を付け替えれ
  ばいいことではないでしょうか。

  お試し下さい。

以上。
何度もありがとうございます。岡田 之仁さん。

 私の方でも調査していたのですが、岡田 之仁さんが言われている通り
>仕様のようです。
につきあたりました。

 助言して頂いたとおり、下記の方法で回避したいと思います。
>SELECT F1 as フィールド1,F2 as フィールド2,...

ちなみにこの方法を教えて頂いて、もうひとつの問題も解決しそうです。

問題
 A列に数字と文字が混在している行があった場合数値がNULLに
 なるという問題です(多分勝手に型変換されている為だと思います)。
 例、A1=”あ”A2=”15”

解決策
 SQL文を作成している箇所で、データ変換処理を行えばうまくいきそう。

VB.NETになって変更点が多々あり、覚えるのが楽しいです。
お付き合い頂き、本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板