6

まず、私はここで深海に出ていると言いたいです。なぜなら、OleDbDataAdapterを使用してExcelと「対話」するために、社内の他の誰かによって作成されたコードにいくつかの変更を加えているだけで、慣れていないからです。それと。そこには私がたどることができないバグが1つあります。

OleDbDataAdapterを使用して、約450行のExcelファイルを読み込もうとしています。

コードでは、次のように実行されます。

connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + path + "';" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\"");
connection.Open();
OleDbDataAdapter objAdapter = new OleDbDataAdapter(objCommand.CommandText, connection);
objAdapter.Fill(objDataSet, "Excel");

foreach (DataColumn dataColumn in objTable.Columns) {
  if (dataColumn.Ordinal > objDataSet.Tables[0].Columns.Count - 1) {
    objDataSet.Tables[0].Columns.Add();
  }
  objDataSet.Tables[0].Columns[dataColumn.Ordinal].ColumnName = dataColumn.ColumnName;
  objImport.Columns.Add(dataColumn.ColumnName);
}

foreach (DataRow dataRow in objDataSet.Tables[0].Rows) {
   ...
}

1つを除いて、すべてが正常に機能しているようです。2番目の列は6739、3920などのほとんど4桁の数字で埋められますが、5行目は8201NOや8205NOのような英数字の値になります。これらの5つのセルは、英数字の内容ではなく空白の内容であると報告されています。Excelをチェックインしました。この列のすべてのセルは、テキストとしてマークされています。

ちなみにこれはxlsファイルであり、xlsxではありません。

これらのセルがDataRowで空白として表示されているのに、数値のセルは正常に表示されている理由について、誰かが手がかりを持っていますか?英数字の内容が適切に表示されている他の列があります。

4

3 に答える 3

8

何が起こっているのかというと、Excelは、スプレッドシートの列の最初のいくつかの値に基づいて、その列にデータ型を割り当てようとしているということです。その列のプロパティを見ると、数値列であることがわかると思います。

問題は、jetを使用してそのスプレッドシートを照会しようとしたときに発生します。数値列を処理していると見なし、varchar値を検出すると、静かに何も返されません。不可解なエラーメッセージすら出てこない。

考えられる回避策として、英数字の1つをデータの最初の行に移動してから、解析を試すことができます。英数字の行の値を取得し始めると思います...

この記事を見てください。この問題について詳しく説明します。また、次のような回避策についても説明します。

ただし、JETのドキュメントに従って、接続文字列を介してレジストリ設定をオーバーライドできます。IMEX= 1(拡張プロパティの一部として)を設定すると、JETは、「ImportMixedTypes」に関係なく、すべての列タイプをUNICODEVARCHARまたはADVARWCHARとして設定します。キー値.hey

于 2010-09-28T22:15:32.183 に答える
1

IMEX=1「混合データをテキストとして読み取る」という意味です。

ただし、いくつかの落とし穴があります。Jetは、データが混合されているかどうかを判断するためにいくつかの行のみを使用します。混合されている場合、これらの行はすべて数値であり、この動作が得られます。

詳細については、 connectionstrings.comを参照してください。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]見つかったレジストリREG_DWORD「TypeGuessRows」を確認してください。これが、Excelが列のデータ型を推測するために最初の8行のみを使用しないようにするための鍵です。すべての行をスキャンするには、この値を0に設定します。これにより、パフォーマンスが低下する可能性があります。IMEX = 1オプションを追加すると、8行後にIMEX機能が設定される可能性があることにも注意してください。代わりにIMEX=0を使用して、レジストリTypeGuessRows = 0(すべての行をスキャン)を強制的に機能させます。

于 2010-09-28T22:21:03.450 に答える
1

助けていただければ、OleDbデータプロバイダーのものを使用してExcelにアクセスすることはお勧めしません。他の人が指摘したまさにその理由のために、私は問題しかありませんでした。大きなスプレッドシートを扱っている場合も、パフォーマンスが低下する傾向があります。

このオープンソースソリューションを試すことができます:http: //exceldatareader.codeplex.com/

于 2010-09-28T23:24:26.097 に答える