如何将行插入Excel工作表中的表对象?

时间:2014-12-18 19:32:37

标签: 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(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();
}

结果我将我的行插入到现成的表对象下面:

enter image description here

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

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

但是我收到了一个错误:

  

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

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

enter image description here

5 个答案:

答案 0 :(得分:3)

基于here

  

ADO.NET无法访问XL的Table对象(也称为Lists),也无法访问   范围名称直接或间接引用表的名称或   结构化参考。 ADO.NET可以访问表上的命名范围   引用表的单元格区域。

示例:名称private void addCitiestoMenu() { cityArrayList = RealmHelper.getStoredCities(); SubMenu submenu = mDrawerMenu.getItem(0).getSubMenu(); submenu.setIcon(R.drawable.ic_place_black_24dp); submenu.setHeaderTitle("test"); for (City city : cityArrayList) { int cityId = city.getId(); // Get the id (You'll probably need to replace getId() ) MenuItem item = submenu.add(Menu.NONE, cityId, Menu.NONE, city.getCityName()); item.setIcon(R.drawable.ic_place_black_24dp); } } 是指MyTable。 因此,您可以使用=$A$1:$E$3为例(Range)。在这种情况下,您的Insert语句可能会更改为:

Sheet1$A:E

其他限制:

  

工作簿保护:ADO无法访问受密码保护的工作簿。

     

使用的行:ADO将插入最后使用的行的下方。注意!最后使用的行可以为空。

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

答案 1 :(得分:3)

如果您执行此代码:

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. 您必须在特定位置插入。

答案 2 :(得分:3)

如果您使用的是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();
    }
}

答案 3 :(得分:-1)

试试这个

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;
}

答案 4 :(得分:-2)

我不确定Access C#的工作原理与Excel相同,但这适用于我的电子表格。也许它可以帮到你?

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