C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Excelの取込み


(過去ログ 29 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■13760 / inTopicNo.1)  Excelの取込み
  
□投稿者/ そら (1回)-(2008/02/04(Mon) 17:14:18)

分類:[.NET 全般] 

お世話になります
環境はWinXP,VB.Net2005,Excel2003,SQLServer2005です
エクセルデータを取り込んでテーブルに書き込んで、エラーがあればエクセルに書き出して表示するプログラムを作っています
得意先コード  商品金額
1200      1000
1210      1AB
1220      1230
一例として上記3つがあったとして
Dim oleCn As New OleDb.OleDbConnection()
Dim oleCm As New OleDb.OleDbCommand()
Dim oleDa As New OleDb.OleDbDataAdapter()
Dim dt As New DataTable()
Dim strWork(1) As String
Dim intRow As Integer = 0

'エクセルの場所とエクセルファイルを指定(Me.txt_PATH.Textから)
oleCn.ConnectionString = _
      "Provider=Microsoft.Jet.OLEDB.4.0; " + _
      "Data Source=" & Me.txt_PATH.Text & ".xls" & ";" + _
      "Extended Properties=""Excel 8.0;HDR=YES;"""

oleCm.Connection = oleCn

oleCm.CommandText = "Select * from [Sheet1$] "

oleDa.SelectCommand = oleCm

Try
    oleDa.Fill(dt)
Catch ex As Exception
    oleDa.Dispose()
    oleDa = Nothing
    oleCm.Dispose()
End Try

Do While intRow < dt.Rows.Count - 1
    strWork(0) = dt.Rows(intRow).Item(0).ToString   '得意先コード
    strWork(1) = dt.Rows(intRow).Item(1).ToString   '商品金額

    intRow += 1     '次の行へ
Loop

oleDa.Dispose()
oleDa = Nothing

READ_EXCEL = True
以上の様に記述しています
取り込み時、商品金額が上の例だと「1210 1AB」の商品金額がDBNullになってしまっています
エラー出力時には空欄(DBNull)で出てしまうのできちんと「1AB」と取りたいのですが
どの様にすれば取る事が出来るのでしょうか
別例として商品金額に1ABや文字列の方が多く入っていると数字の方が空欄(DBNull)になってしまいます

どうかよろしくお願いします

引用返信 編集キー/
■13766 / inTopicNo.2)  Re[1]: Excelの取込み
□投稿者/ 魔界の仮面弁士 (602回)-(2008/02/04(Mon) 18:15:01)
2008/02/04(Mon) 18:44:50 編集(投稿者)

No13760 (そら さん) に返信
> 取り込み時、商品金額が上の例だと「1210 1AB」の商品金額がDBNullになってしまっています
> エラー出力時には空欄(DBNull)で出てしまうのできちんと「1AB」と取りたいのですが
> どの様にすれば取る事が出来るのでしょうか

インポートモードを指定するために、接続文字列の Extended Properties に
"IMEX=1" の指定を加えてください。この数値は、
 0 - Export mode
 1 - Import mode
 2 - Linked mode
を意味しています。(インポート モードでは、データは読み込み専用となります)


Jet は、Excel の先頭から数行(規定値は8行)のデータを読み込み、列のデータ型を決定します。

そしてExcel の列が「数値のみ列」だと認識された場合、そこにテキストデータが含まれていると、
DBNull として処理されたり、アクセス時にエラーとなる場合があります。

また、テキストと数値の両方が「混在」していると認識された場合には、
既定のデータ型(通常は Text)に変換されて処理されます。


このデータ型判定は、レジストリの
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel
の設定に依存しています。

TypeGuessRows … 規定値は8。型判定のためにスキャンされる行数。(0だと全行スキャン)
ImportMixedTypes … 規定値はText。複数の型が混在した場合に使われる型。

8 で不足だと思う場合は、適宜設定を変更しておいてください。
(ImportMixedTypes は、IMEX=1 の時のみ有効です)


この設定は、他の Jet アプリケーションに対しても影響を与えるので、注意してください。

OS全体に対する設定を変更したくないのであれば、HKEY_LOCAL_MACHINE ではなく、
HKEY_CURRENT_USER の下に、カスタムの JET 設定を組み込み、それを用いることもできます。
引用返信 編集キー/
■13767 / inTopicNo.3)  Re[1]: Excelの取込み
□投稿者/ やじゅ (92回)-(2008/02/04(Mon) 18:24:56)
No13760 (そら さん) に返信
> 取り込み時、商品金額が上の例だと「1210 1AB」の商品金額がDBNullになってしまっています
> エラー出力時には空欄(DBNull)で出てしまうのできちんと「1AB」と取りたいのですが
> どの様にすれば取る事が出来るのでしょうか
> 別例として商品金額に1ABや文字列の方が多く入っていると数字の方が空欄(DBNull)になってしまいます
>

参考にはなると思います。
Excel ワークシートをリンクする際のデータ型問題を回避する方法
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsExcelLinkDataType.html
引用返信 編集キー/
■13806 / inTopicNo.4)  Re[2]: Excelの取込み
□投稿者/ そら (2回)-(2008/02/05(Tue) 09:39:57)
魔界の仮面弁士さん、やじゅさんありがとうございます
IMEXを入れて1に設定した所、1ABと取り込む事が出来ました

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -