4

.Net の OleDb を使用して、最初の行が空になる Excel テーブルをインポートしようとしました。後でセルを Excel スタイルのセル名「A1、A2、...」にマップできるように、DataTable に空の行を保持したいと考えています。しかし、何をしても最初の行は削除されます。

Excel ファイルは次のようになります。

 -   -   -
 ABC XY  ZZ
 1   2   3
 4   4   5

「-」は空のセルです。(インポート形式には影響しません。)

簡略化されたコード:

        string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"file.xls\";Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"";
        string mySheet = "Sheet1$";

        OleDbConnection connection = new OleDbConnection(cnnStr);
        DataSet Contents = new DataSet();
        using (OleDbDataAdapter adapter = new OleDbDataAdapter("select * from [" + mySheet + "]", connection))
        {
            adapter.Fill(Contents);
        }

        Console.WriteLine(Contents.Tables[0].Rows.Count); // prints: 3
        Console.WriteLine(Contents.Tables[0].Rows[0].ItemArray[0]); // prints: ABC

その空の行を保持する方法はありますか?

ps: Excel から読み取るときに空の行を数える方法を見つけましたが、再現できませんでした。

4

2 に答える 2

2

この問題は、OLEDB プロバイダーの TypeGuessRows 機能に関連しているようです。簡単に言えば、Excel 列のデータは任意の型にすることができます。OLEDB プロバイダーは、シートの最初の 8 行をスキャンしてデータ型を推測し、Majority Type (サンプル内の値の数が最も多いデータ型) を特定します。マジョリティ タイプでないものはすべて破棄されます。

詳細な説明については、このブログ投稿を参照してください。

動作について説明しているこのMS KB 記事と同様に。

(TypeGuessRows 動作の回避策セクションまでスキップします)

テストとして、投稿したサンプルに似たファイルを作成しましたが、すべての列をテキストとしてフォーマットしてファイルを保存しました。投稿したコードを実行すると、最初の行が空の文字列である 4 つの行が返されることがわかりました。

また、レジストリを変更して、TypeGuessRows 設定を 0 (ファイル内のすべてのデータをスキャンして各列のデータ型を特定する) に変更すると、最初の空白行が返されるかどうかを確認することもできます。私の推測では、これは役に立ちません。

于 2012-04-04T13:44:27.547 に答える
0

OleDbDataAdapter は、最初の行をヘッダーと見なします。最初の行を取得するには、データテーブルのヘッダーからデータ行を作成します。そして、最初の場所に挿入します。

  DataTable dt = Contents.Tables[0];

  DataRow dr = new DataRow();
  int i = 0;
  foreach (DataColumn column in dt.Columns)
  {
    dr[i] = column.ColumnName.ToString();
    i++;
  }
  dt.Rows.InsertAt(dr, 0);
于 2012-04-04T13:28:56.757 に答える