0

セルに何かを書き込もうとしていますが、セルが空であっても行数が増えているようです。たとえば、列 F1 に 20 個のセルが入力されています。F1 に挿入すると、21 個のセルが満たされました。次に、その下に空のセルがある F2 に挿入しようとしましたが、F2:22 に書き込みます。F2:1に挿入するはずじゃないの?私がはっきりしていることを願っています。

コードは次のとおりです。

string conStr = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\\sample.xls';Extended Properties=\"Excel 12.0;HDR=YES;\"";
OleDbConnection oleDbCon = new OleDbConnection(conStr);
oleDbCon.Open();
System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();
myCommand.Connection = oleDbCon;
string sql = "Insert into [Sheet1$] (abc) values ('value')";
myCommand.CommandText = sql;
myCommand.ExecuteNonQuery();
oleDbCon.Close();
4

3 に答える 3

1

同僚の Juliusz は正しいです。実際、各シートはデータ テーブルとして扱われます...

しかし、これが Excel で「テーブル」を定義する唯一の方法ではありません。ワークブック内の名前付き範囲または明示的に指定されたアドレスをクエリできます。

    SELECT * FROM [Sheet1$A1:F255]

ワークブックに「=Sheet1!A1:F255」として定義された名前付き範囲「MyTable」が含まれている場合、次のようにクエリを実行できます。

    SELECT * FROM [MyTable]

何が起こっているのかを正確に確認できるように、識別可能なデータを含む定義された範囲で挿入をテストすることをお勧めします。

ああ、賢明な言葉: このクエリを実行すると、Excel.Exe の非表示のインスタンスが作成されるか、予想よりもはるかに多くのメモリが使用されるかどうかを確認してください...そして、終了時にこれが適切にクリーンアップされていることを確認してください。

于 2012-09-03T18:03:44.780 に答える
0

上記で行っていることを見ると、このコードを実行するたびに、スプレッドシートに新しい行が追加されています。

INSERTコマンドを使用すると、期待どおりに実行され、値のないデータを追加しようとしても、新しい行が挿入されます。

これを回避したい場合は、このコードを呼び出す前に、追加する値がnullまたは""に等しくないことを確認してください。

GUIを使用している場合は、スプレッドシートに変更を送信する前に値を確認してください。

于 2012-09-03T16:47:06.817 に答える
0

各シートはデータベース テーブルとして扱われるため、シートに対する操作はセット単位で行われます。Steve Wellens が指摘したように、同じシートの列 F2 に値を入れたい場合は、UPDATE 構文を使用する必要があります。

もう 1 つのオプションは、新しいシートを作成し、そこに INSERT を介して値を配置することです。最後に、これらの結果をマージできる別のシートを追加できます (SQL データベースの VIEW のように動作します)。

于 2012-09-03T16:43:30.340 に答える