Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Excel工作表中向表对象插入行?_C#_Windows_Excel_Ado.net - Fatal编程技术网

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

C# 如何在Excel工作表中向表对象插入行?,c#,windows,excel,ado.net,C#,Windows,Excel,Ado.net,我在尝试将行插入现有表对象时遇到困难。以下是我的代码片段: 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(conne

我在尝试将行插入现有表对象时遇到困难。以下是我的代码片段:

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
的表确实存在。如果有人能解开这个谜,我将不胜感激

我不确定Access C#的工作原理是否与Excel相同,但这在电子表格中对我有效。也许它能帮助你

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

如果执行此代码:

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位置。忽略(79297930,…)行中的空内容,因为excel知道最后一个数字是7938

解决方案:

  • 您必须删除excel文件中7928之后的所有行
  • 您必须在特定位置插入

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

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

    另一种方法是首先计算Id为非空的
    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;
    }
    

    我已经编辑了你的标题。请参阅“”,其中一致意见是“不,他们不应该”。表的末尾是否总是有空行?表名的末尾没有类似“MyTable”的空格?只是想一想…这个问题需要ADO.NET解决方案非常感谢你,Dmitry。我将很快尝试您的解决方案,并告诉您它是否有效。我不确定是否可以在特定行插入数据。您是否有可以包含在答案中的示例代码?您是否建议处理空行?这其实不是什么问题。真正的问题是如何在表对象中插入行