3

Excelをdatatableにインポートするために、私は単純なコードを使用しています。

string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0}; Extended Properties=Excel 12.0;", physicalFolder + FileUpload1.FileName);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", connectionString);
DataSet ds = new DataSet();

エクセルの行の1つにあるとき、私の行が以下のようになっている場合

ここに画像の説明を入力してください

文字列が省略され、私のデータセットは次のようになります

ここに画像の説明を入力してください

ただし、いくつかの文字列を追加し、アップロードが次のようになっている場合:

ここに画像の説明を入力してください

次に、私のデータセットは文字列を省略していないように見えます。

ここに画像の説明を入力してください

4

4 に答える 4

3

oledbconnection 文字列を次の形式に変更してみてください。

コード スニペット OleDbConnection con = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\book1.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'");

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

于 2014-10-16T11:56:15.317 に答える
2

MD.Unicorn の答えは 100% 正しいわけではありません。OLEDB プロバイダーは、TypeGuessRows列のデータ型を決定するために読み取られる行数を決定するために指定された設定を使用します。残念ながら、この設定は接続文字列では指定できないため、システム レジストリで変更する必要があります。詳細については、この質問を参照してください。

于 2013-03-06T09:18:01.447 に答える
1

これは、プロバイダーが列の最初の行 (ヘッダー行の後の行) から列の型を決定するためです。最初の行に数値が含まれている場合、列の型はdoubleまたは別の数値型であるため、文字列値を含めることはできません。

私はあらゆる方法を試しました (事前にテーブル構造を設定する、 を使用するDataReader、セルのフォーマットを変更する、...) がすべて失敗しました。Microsoft.Jet.OLEDBプロバイダーの問題のようです。サードパーティの Excel 読み取りライブラリを使用することを強くお勧めします。利用可能なオープン ソース ライブラリが多数あります。

ファイルが Excel 2007 (.xlsx) ファイルの場合は、EPPluseを使用することを強くお勧めします。NuGet パッケージとしても入手できます。

それ以外の場合は、この回答を見て、さらにいくつかのライブラリを見つけることができます。

于 2013-03-06T09:09:15.813 に答える