2

次の形式の 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 を使用していますが、アップグレードする時期でしょうか?

4

1 に答える 1

7

私はあなたの状況を再現し、次のように 3 つの列を正しく返しました。つまり、最初の 2 つの列にはデータが完全に入力され、3 番目の列にはデータが含まれる最後の行まで null が含まれていました。

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
DataTable dt = new DataTable();
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);

adapter.Fill(dt);

Access Database Engine(ACE)古いプロバイダーの後継であるプロバイダーを使用したことに注意してくださいJoint Engine Technology(JET)。私の結果は、2 つの間の動作の違いを表している可能性があります。もちろん、まだ使用していない場合は、ACEMicrosoft も使用すると思われるので、プロバイダーを使用することをお勧めします。Extended Propertiesまた、接続の次の点に注意してください。

「HDR=はい;」最初の行にデータではなく列名が含まれていることを示します。「HDR=いいえ;」反対を示しま​​す。

「IMEX=1;」は、「混合」(数値、日付、文字列など) のデータ列を常にテキストとして読み取るようにドライバーに指示します。このオプションは、Excel シートの書き込みアクセス ネガティブに影響を与える可能性があることに注意してください。

これが役立つかどうか教えてください。

于 2010-12-01T16:36:01.080 に答える