如何在Excel工作表中向表对象插入行?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我很难将行插入到现有的表对象中。下面是我的代码片段:

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"C:\myExcelFile.xlsx" + ";Extended Properties=\"Excel 12.0;ReadOnly=False;HDR=Yes;\"";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = conn;

    string insertQuery = String.Format("Insert into [{0}$] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);
    cmd.CommandText = insertQuery;
    cmd.ExecuteNonQuery();
    cmd = null;
    conn.Close();
}

因此,我将行插入到现成的表对象下面:

我还尝试在表对象中插入数据,如下所示:

 string insertQuery = String.Format("Insert into [{0}$].[MyTable] (ID, Title,NTV_DB, Type ) values(7959, 8,'e','Type1')", TabDisplayName);

但我有个错误:

Microsoft Access数据库引擎找不到“MyTable”对象。确保该对象存在,并确保正确拼写其名称和路径名。如果“MyTable”不是本地对象,请检查网络连接或与服务器管理员联系。

如所见,表名为MyTable确实存在。如果有人能对这个谜团有所了解,我会非常感激的。

提问于
用户回答回答于

ADO.NET不能访问XL的表对象(也就是列表),也不能访问直接或间接引用表名或结构化引用的范围名称。ADO.NET可以访问引用表的单元格范围的表上的命名范围。

示例:名称MyTable=$A$1:$E$3。所以你可以用Range例如(Sheet1$A:E)为此目的。在这种情况下,INSERT语句可以更改为如下内容:

string insertQuery = "INSERT INTO [Sheet1$A:E] (ID, Title,NTV_DB, Type) VALUES (7959, 8,'e','Type1')"; 

其他限制:

工作簿保护:ADO无法访问受密码保护的工作簿。 使用过的行:Ado将插入最后一个用过的行下面。注意!最后使用的行可以是空的。

Tables如前所述。

用户回答回答于

如果执行以下代码:

var contents = new DataTable();
using (OleDbDataAdapter adapter = new OleDbDataAdapter(string.Format("Select * From [{0}$]", TabDisplayName), conn))
{
    adapter.Fill(contents);
}
Console.WriteLine(contents.Rows.Count);//7938

将看到7938(截图中的最后一行号)。当插入新行时,它插入到7939位置。忽略(7929、7930、...)行中的空内容,因为EXCEL知道最后一个数字是7938。

解决办法:

  1. 必须删除Excel文件中7928之后的所有行。
  2. 必须插入特定位置。

扫码关注云+社区