如何在Excel工作表内插入行对象表单?

尝试将行插入到现有的表格对象中有困难。 这是我的代码片段:

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”。 确保对象存在,并且正确拼写其名称和path名称。 如果“MyTable”不是本地对象,请检查您的networking连接或联系服务器pipe理员。

正如你所看到的,名字为MyTable表格确实存在。 如果有人能够揭示这个谜团,我将非常感激。

在这里输入图像说明

    基于这里 :

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

    示例:名称MyTable引用=$A$1:$E$3 。 所以你可以使用RangeSheet1$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. 您必须插入特定位置。

    如果您使用Microsoft.ACE.OLEDB提供程序,请注意它不支持命名的范围。 您需要提供工作表的名称[Sheet1$]或工作表的名称,然后是范围[Sheet1$A1:P7928] 。 如果未提供范围,则会将该表定义为使用范围,该范围可能包含空行。

    处理空行的一种方法是删除它们,但驱动程序不支持DELETE操作。

    另一种方法是首先计算具有非空Id的行数,然后使用结果为INSERT语句定义表的范围:

     using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); string SheetName = "Sheet1"; string TableRange = "A1:P{0}"; // count the number of non empty rows using (var cmd1 = new OleDbCommand(null, conn)) { cmd1.CommandText = String.Format( "SELECT COUNT(*) FROM [{0}$] WHERE ID IS NOT NULL;" , SheetName); TableRange = string.Format(TableRange, (int)cmd1.ExecuteScalar() + 1); } // insert a new record using (var cmd2 = new OleDbCommand(null, conn)) { cmd2.CommandText = String.Format( "INSERT INTO [{0}${1}] (ID, Title, NTV_DB, Type) VALUES(7959, 8,'e','Type1');" , SheetName, TableRange); cmd2.ExecuteNonQuery(); } } 

    尝试这个

     private void GetExcelSheets(string FilePath, string Extension, string isHDR) { string conStr=""; switch (Extension) { case ".xls": //Excel 97-03 conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"] .ConnectionString; break; case ".xlsx": //Excel 07 conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"] .ConnectionString; break; } //Get the Sheets in Excel WorkBoo conStr = String.Format(conStr, FilePath, isHDR); OleDbConnection connExcel = new OleDbConnection(conStr); OleDbCommand cmdExcel = new OleDbCommand(); OleDbDataAdapter oda = new OleDbDataAdapter(); cmdExcel.Connection = connExcel; connExcel.Open(); //Bind the Sheets to DropDownList ddlSheets.Items.Clear(); ddlSheets.Items.Add(new ListItem("--Select Sheet--", "")); ddlSheets.DataSource=connExcel .GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); ddlSheets.DataTextField = "TABLE_NAME"; ddlSheets.DataValueField = "TABLE_NAME"; ddlSheets.DataBind(); connExcel.Close(); txtTable.Text = ""; lblFileName.Text = Path.GetFileName(FilePath); Panel2.Visible = true; Panel1.Visible = false; } 

    我不确定Access C#与Excel的工作方式是一样的,但是这个工作在我的电子表格上。 也许它可以帮助你?

     Table3.ListRows[1].Range.Insert(Excel.XlInsertShiftDirection.xlShiftDown);