数据的导入

导入

HTML代码

 <div class="modal fade" id="modExcelData" data-backdrop="static">
        <div class="modal-dialog modal-dialog-centered modal-lg">
            <div class="modal-content">
                <div class="modal-header bg-green">
                    <h4 class="modal-title">导入Excel数据</h4>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body" style="height:400px;">
                    <div class="container-fluid">
                        <div class="row">
                            <div class="col">
                                <form action="/" method="post" id="frmExcelData">
                                    <input type="file" name="file" accept=".xls" value="dd" onchange="upExcel()">
                                </form>
                            </div>
                            <div class="col text-right">
                                <button class="layui-btn layui-btn-sm" id="ImportDatabase">导入到数据库</button>
                            </div>
                        </div>
                        <div class="row ">
                            <div class="col">
                                <table id="tabStuExcel" class="layui-table" layui-filter="tabStuExcel"></table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

109

第一步、弹出模态框

  function openImportModal() {

            $("#importStudentModal").modal();

            $("#fileExcel").val(null);

        }

110

 

第二步:点击下载 下载Excel模板文件

Js代码:

 //下载上传模板

        function downImportTemplate() {

            window.open("/Student/DownImportTemplete");

        }

C#代码

  

 public ActionResult DownImportTemplete()

        {

            string templatePath = Server.MapPath("~/Document/考生信息导入模板.xls");

            if (System.IO.File.Exists(templatePath))

            {

                //返回文件,通过EXCEL打开

                return File(templatePath, "application/vnd.ms-excel", "123.xls");

            }

            else

            {

                return Content("模板文件不存在");

            }

        }



第三步:选择上传文件 (注意:不要修改模板的基本格式)

js代码:

        function uploadExcelFile() {

            //files获取上传的文件

            var fileExcel = $("#fileExcel").get(0).files[0];//先获取fileExcel input标签然后通过get(0)把它转化为一个JS对象,再调用files属性

            var formData = new FormData();//创建一个formData ,把要上传的数据添加formData 里面

            formData.append("excelFile", fileExcel);

            var layerIndex = layer.load();//加载层

    //通过异步数据提交把formData提交到指定的路径下面

            $.ajax({

                url: '/Student/ImportExcel',//路径

                method: 'post',//提交方式

                contentType: false,//让Ajax不指定数据类型

                processData: false,//让Ajax不对数据进行处理

                data: formData,//要上传的数据

                success: function (jsonMsg) {

                    layer.close(layerIndex);

                    layer.alert(jsonMsg.Text);

                    if (jsonMsg.state) {

                        StudentReload();//刷新表格

                        $("#importStudentModal").modal("hide");//关闭模态框

                    }

                }

            })

        }

需引用NPOI

112

 

C#思路:

  1. 获取读取的文件
  2. 把文件转换为二进制数组
  3. 二进制数组转成内存流
  4. 利用NPOI把内存流中的数据读取成Excel

