如何在Excel表格中插入行到表格对象?

15

我在尝试向一个已经存在的表对象中插入行时遇到了困难。以下是我的代码片段:

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

输入图像描述


我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
表格末尾是否总是有空行? - peege
你的表名字末尾没有空格,像"MyTable "这样?只是一个想法... - James Heffer
4个回答

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

你认为应该如何处理空行?这并不是真正的问题。真正的问题是如何在Table对象中插入行。 - Denis Molodtsov

2
如果您执行以下代码:
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. 你必须在特定位置插入。

非常感谢,Dmitry。我很快会尝试您的解决方案并告诉您是否有效。 - Denis Molodtsov
我不确定是否可以在特定行插入数据。您是否有示例代码可以包含在答案中? - Denis Molodtsov

-1

我不确定Access C#是否与Excel相同,但这在我的电子表格上起作用。也许它可以帮助你?

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

问题要求提供一个 ADO.NET 的解决方案。 - Rubens Farias

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接