sql   server数据库中有表a,字段有“代号”、“姓名”、“科目”、“成绩”。“代号”是自动生成的 
某磁盘下有名为b的Excel文件,其内容是: 
代号    姓名      科目     成绩 
101    张三     数据库   80 
102    李四     C语言    78  
103    王五     vb.net  85 
如何在web窗体中单击某按钮,如“导入”,使b中的数据导入到a中???
Excel文件在客户端,点击“导入”后应先搜索查找到该文件,然后确定后在插入到数据库中。
请问这种功能怎么实现,初学请说的详细一些。

解决方案 »

  1.   

    把excel当作数据源去链接
    然后 select 到 DataTable 然后循环插入 SQL数据库http://www.connectionstrings.com/?carrier=excel
      

  2.   

    说的很具体了
    -----
    1.把excel文件上传server端
    2.读取上传的excel文件(当作数据源来读取就可以了),可以读取到dataset中
    3.循环读取dataset中记录,插入database 中
      

  3.   

    我才学了一星期,很多东西不懂,例如第一步怎么把excel上传server端。分不够的话,我可以加,这对我很重要,希望有人
    能明示。
      

  4.   

    http://blog.csdn.net/laoyingisme/archive/2007/12/28/1999020.aspx
      

  5.   

    从excel全部读到dataset中,然后逐条往sql里插入就行了ole db和sql db的基本操作。
      

  6.   

    我使用FileUpload控件,如何得到上传文件的绝对路径?
    string filepath = FileUpload1.FileName;
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + 
                    " Data Source=" + filepath.Replace(@"\",@"\\") + ";" + 
                    " Extended Properties=Excel 8.0;"; 
    这样得到的只是文件名,它的路径没有,Data Source不正确。
      

  7.   

     
    protected void btnInport_Click(object sender, EventArgs e)
    {
            string filepath = FileUpload1.FileName; 
            
            string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);
           
            if (filename.Substring(filename.LastIndexOf(".") + 1)!= "xlsx")         {             Response .Write ("请选择正确的文件");             return;         } 
            SqlConnection sc = new SqlConnection( ConfigurationManager.ConnectionStrings[1].ConnectionString );        try         {             sc.Open();             string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    " Data Source=" + filepath.Replace(@"\", @"\\") + ";" +                          //"D:\\简历\\Achievement.xlsx"                " Extended Properties=Excel 8.0;"; 
                OleDbConnection conn = new OleDbConnection(strConn);             conn.Open();             OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM fff", conn);             myCommand.SelectCommand.Prepare();             DataSet myDataSet = new DataSet();             myCommand.Fill(myDataSet); 
                conn.Dispose();             myCommand.Dispose(); 
                int c = myDataSet.Tables[0].Rows.Count;             if (c == 0)             {                 Response .Write ("没有满足条件的记录");                 return;             }                         for(int i = 0;i < c; i++)             {                 SqlCommand cmm = new SqlCommand ( " INSERT INTO Achievement (EmpID,Score,Times,Res,Signal)" + " VALUES ( " + 
    "" + myDataSet.Tables[0].Rows[i]["员工ID"].ToString() + ", " + 
    "" + myDataSet.Tables[0].Rows[i]["成绩"].ToString() + ", " + 
    "" + myDataSet.Tables[0].Rows[i]["评定期间"].ToString() + ", " +" 1)" 
    ,sc 
    ); 
    cmm.ExecuteNonQuery(); 
    cmm = new SqlCommand ( 
    "select @@identity from Achievement" 
    ,sc 
    ); 
    object newid = cmm.ExecuteScalar(); cmm.Dispose(); } 
                Response .Write ("成功导入!");             return; 
    }
           catch(Exception ex) 
    {            Response .Write (ex.ToString());            return; 
    }  
            finally         {             if (sc.State == System.Data.ConnectionState.Open)                 sc.Close();         } 
    }
    大家请帮我改改
      

  8.   

    用 Server.MapPath 来获得绝对路径。
      

  9.   

    我将filepath.Replace(@"\", @"\\") 替换成"D:\\简历\\Achievement.xlsx"也不行
    提示
    System.Data.OleDb.OleDbException: 外部表不是预期的格式。 在 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) 在 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.OleDb.OleDbConnection.Open() 在 Adapter_Default.btnInport_Click(Object sender, EventArgs e) 位置 c:\Documents and Settings\Administrator\桌面\NewWet\Default2.aspx.cs:行号 88 另外ASP.NET中有没有OpenDialog这个控件?
     
      

  10.   

    利用循环查找出来每一条记录的内容,但是代号不要填写,因为在数据库中是主键,所以如果填写是不正确的。
    然后用insert into 语句将数据插入数据库中。
    但是这样只能对数据较少的表还可以,一旦表中的字段比较多,那么执行会非常慢。也可以先将数据记录在Xml文件中,在插入数据库中。
      

  11.   

    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 
                    Server.MapPath("ExcelTemp") + @"\" + 
                    FileUpload1.FileName  + ";Extended Properties=Excel 8.0;";
    我写的话对么?“ExcelTemp”是可以任意写的么?
      

  12.   

    我又改为:
    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    FileUpload1.PostedFile.FileName + ";Extended Properties=Excel 8.0;";
    但执行到conn.Open();时提示System.Data.OleDb.OleDbException: 外部表不是预期的格式。这该怎么改。
      

  13.   

    我的Excel表是我在本地建的,不是网上说的导出的,用excel2007。现在总提示 外部表不是预期的格式。
      

  14.   

    Extended   Properties=Excel   8.0
    这个是指office 2003及以下的格式.
    如果是office2007格式,请不要使用.这是execl 2007格式的.
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0;HDR=YES";
      

  15.   

    20楼的问题已经解决了,是连接字符串写的不规范,而不是ls说的那样,如果改成ls那样又会提示12.0未注册。
    以下是我的最新代码:
             string filepath = FileUpload1.FileName;
            string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);
            if (filename.Substring(filename.LastIndexOf(".") + 1) != "xlsx")
            {            Response.Write("请选择正确的文件");            return;        }
            SqlConnection sc = new SqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString);        try
            {            sc.Open();            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    FileUpload1.PostedFile.FileName + ";Extended Properties=Excel 8.0;";            OleDbConnection conn = new OleDbConnection(strConn);            conn.Open();            OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", conn);            myCommand.SelectCommand.Prepare();
                            DataSet myDataSet = new DataSet();            myCommand.Fill(myDataSet, "ExcelTemp");
                conn.Dispose();            myCommand.Dispose();
                int c = myDataSet.Tables[0].Rows.Count;            if (c == 0)
                {                Response.Write("没有满足条件的记录");                return;            }            for (int i = 0; i < c; i++)
                {                SqlCommand cmm = new SqlCommand(" INSERT INTO Achievement (EmpID,Score,Times,Res,Signal)" + " VALUES ( " +
    "" + myDataSet.Tables[0].Rows[i]["EmpID"].ToString() + ", " +
    "" + myDataSet.Tables[0].Rows[i]["Score"].ToString() + ", " +
    "" + myDataSet.Tables[0].Rows[i]["Times"].ToString() + ", " +
    ""+myDataSet .Tables [0].Rows [i]["Res"].ToString()+","+ " 1)"
    , sc
    );
                    cmm.ExecuteNonQuery(); //但执行到此处时出现“'年第三季度' 附近有语法错误。”
                    cmm = new SqlCommand(
                    "select @@identity from Achievement"
                    , sc
                    );
                    object newid = cmm.ExecuteScalar();                cmm.Dispose();            }
                Response.Write("成功导入!");            return;
            }
            catch (Exception ex)
            {            Response.Write(ex.ToString());            return;
            }
            finally
            {            if (sc.State == System.Data.ConnectionState.Open)                sc.Close();        } 
    以下是Excel表中的内容:
    EmpID Score Times       Res
    3 69 2005年第三季度 无
    5 78 2005年第三季度 无
    7 98 2005年第三季度 再接再厉
    数据库中字段属性分别为:int,int,nvarchar(50),ntext;不知又是哪里错了?
      

  16.   

    完美了,只要把sql语句改一下就行。
    唉,放出了150,最后居然自己解决了。
    高兴啊。