次の形式の Excel ファイルがあります。
Column 1 Column 2 Column 3
data1 data2
data1 data2
data1 data2
data1 data2
data1 data2 data3
つまり、最後の行を除いて、列 3 全体が空です。OleDbDataAdapter を介して Excel ファイルにアクセスし、DataTable を返しています。コードは次のとおりです。
query = "SELECT * FROM [" + query + "]";
objDT = new DataTable();
objCmdSQL = this.GetCommand();
objCmdSQL.CommandText = query;
objSQLDad = new OleDbDataAdapter(objCmdSQL);
objSQLDad.Fill(objDT);
return objDT;
ポイントは、このシナリオでは、コードが列 1 と列 2 だけを含む DataTable を返すことです。
私の推測では、JET エンジンはすべての列の最初のセルの型によって列の型を推測しようとします。最初の値が null であるため、列全体が無視されます。
ゼロを埋めようとしましたが、このコードは実際には 3 つの列すべてを返しています。多数の小さなファイルを処理する必要があるため、これは明らかに最も望ましくないソリューションです。
選択範囲の反転 (つまり、 "A1:C5" から "C5:A1" へ) も機能しません。もっとエレガントなものを探しています。
型の不一致 (int 列の varchar セルとその逆) について議論しているいくつかの投稿を既に見つけましたが、実際にはこれに関連するものは何も見つかりませんでした。
読んでくれてありがとう!
編集
またおかしな行動。私は主に Excel 2003 .xls ファイルで作業する必要がありますが、この質問への回答があったので、Excel 2007 .xslx ファイルに対してコードをテストできると思いました。接続文字列は次のとおりです。
string strConn = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + _fileName.Trim() + @";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""";
「External table is not in the expected format」という例外が発生します。これは、ACE/JET と開いているファイルの間にバージョンの不一致がある場合の標準的な例外であると考えられます。
文字列
Provider=Microsoft.ACE.OLEDB.12.0
は、最新バージョンの OLEDB を使用していることを意味します。ちょっと覗いてみたところ、このバージョンは .xlsx ファイルに接続する必要があるすべての場所で使用されています。
バニラ プロバイダー (Excel 12.0 のみ、IMEX も HDR もなし) だけで試してみましたが、同じ例外が発生します。
.NET 2.0.50727 SP2 を使用していますが、アップグレードする時期でしょうか?