以下是我写的代码,可以执行,但数据量大的时候操作很慢(比如说excel文档中有几万条记录)请教如何修改可以提高效率         private void InputExcel(string pPath)  //pPath: excel文档路径
        {
            string conn = "Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + pPath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
            OleDbConnection oleCon = new OleDbConnection(conn);
            oleCon.Open();
            string Sql = "select * from [Sheet1$]";
            OleDbDataAdapter mycommand = new OleDbDataAdapter(Sql, oleCon);
            DataSet ds = new DataSet();
            mycommand.Fill(ds, "[Sheet1$]");
            oleCon.Close();
            int count = ds.Tables["[Sheet1$]"].Rows.Count;
            string tQybs = "";
            string tQyname = "";
            string tQyzch = "";
            for (int i = 0; i < count; i++)
            {
                tQybs = ds.Tables["[Sheet1$]"].Rows[i]["企业标识"].ToString().Trim();
                tQyname = ds.Tables["[Sheet1$]"].Rows[i]["企业名称"].ToString().Trim();
                tQyzch = ds.Tables["[Sheet1$]"].Rows[i]["注册号"].ToString().Trim();
                if (!tempqy.CheckqyBs(tQybs)) //判断是否重复
                {
                    tempqy.InsertTempqy(tQybs, tQyname, tQyzch, TextBox1.Text.Trim(), DateTime.Now); //数据添加到sql server
                }
            }
        }

解决方案 »

  1.   

    1\先将string Sql = "select * from [Sheet1$]";的DataTable存为Session
    2\用ajax分次导入,可以是一次一条,也可以是几条,几十条,几百条,看情况和需要而定,顺带还可以做个进度条什么的,总之是不让页面超时
      

  2.   

    直接用SQL Server的导入功能好了,貌似你还有个逐条校验?
      

  3.   

    http://blog.csdn.net/cnceohjm/article/details/7765930
      

  4.   


    不能给我一段ajax分次导入 加上进度条的示例代码   我是初学的 对这方面不是很了解
      

  5.   

    不知你的数据库是什么版本的数据库?
    想写一二个例子给你参考:
    http://www.cnblogs.com/insus/archive/2012/09/22/2698515.htmlhttp://www.cnblogs.com/insus/archive/2013/03/13/2957382.html
      

  6.   

    由于是基于FineUI,所以可以这么做,但思路是一样的js部分
    btnAppRun为一个隐藏的按钮,绑定onClick为btnAppRun_Clickhf_rowIndex为一个隐含域,初使值为0,每执行一次就加+1btnAppRun_Click执行完后,重新调用nextImport()
    如果判断不是最后一条,就执行btnAppRun_Click,否则结束
        //导入下一条记录
        function nextImport() {
            var row_index = parseInt(jQuery("#" + hf_rowIndex).val());
            if (row_index < rowcount) {
                setProgress(parseInt(((row_index + 1) * 100) / rowcount));
                //setProgress(row_index);
                jQuery("#" + btnAppRun).click();
            }
            else {
                //开始
                var x0 = X(btnAppStart);
                X.state(x0, { "Enabled": false });
                x0.x_setDisabled();
                //暂停
                var x1 = X(btnAppStop);
                X.state(x1, { "Enabled": false });
                x1.x_setDisabled();
                //执行
                var x2 = X(btnAppRun);
                X.state(x2, { "Enabled": false });
                x2.x_setDisabled();
                Ext.MessageBox.show({
                    title: "信息",
                    msg: "程序已执行完必,是否要关闭窗口!",
                    buttons: Ext.MessageBox.OKCANCEL,
                    icon: 'ext-mb-warning',
                    fn: function (btn) {
                        if (btn == 'cancel') {
                            return false;
                        } else {
                            X('Window_Import').box_hide();
                        }
                    }
                });
            }
        }
    .cs部份protected void btnAppRun_Click(object sender, EventArgs e)
    {
       DataTable impdt = Session["imp_inventoryClass"] as DataTable;//这里是数据源
       
       int rowindex = Utils.StrToInt(hf_rowIndex.Text, 0);
       if (rowindex < impdt.Rows.Count)
       {
         hf_rowIndex.Text = (rowindex + 1).ToString();
         _inv.CreateClass(info, false)//这里是执行添加到数据库
          PageContext.RegisterStartupScript("nextImport();");
       }
    }
      

  7.   

    导入嘛  一句SQL语句就能实现的事情,何必写这么写代码.insert into table select * from 
    openrowset(
    'Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=Yes;IMEX=1;Database=D:\6总装任务.xlsx',
    'select * from [0ETC100295$]')
      

  8.   

    而且说到效率 难道 你不知道 ado里有一个东西 叫SqlBulkCopy吗?先select * from openrowset('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=Yes;IMEX=1;Database=D:\6总装任务.xlsx','select * from [0ETC100295$]')返回DataTable 
    然后使用
    System.Data.SqlClient.SqlBulkCopy
    WriteToServer一样很快 都不是一条一条的
      

  9.   

    试试这个方法。
    http://blog.csdn.net/jason_dct/article/details/8217616
      

  10.   

    使用SqlBulkCopy可以快速导入   
    但我还想判断是否有重复    
    有什么好方法可以解决
      

  11.   

    if (!tempqy.CheckqyBs(tQybs)) //这里如果是循环取值判断就会慢
     {
     tempqy.InsertTempqy(tQybs, tQyname, tQyzch, TextBox1.Text.Trim(), DateTime.Now); 
     //这里是逐行链接就会慢
     }//////////
    不知道你的tempqy是怎么写的,可以把要比对的值实现放在一个table里面
    然后没有比对上的就写一个新的table里面
    这样就有了一个完全没有比对上的新table了,插入就可以了
      

  12.   

    楼上的意思是tempqy全部数据读到table 
    之后逐条比较?这样的话似乎也不快的 
    如果Excel中有10W条记录  也要再循环10W次判断 有没有什么更好的方法
      

  13.   

    貌似呢tempqy全部数据读到table 
    之后逐条比较,这是在内存里面进行的,速度是非常快的。你只要把比对完成后的table使用SqlBulkCopy复制到数据库里面不就行了嘛
      

  14.   

    我跟你说,没啥好办法。遍历excel,依次执行sql的insert语句。嫌执行的慢,就限制下excel的行数。我研究很久了,没啥好办法。