2009-05-22 4 views
11

によって切り捨てられる私は、Excel 2000/2003ワークブックからデータを取得するために、OleDbConnectionオブジェクトのクラスを使用しています:Excelのセルの値がOLEDBプロバイダ

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
          "Data Source=" + filename + ";" + 
          "Extended Properties=\"Excel 8.0;IMEX=1\";"; 

OleDbConnection connection = new OleDbConnection(connectionString); 
connection.Open(); 

// code to get table name from schema omitted 

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection); 
var myDataSet = new DataSet(); 
dataAdapter.Fill(myDataSet, "ExcelInfo"); 

は、今では、長さより大きいとワークシートでその細胞が判明255文字以上が切り捨てられています。これはMicrosoft.Jet.OLEDBプロバイダの制限ですか、それとも何かできることはありますか?

誰でも?

答えて

17

ExcelのOLEDBプロバイダは、最初の8行のデータに基づいてDataTypesを自動的に決定しようとしますが、これは接続文字列のHDR = Yes/Noプロパティで設定できます。さらに、テキスト列に適用できる複数のタイプがあります。メモ型は255文字以上を保持するので、最初の8行のいずれもそれを持たない場合は、データ型が正しく設定されません。 Microsoft Support

注:ここで説明したよう

これを変更する方法は、TypeGuessRowsと呼ばれるレジストリ設定を変更することにより、ある値が0であればTypeGuessRowsキーに対する値の有効範囲は、しかし、0〜16ですスキャンされるソース行の数は16384です。したがって、ファイルが非常に大きい場合は、最大の行が最初であることを確認してください。

+1

おかげでこれを追加します。私のインストーラはユーザーのレジストリを変更する必要があるため、やや醜い解決策ですが、うまくいくと思います。だから、管理者がインストーラを実行する限り。 –

+1

私はここでは、マイクロソフトの提案を理解していない/あなたが16に変更した場合、それはちょうど最初の16行をチェックしないのですか? – leora

+1

@ooo 0に変更すると、すべての行がスキャンされます。ただし、大規模な表にパフォーマンスに影響を及ぼす可能性があるため、注意してください。 – rmoore

1

お試しください。OleDBAdapter Excel QA私はスタックオーバフローで投稿しました。

私は、ワークシートのセルを埋め(行[0] [4])445文字/ワット、それがうまく働いた... はouputをのためのコードの末尾に

// DataSet:   
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2]; 
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4]; 

string rowZeroColumn3 = row0Col3.ToString(); 
string rowZeroColumn4 = row0Col4.ToString(); 

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);   
関連する問題