现在的位置: 首页 > 综合 > 正文

Excel导入数据库(一)

2013年06月29日 ⁄ 综合 ⁄ 共 6840字 ⁄ 字号 评论关闭

     

  最近做系统用到了将Excel的数据导入SQL
Server
中,下面介绍一下如何将Excel中的数据导入SQL Server中。

    首先,分析一下如何将Excel导入SQLServer中,要想能进入SQLServer系统中,首先将得将Excel的数据全部取出存成DataTable;其次,在界面层创建新的datatable并且将之前获取的DataTable中的值按格式放入界面层的Datatable中。最后将存好值得DataTable存入数据库中,代码如下:

      根据Excel存放路径将Excel的数据存入DataTable中,代码如下:

   

using System.Linq;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;
namespace ExamSystemV3.BLL.Teacher
{
    public class CreateExcelDataBLL
    {
        //构造方法
        public CreateExcelDataBLL()
        {
        }
        /// <summary>
        /// 传入excel路径,转换为datatable
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public DataTable CreateExcelDataSource(string url)
        {
            //定义一个DataTable数据表
            DataTable dt = null;

            //获得excel数据
            string connetionStr = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + url + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
            //从Excel表的Sheet1单元格获取数据
            string strSql = "select * from [Sheet1$]";
            OleDbConnection oleConn = new OleDbConnection(connetionStr);

            OleDbDataAdapter oleAdapter = new OleDbDataAdapter(strSql, connetionStr);
            try
            {
                //把Excel数据填充给DataTable
                dt = new DataTable();
                oleAdapter.Fill(dt);
                //返回数据表
                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                oleAdapter.Dispose();
                oleConn.Close();
                oleConn.Dispose();
                //删除上传的Excel文件(因为该文件的存在会占用多余的网站空间)
                if (File.Exists(url))
                {
                    File.Delete(url);
                }
            }
        }
    }
}

          DataTable中的数据存入SQL
