尝试使用ACE.OLEDB.12.0在Excel 2010 2013中更新单元格,但只有第一行正在更新

时间:2013-11-07 03:09:29

标签: c# connection-string oledb excel-2010 oledbconnection

我正在尝试更新excel中的单个单元格,以下代码完全适用于excel 2007,我甚至不需要安装AccessDatabaseEngine!它应该工作!但是当我在Excel 2010或2013上运行代码时。第一行仅按最后一行数据更新!例如,如果我想更新单元格A中的10行,则只有A1应该由应该存储在A10中的数据更新!

我认为ACE.OLEDB.12.0驱动程序有一些bug。我希望已经解决问题的人在这里分享解决方案。

请记住,我已经安装了AccessDatabaseEngine.exe并尝试使用版本2007和2010并获得相同的结果!

我有几个月的存货我真的很感激,如果有人可以提供帮助!

void my(){
        string filelink = "C:\\test.xlsx";
        try
        {
            System.Data.OleDb.OleDbConnection MyConnection;
            System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();

            string sql = null;
            MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filelink + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO\"");
            MyConnection.Open();
            myCommand.Connection = MyConnection;




             sql = "UPDATE[sheet1$A1:A1] SET F1 = '" + textBox1.Text.ToString() + "'";
             myCommand.CommandText = sql;
             myCommand.ExecuteNonQuery();

             sql = "UPDATE[sheet1$B1:B1] SET F1 = '" + textBox2.Text.ToString() + "'";
             myCommand.CommandText = sql;
             myCommand.ExecuteNonQuery();

             sql = "UPDATE[sheet1$B2:B2] SET F1 = '" + textBox3.Text.ToString() + "'";
             myCommand.CommandText = sql;
             myCommand.ExecuteNonQuery();
             MyConnection.Close();           
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

        }

2 个答案:

答案 0 :(得分:0)

  

在调用/执行多个更新命令时,请确保   在每次更新结束时,一切都被正确清除。我有   通过创建另一个将获取文件的新方法来修改您的代码   link和sqlcommand字符串作为参数执行。

     

这个函数的主要职责是调用给定的命令   并正确配置所有连接和命令对象,以便   可以在没有任何麻烦的情况下调用下一个命令。

void my()
            {
                string filelink = "C:\\test.xlsx";

                sql = "UPDATE[sheet1$A1:A1] SET F1 = '" + textBox1.Text.ToString() + "'";
                ExecuteMyCommand(filelink,sql);

                sql = "UPDATE[sheet1$B1:B1] SET F1 = '" + textBox2.Text.ToString() + "'";
                ExecuteMyCommand(filelink,sql);

                sql = "UPDATE[sheet1$B2:B2] SET F1 = '" + textBox3.Text.ToString() + "'";
                ExecuteMyCommand(filelink,sql);

            }

            private void ExecuteMyCommand(String filelink,String sql)
            {
     using (System.Data.OleDb.OleDbConnection MyConnection =
                        new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filelink +";Extended Properties=\"Excel 12.0 Xml;HDR=NO\""))
                {
                     System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand();
                     MyConnection.Open();
                     myCommand.Connection = MyConnection;
                     myCommand.CommandText = sql;
                     myCommand.ExecuteNonQuery();
                }
            }

答案 1 :(得分:0)

我为HOURS努力解决同样的问题。经过多次研究无济于事,我发现我可以更新特定单元格的唯一方法是执行INSERT ...即使已经存在数据,我只需要更新。试试这个:

sql = "INSERT INTO[sheet1$B2:B2] VALUES ('" + textBox3.Text.ToString() + "')"