代码:(有点多喔!!!)

   public ActionResult ImportExcel(HttpPostedFileBase excelFile)

        {

            returnJson msg = new returnJson();//NPOI对Excel文件进行读写操作

            try

            {

                //获取文件后缀

                string fileExtension = Path.GetExtension(excelFile.FileName);

                //判断文件类型是否为指定的文件类型 ".xls",".xlsx"

                if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))

                {

                    //声明一个二进制的变量存放数组

                    byte[] fileBytes = new byte[excelFile.ContentLength];

                    //把传入文件转化为二进制的数组存入fileBytes

                    excelFile.InputStream.Read(fileBytes, 0, excelFile.ContentLength);

                    //将二进制数组转换为内存流

  //MemoryStream 创建其支持存储区为内存的流。

                    MemoryStream excelFiledStream = new MemoryStream(fileBytes);

                    //将内存流转换为工作簿

                    NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFiledStream);

                    //判断工作簿中是否有工作表

                    if (workbook.NumberOfSheets > 0)

                    {

                        List<SYS_Academe> dbAcademe = myModel.SYS_Academe.ToList();

                        List<SYS_Specialty> dbSpecialty = myModel.SYS_Specialty.ToList();

                        List<SYS_Grade> dbGrade = myModel.SYS_Grade.ToList();

                        List<SYS_Class> dbClass= myModel.SYS_Class.ToList();

                        //对象列表--存放要保存的数据

                        List<SYS_Student> listStudent = new List<SYS_Student>();



                        //获取第一个工作表

                        NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);

                        //PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。

                        //判断工作表中是否有数据

                        if (sheet.PhysicalNumberOfRows > 0)

                        {

                            //先把数据装到datatable中

                            //定义datatable

                            DataTable dtExcel = new DataTable();

                            //获取标题行--第二行,索引为1;第一行是说明

                            NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);

                            /*

                                FirstCellNum:获取某行第一个单元格下标

                                LastCellNum:获取某行的列数

                                FirstRowNum:获取第一个实际行的下标

                                LastRowNum:获取最后一个实际行的下标

                          */

                            //获取表格列数

                            int cellCount = rowHeader.LastCellNum;

                            //获取表格行数

                            int rowCount = sheet.LastRowNum + 1;

                            //创建dataTable中的列,循环添加标题行中各个单元格的值--相当于定义数据库表的字段

                            for (int i = rowHeader.FirstCellNum; i < cellCount; i++)

                            {

                                //通过遍历行中的每一个单元格,获取标题行各个单元格的数据

                                DataColumn dbColum = new DataColumn(rowHeader.GetCell(i).StringCellValue);

                                //将获取到的标题行的数据放到datatable中

                                dtExcel.Columns.Add(dbColum);

                            }

                            //读取Excel中的数据

                            //(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息

                            #region 将Excel中的数据添加到dtExcel

                        for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)

                            {

                                //获取行(1/2/3)数据

                                NPOI.SS.UserModel.IRow row = sheet.GetRow(i);

                                //创建DataTable行

                                DataRow dtRow = dtExcel.NewRow();

                                if (row != null)

                                {

                                    //遍历一行中所有的单元格

                                    for (int j= row.FirstCellNum; j < cellCount; j++) {

                                      if (row.GetCell(j) != null)

                                         {

                                            dtRow[j] = row.GetCell(j).ToString();

                                         }

                                    }

                                }

                                //将填入数据的dtRow添加到dtExcel

                                dtExcel.Rows.Add(dtRow);

                            }

                            #endregion



                            #region 将dtExcel中的数据读取出来 转换为student对象 然后将学生数据添加到listStudent列表中

                            //遍历 根据名称匹配 学院ID 专业ID 年级ID 班级ID

                            for (int i = 0; i < dtExcel.Rows.Count; i++)

                            {

                                DataRow row = dtExcel.Rows[i];

                                //创建student对象保存每一条数据

                                SYS_Student student = new SYS_Student();

                                //获取学院ID

                                //通过dataTable中的AcademeName到dbAcademe中查找相应的

                            try

                            {

                                    student.academeID = dbAcademe.Where(m => m.academeName == row["学院"].ToString().Trim()).Single().academeID;

                            }catch(Exception e)

                            {

                                    Debug.WriteLine(e);

                                    msg.Text = string.Format("第{0}学生数据 学院无法匹配",i+1);

                                    return Json(msg, JsonRequestBehavior.AllowGet);

                            }

                                //获取专业id和名称

                                //根据学院ID和专业名称获取相应的专业ID

                                string specialtyName = row["专业"].ToString().Trim();

                                try

                                {

                                    student.specialtyID = dbSpecialty.Where(p => p.academeID == student.academeID && p.specialtyName == specialtyName).Single().specialtyID;

                                }

                                catch (Exception e) {

                                    Debug.WriteLine(e);

                                    msg.Text = string.Format("第{0}学生数据 专业无法匹配", i+ 1);

                                    return Json(msg, JsonRequestBehavior.AllowGet);

                                }

                                //获取年级ID和名称

                                //根据学院ID和年级名称获取相应的年级ID

                                string gradeName = row["年级"].ToString().Trim();

                                try

                                {

                                    student.gradeID = dbGrade.Where(p => p.academeID == student.academeID && p.gradeName == gradeName).Single().gradeID;

                                }

                                catch(Exception e)

                                {

                                    Debug.WriteLine(e);

                                    msg.Text = string.Format("第{0}学生数据 年级无法匹配", i + 1);

                                    return Json(msg, JsonRequestBehavior.AllowGet);

                                }

                                //获取班级ID和名称

                                //根据学院ID&专业ID&班级名称获取班级ID

                                string className = row["班级"].ToString().Trim();

                                try

                                {

                                    student.classID = dbClass.Where(p => p.academeID == student.academeID && p.specialtyID == student.specialtyID && p.gradeID == student.gradeID && p.className == className).Single().classID;

                                }catch(Exception e)

                                {

                                    Debug.WriteLine(e);

                                    msg.Text = string.Format("第{0}学生数据 班级无法匹配 ", i + 1);

                                    return Json(msg, JsonRequestBehavior.AllowGet);

                                }

                                if (!IdCardHelper.CheckIdCard(row["身份证号"].ToString().Trim()))

                                {

                                    msg.Text = string.Format("第{0}学生数据 身份证号不正确", i + 1);

                                    return Json(msg, JsonRequestBehavior.AllowGet);



                                }

                                student.studentNumber = row["学号"].ToString().Trim();

                                student.studentName = row["姓名"].ToString().Trim();

                                student.studentSex = row["性别"].ToString().Trim();

                                student.studentIDNum = row["身份证号"].ToString().Trim();



                                //将每一条数据都添加到对象列表中

                                listStudent.Add(student);

                            }

                            #endregion



                            //保存数据到数据库

                            //myModel.SYS_Student.AddRange(listStudent);

                            //myModel.SaveChanges();

                            using(TransactionScope scope=new TransactionScope())

                            {

                                //保存数据到数据库

                                myModel.SYS_Student.AddRange(listStudent);

                                if (myModel.SaveChanges() == listStudent.Count)

                                {

                                    scope.Complete();//提交事务

                                    msg.state = true;

                                    msg.Text = "导入成功";

                                }

                                else

                                {

                                    msg.Text = "导入失败";

                                }

                            }

                        }

                        else

                        {

                            msg.Text = "工作表中无数据";

                        }

                    }

                    else

                    {

                        msg.Text = "该工作簿中没有工作表";

                    }

                }

                else

                {

                    msg.Text = "选择的文件类型不正确";

                }

            }

            catch(Exception e)

            {

                Debug.WriteLine(e);

                msg.Text = "数据导入异常";

            }

            return Json(msg, JsonRequestBehavior.AllowGet);

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值