Server
中,代码如下:

       

         /// <summary>
        /// 导入信息
        /// </summary>
        /// <param name="dt">数据</param>
        /// <returns>导入成功返回true,失败返回false</returns>
        public bool ImportInfo(DataTable dt)
        {
            int flag = 0;
            DbTransaction DbTran = new DbTransaction();
            //获得连接
            SqlConnection conn = DbTran.GetConnection();
            //开启事务
            SqlTransaction trans = DbTran.GetTransaction(conn);
            try
            {
                //遍历导入   
                for (int i = 0; i < dt.Rows.Count; i++)
                {          
                    Insert(dt.Rows[i]);
                    flag = i;    
                }

                //事务提交
              DbTran.Commit(trans);
                return true;

            }
            catch (Exception ex)
            {
                //回滚事务
                DbTran.Rollback(trans);
                throw new Exception(flag.ToString() + "行,错误原因(" + ex.Message + "注:如果出现错误的行号大于Excel中最大行,请清除最大行后的内容!)");
            }
            finally
            {
                DbTran.Close(conn);
            }
        }

       在界面层对Excel的有效性验证,及导入,代码如下:

  //导入
        protected void btnImportStudent_Click(object sender, EventArgs e)
        {
            //虚拟考生业务逻辑层
            StuVirtualBLL Stuvirtualbll = new StuVirtualBLL();
            //BLL层把Excel转化为datatable类
            ExamSystemV3.BLL.Teacher.CreateExcelDataBLL createExcelData = new CreateExcelDataBLL();
           
            //获取上传文件地址
            string url = fupImportStudent.PostedFile.FileName.ToString();

            if (url == "")
            {
                //数据源为空,弹出提示:请选择Excel文件!
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请选择Excel文件!');</script>");
                return;
            }

            //如果文件扩展名不是xls则提示文件格式不正确
            if (url.Substring(url.LastIndexOf("."), url.Length - url.LastIndexOf(".")) != ".xls")
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('文件类型不正确,请选择扩展名为.xls的文件!');</script>");
                return;

            }
            string urlLocation = url.Substring(url.LastIndexOf("\\") + 1);//获取文件名

            DataTable dtStudent;
            //在系统中建文件夹up,并将excel文件另存
            this.fupImportStudent.SaveAs(Server.MapPath("~\\UploadFile") + "\\" + urlLocation);//记录文件名到服务器相对应的文件夹中

            //获得文件路径
            string strpath = Server.MapPath("~\\UploadFile") + "\\" + urlLocation;

            //把上传的Excel转换为datatable
            dtStudent = createExcelData.CreateExcelDataSource(strpath);
            /*-------------------------判断数据源是否合法------------------------*/
          
            //定义要求的字段数据
            string[] headfields = { "教工号", "学生姓名" };
            //判断dtStudent中是否包含全部要求的字段
            for (int i = 0; i < headfields.Length; i++)
            {
                //只要有一个字段不被包含,则提示"数据源缺少必要的字段",并退出循环和整个方法
                if (!dtStudent.Columns.Contains(headfields[i]))
                {
                    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('数据源缺少必要的字段,请检查Excel数据源!');</script>");
                    //退出方法
                    return;
                }
            }

            //判断数据源中是否有数据
            if (dtStudent.Rows.Count == 0)
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('Excel文件中没有任何数据,请填充数据!');</script>");
                //退出方法
                return;
            }

            //判断是否有相同的行
            DataView dvStudent = new DataView(dtStudent);
            if (dvStudent.Count != dvStudent.ToTable(true, "教工号").Rows.Count && dvStudent.Count != dvStudent.ToTable(true, "考试ID").Rows.Count)
            {
                Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('Excel中有相同的教工号,教工号不能相同!');</script>");
                //退出方法
                return;
            }
            DataSet dsStudent = new DataSet("ds_Student"); //创建一个名为ds_Student的DataSet

            ////手动创建的新数据表-学生信息数据表
            DataTable dtAddStudent = new DataTable("dt_AddStudent"); //创建一个名为dt_AddStudent的DataTalbe
            //为dt_AddStudent表内建立Column(表头),添加数据列:教工号、姓名、虚拟号、考试ID、考场ID、单位、邮箱、电话、考试IP、备注、时间
            dtAddStudent.Columns.Add(new DataColumn("WorkNo", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("TeaName", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("VirtualNo", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("ExamID", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("ExamPlaceID", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("Unit", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("Mail", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("Telephone", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("ExamIP", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("Remark", typeof(string)));
            dtAddStudent.Columns.Add(new DataColumn("Timestamp", typeof(DateTime)));
            
            //获取数据库中虚拟号的数据的最大值,防止重复
            int intnum;
            intnum = Stuvirtualbll.GetLastVirtualNo()+1;
            //从上传的Excel转换为的datatable表中取出数据,放入虚拟考生信息表中
            for (int intRow = 0; intRow < dtStudent.Rows.Count; intRow++)
            {
                
                //教工号
                //strWorkNo = Guid.NewGuid().ToString();
                //教工号
                strWorkNo = dtStudent.Rows[intRow]["教工号"].ToString();
                //学生姓名
                strTeaName = dtStudent.Rows[intRow]["学生姓名"].ToString();
                //虚拟号              
                strVirtualNo = intnum.ToString();             
                //考试ID
                strExamID = dtStudent.Rows[intRow]["考试ID"].ToString();
                //考场ID
                strExamPlaceID = dtStudent.Rows[intRow]["考场ID"].ToString();
                //单位
                strUnit = dtStudent.Rows[intRow]["单位"].ToString();
                //邮箱
                strMail = dtStudent.Rows[intRow]["邮箱"].ToString();
                //电话
                strTelephone = dtStudent.Rows[intRow]["电话"].ToString();
                //考试IP
                strExamIP = dtStudent.Rows[intRow]["考试IP"].ToString();
                //时间
                //strTimestamp = dtCourse.Rows[intRow]["时间"].ToString();
                strTimestamp = DateTime.Now.ToString();
                //备注
                strRemark = dtStudent.Rows[intRow]["备注"].ToString();
            
                //添加学生信息表的新行
                DataRow drAddStudent = dtAddStudent.NewRow();//注意这边创建dt的新行的方法。指定类型是DataRow而不是TableRow,然后不用new直接的用创建的DataTable下面的NewRow方法。
                //虚拟学生对应的表
                drAddStudent["WorkNo"] = strWorkNo;
                drAddStudent["TeaName"] = strTeaName;
                drAddStudent["VirtualNo"] =  strVirtualNo;
                drAddStudent["ExamID"] = strExamID;
                drAddStudent["ExamPlaceID"] = strExamPlaceID;
                drAddStudent["Unit"] = strUnit;
                drAddStudent["Mail"] = strMail;
                drAddStudent["Telephone"] = strTelephone;
                drAddStudent["ExamIP"] = strExamIP;
                drAddStudent["Remark"] = strRemark;
                drAddStudent["Timestamp"] =  strTimestamp; //当前日期时间
                dtAddStudent.Rows.Add(drAddStudent);  //将一整条数据写入表中
                intnum++;
            }
                //将表加入DataSet中
                dsStudent.Tables.Add(dtAddStudent);
        

                //将DataSet中数据表导入数据库
                   if (flagImportStudent == true)              
              {
                    //导入成功,弹出提示
                    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('学生信息导入成功!');</script>");


                }
                else if (flagImportStudent == false)
                {
                    //导入失败,弹出提示
                    Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('学生信息导入失败');</script>");

                }
             }
        }

       

        总结:一开始做这个功能的时候感觉会很难,没用接触过这些知识,但是真正开始做的时候感觉就没那个难了,逻辑很简单,就是实现起来需要多注意一些方面,经过项目实践学到了很多!


抱歉!评论已关闭.