【问题标题】:Weird behaviour when writing to excel with oledb使用 oledb 写入 excel 时的奇怪行为
【发布时间】:2012-09-04 02:03:44
【问题描述】:

我只是想向单元格写入任何内容,但即使单元格为空,行数似乎也在增加。例如,我在 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();

【问题讨论】:

  • 如果你插入到数据库中,你会得到一个新行,为什么 Excel 会有所不同?您可能需要更新/
  • 这就是我所担心的。好的,谢谢。
  • 您创建的软件工具的目的是什么?或者这只是一个教程?
  • 您打算如何获取添加到电子表格的值,这将通过 GUI 完成吗?

标签: c# excel insert oledb


【解决方案1】:

我的同事 Juliusz 是正确的:实际上,每张工作表都被视为数据表......

但这不是在 Excel 中定义“表”的唯一方法:您可以在工作簿中查询命名范围或明确指定的地址:

    SELECT * FROM [Sheet1$A1:F255]

如果工作簿包含命名范围“MyTable”,定义为“=Sheet1!A1:F255”,则可以查询如下:

    SELECT * FROM [MyTable]

我建议您在包含一些可识别数据的定义范围内测试您的插入,以便您可以准确地看到正在发生的事情。

哦,对明智的说一句:查看运行此查询是否会创建 Excel.Exe 的隐藏实例或使用比您预期的更多的内存...并检查退出时是否已正确清理。

【讨论】:

    【解决方案2】:

    每张工作表都被视为一个数据库表,因此对它的任何操作都是在集合的基础上完成的。正如 Steve Wellens 指出的那样,如果您想在同一张工作表上为 F2 列输入值,则需要使用 UPDATE 语法。

    另一个选项是创建一个新工作表并通过 INSERT 将值放在那里。最后,您可以添加另一个工作表,将这些结果合并在一起(其行为类似于 SQL 数据库中的 VIEW)

    【讨论】:

      【解决方案3】:

      看看您在上面所做的事情,每次执行这段代码时,您都会在电子表格中添加一个新行。

      使用 INSERT 命令会如您所愿,即使您尝试添加没有值的数据,它也会插入一个新行。

      如果您想解决这个问题,请在调用这段代码之前检查您添加的值不为空或不等于“”。

      如果您使用的是 GUI,请在将更改提交回电子表格之前检查值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多