@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

EXCELファイルをDataSetへ格納

1
投稿者投稿内容
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-01-13 17:07
初めて書き込みます。

現在、EXCELファイルをDataSet(OleDb)に格納するところで問題が起きています。
(EXCELファイルデータの中身は文字(全角/半角)や数字、なんでも可の状態)
やりたいことはEXCELファイルの中身をそのままの形で格納すること。
しかし、実際はカラムによって文字や数字が格納されずNULLが格納される場合があります。
(カラムによって異なる)

そこでEXCElを制御するのは(システム的に)不可能なので、DataSetのカラムのTypeを全項目すべてStringにしてからfillで格納しました。
しかし、それでもカラムによって文字を格納できなかったり数字を格納できなかったりと原因不明です。

以下にコードを記述します。
おわかりになられる方は是非返信をお願いします。


************************************************************************

Public OraDA As System.Data.OleDb.OleDbDataAdapter 'データアダプターの宣言
Public dtSet As System.Data.DataSet 'データセットの宣言

=======================================

Dim Connection_String As System.Data.OleDb.OleDbConnection
Dim col As DataColumn
Dim i As Integer

Connection_String = New System.Data.OleDb.OleDbConnection
    ("Provider=Microsoft.jet.OLEDB.4.0;" & _
"Data Source=" & strExcelFile & ";" & _
"Extended Properties=Excel 8.0;")

OraDA = New System.Data.OleDb.OleDbDataAdapter _
("select * from [" & strSheet & "]", Connection_String)

dtSet = New System.Data.DataSet
dtSet.Clear()
OraDA.FillSchema(dtSet, SchemaType.Source)
'---各項目のスキーマをstringに!!
For i = 0 To intColCnt - 1
col = dtSet.Tables(0).Columns.Item(i)
col.DataType = System.Type.GetType("System.String")
col.MaxLength = 255
Next

OraDA.Fill(dtSet)

Connection_String.Close()

************************************************************************

ちなみに・・・
DataSetの中身をXMLにはきだして確認したところ・・・以下(1カラムのみ記述)のように出力されました。全カラム同内容です。

     ・
     ・
     ・

<xs:element name="科目" minOccurs="0">
- <xs:simpleType>
- <xs:restriction base="xs:string">
<xs:maxLength value="255" />
</xs:restriction>
</xs:simpleType>
</xs:element>

     ・
     ・
     ・
よろしくお願いします。

[ メッセージ編集済み 編集者: TAKAMIKI 編集日時 2005-01-13 17:10 ]
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-01-13 17:57
昔、私も同じ現象で悩みました。
たしか列に数字と文字(数字以外)があった場合
多いほうが優先され、少ない方はNULLになってしまったような気がします(多分です。。。)
当時、いろいろ調査しまたが、結局.NETの仕様なんだなってことで解決しませんでした。
お役に立てなくて申し訳ないです(TдT)



nicima
会議室デビュー日: 2005/01/14
投稿数: 5
投稿日時: 2005-01-14 09:40
私も同じ現象で悩んだことがあります。

以下のページの「データ型の混在についての注意」にあるような仕様に
なっているようなので、記述されているように
ExtendedPropertiesにIMEX=1を追加すれば、正常に
データを取得できるかもしれません。
http://support.microsoft.com/kb/257819/ja/

はずしてたら、ごめんね。
TAKAMIKI
常連さん
会議室デビュー日: 2005/01/13
投稿数: 33
投稿日時: 2005-01-14 10:38

burton999さん、nicimaさん、返答ありがとうございました。

同じ悩みを抱えていた人がいたってことで少し救われました。。。

で、nicimaさんのおっしゃるとおり実行いたしましたところうまくいきました!

前回のコードとの変更箇所を以下に記述。

***********************************************************

Connection_String = New System.Data.OleDb.OleDbConnection
           ("Provider=Microsoft.jet.OLEDB.4.0;" & _
"Data Source=" & strExcelFile & ";" & _
"Extended Properties=""Excel 8.0;IMEX=1;""")

***********************************************************


IMEX=1の1行追加するだけでよかったとは・・・。
本当に感謝しています。

ありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)