5

データ定義を含む Excel シートを使用して、SQL Server の一括挿入で使用される .fmt ファイルを作成する C# プロジェクトの修正に取り組んでいます。

私の問題は、Excel ファイルの下部に空白行があることがあり、私が取り組んでいる C# パーサーが、データ定義を含む実際の行数よりも多い行数を検出することです。

そのため、fmt ファイルの 2 行目にはより多くの行があり、最後に到達して読み込もうとすると、一括挿入によって例外がスローされます。

たとえば、データを含む 50 行と空白行が 50 行しかありません。fmt ファイルの 2 行目には 100 が含まれます (1 行目は SQL Server バージョン用です)。3 行目から 52 行目は 50 行のデータ定義です。一括挿入が行 53 に到達しようとすると、列の例外の数が返されます。

C# パーサーは、Ace OleDB 12 を使用して Excel 97 形式のファイルに接続します。

SQL は次のとおりです。

var commandText = string.Format("SELECT * FROM [{0}$]", SpreadSheetName);

SQL コードに WHERE 句を追加して、空でない "A" 列を持つ行のみを選択しようとしましたが、うまくいきません。

SELECT * FROM [{0}$] WHERE [A] <> ''

コマンド テキストを SQL コードで拡張して、特定の条件が満たされた Excel からデータ行のみを抽出する方法はありますか?

4

1 に答える 1

8

スプレッドシートにヘッダーがある場合(Excelの「A」、「B」などの列ヘッダーを意味するわけではありません)、条件でそれらを使用できます。をインスタンス化するときに、接続文字列で指定する必要がありますOleDbConnection

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

次に、次の行に沿ってSQLを実行できます。

string SQL = "SELECT * FROM [Sheet1$] WHERE [Name] <> ''";

スプレッドシートにヘッダーがない場合でも、WHERE句を使用できますが、「F1」、「F2」などで列を参照し、ヘッダーを使用しないように接続文字列を設定する必要があります。

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=\"Excel 8.0;HDR=NO;\"";
string SQL = "SELECT * FROM [Sheet1$] WHERE [F1] <> ''"
于 2012-12-10T22:00:25.173 に答える