3

誰かがここで私を助けてくれることを願っています...

.xlsx ファイルを DataTable に読み込んでから、C#.Net を使用して情報を処理しようとしています。

基本を実行して、OLEDB を使用して接続すると、データが読み込まれ、DataGridView に出力してデータを確認します。

私が抱えている問題は、一部のセル (ごく一部) が Excel ファイルに含まれるデータをロードしないことです。たとえば、私の例では、セル「C3」は、Excel のこの行の他のすべてのセルと同様に、一般的な形式のセルであり、その内容をロードしません。

実際のセルは MEMBERSHIP としてロードする必要がありますが、グリッドビューに出力すると空白が表示されるか、DataRow / Col 値をデバッグすると、Excel ファイルにこのセルのデータが含まれていても空白になります。このセル MEMBERSHIP の内容を 123456 のような数値に変更すると、この値は正常に読み込まれますが、値を文字に戻すと、再び空白が返されます。

セルの大部分 (15 個中 13 個) は、2 つを除いてこの行にロードされ、同じ形式です。

コードで使用している接続文字列は次のとおりです。実際にこのサイトから取得しました:):

try
{

string tabsheet = Path.GetFileNameWithoutExtension(FullFileName); 
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FullFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=NO'";

var adapter = new OleDbDataAdapter("SELECT * FROM [" + tabsheet + "$]",connectionString);

adapter.Fill(aDataTable); 
}
catch (Exception er)
{
logfile.AddToFile("GetDataTableFromCsv exception: " + er.Message);
}

立ち往生、助けて!:)

4

1 に答える 1

5

私の推測では、数値である文字列値「MEMBERSHIP」を持つセルの上にある同じ列にいくつかのセルがあると思います。これにより、OLEDB はこれらの列のデータが数値であると推測するため、数値以外の値は無視されます。

解決策は、conn 文字列の拡張プロパティ セクションに IMEX=1 を含めることです。

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FullFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1;'"; 

connectionstrings.comの Excel エントリには、このプロパティ設定が説明されており、警告も含まれています。

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

于 2012-06-02T05:39:45.857 に答える