数据导入操作

Posted 是小叶的呢.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据导入操作相关的知识,希望对你有一定的参考价值。

效果图如下:
点击导入,把表中的数据导入在数据表格里面
在这里插入图片描述
需要导入的数据如下:
在这里插入图片描述

数据成功导入数据表格
在这里插入图片描述
html部分如下:

<div class="modal fade" id="importStudentModal" data-backdrop="static" data-keyboard="false">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">导入学生</h5>
                        <button type="button" class="close" data-dismiss="modal">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                    <div class="modal-body">
                        <div class="container-fluid">
                            <form id="formImport">
                                <div class="row">
                                    <div class="col">
                                        <span>1、请先下载模板文件:</span>
                                        <button type="button" class="btn btn-primary btn-sm" onclick="downImportTemplate()">下载</button>
                                    </div>
                                </div>
                                <div class="row mt-3">
                                    <div class="col">
                                        <span>2、将需要导入的数据填写到模板中。请不要修改模板的基本格式</span>
                                    </div>
                                </div>
                                <div class="row mt-3">
                                    <div class="col">
                                        <span>3、选择填写好数据的excel文件(.xls):</span>
                                        <input type="file" class="form-control" accept=".xls" id="fileExcel" />
                                    </div>
                                </div>
                                <div class="row mt-3">
                                    <div class="col">
                                        <button type="button" class="btn btn-primary btn-sm" onclick="uploadExcelFile()">上传</button>
                                    </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>

javascript部分如下:

 function uploadExcelFile() {
            var fileExcel = $("#fileExcel").get(0).files[0];
            var formData = new FormData();
            formData.append("excelFile", fileExcel);
            var layerIndex = layer.load();
            $.ajax({
                url: "/BaseInfor/Student/uploadInfor",
                method: 'post',
                contentType: false,//让Ajax不指定数据类型
                processData: false,//让Ajax不对数据进行处理
                data: formData,
                success: function (jsonMsg) {
                    layer.close(layerIndex);
                    layer.alert(jsonMsg.Text);
                    if (jsonMsg.State) {
                        tabStudentSearch();
                        $("#importStudentModal").modal('hide');
                    }
                }
            });
        }

控制器部分如下:

//   上传导入的excel表格
        public ActionResult uploadInfor(HttpPostedFileBase excelFile)
        {
            ReturnJson msg = new ReturnJson();
            try
            {
                //思路:
                //    1、获取读取的文件
                //    2、把文件转换为二进制数组
                //    3、二进制数组转换成内存流
                //    4.利用NPOI把内存流中的数据读取成Excel

                //获取文件的扩展名
                string fileExtension = Path.GetExtension(excelFile.FileName);
                //判断文件类型是否为指定的文件类型
                if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))
                {
                    //声明二进制数组存放文件
                    byte[] fileBytes = new byte[excelFile.ContentLength];
                    //将传入的文件转化为二进制数组存入fileBytes
                    excelFile.InputStream.Read(fileBytes, 0, excelFile.ContentLength);
                    //将二进制数组转化为内存流
                    MemoryStream excelFileStream = new MemoryStream(fileBytes);
                    //将内存流转化为工作簿
                    NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
                    //判断工作簿中是否有工作表
                    if (workbook.NumberOfSheets > 0)
                    {
                        //查询出学院 专业 年级 班级 的信息:用来根据名称获取对应的ID
                        List<Collegechart> dbcollege = myModal.Collegechart.ToList();
                        List<Zhuanyechart> dbzhuanye = myModal.Zhuanyechart.ToList();
                        List<Gradechart> dbgrade = myModal.Gradechart.ToList();
                        List<Classchart> dbclass = myModal.Classchart.ToList();
                        //对象列表--存放要保存的数据
                        List<Studentchart> liststudent = new List<Studentchart>();
                        //获取第一个工作表
                        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 dtColum = new DataColumn(rowHeader.GetCell(i).StringCellValue);
                                    //将获取到的标题行的数据放到datatable中
                                    dtExcel.Columns.Add(dtColum);
                            }
                            //读取excel中的数据
                            //(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
                            #region 读取第一个工作表中的数据 到DataTable中
                            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)
                                {
                                    //遍历excel中一行的所有单元格
                                    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
                            //遍历根据名称匹配 学院ID 专业ID年级ID 班级ID
                           # region 遍历根据名称匹配 学院ID 专业ID年级ID 班级ID
                        for(int i = 0; i < dtExcel.Rows.Count; i++)
                            {
                                DataRow row = dtExcel.Rows[i];
                                //创建student对象保存每一条数据
                                Studentchart student = new Studentchart();
                                //获取学院ID
                                //通过dataTable中的dbcollege中查找相应的collegeID
                                string collegeName = row["学院"].ToString().Trim();
                                try
                                {
                                    student.collegeID = dbcollege.Where(o => o.collegeName ==                   
                                    collegeName).Single().collegeID;
                                }
                                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.collegeID == student.collegeID
                                        && 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
                                string zhuanye = row["专业"].ToString().Trim();
                                try
                                {
                                    student.zhuanyeID = dbzhuanye.Where(p => p.collegeID == student.collegeID
                                        && p.zhuanyeName == zhuanye)
                                        .Single().zhuanyeID;
                                }
                                catch (Exception e)
                                {
                                    Debug.WriteLine(e);
                                    msg.Text = string.Format("第{0}学生数据 专业 无法匹配", i + 1);
                                    return Json(msg, JsonRequestBehavior.AllowGet);
                                }
                                //获取班级ID和名称
                                //通过dataTable中的dbcollege中查找相应的zhuanyeID
                                string className = row["班级"].ToString().Trim();
                                try
                                {
                                    student.classID = dbclass.Where(o => o.collegeID == student.collegeID 
                                    && o.zhuanyeID == student.zhuanyeID&&o.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.studentCode = row["学号"].ToString().Trim();
                                student.studentName = row["姓名"].ToString().Trim();
                                student.idCard = row["身份证号"].ToString().Trim();
                                student.studentSex = row["性别"].ToString().Trim();
                                //将每一条数据添加对象列表中
                                liststudent.Add(student);
                            }
                            #endregion
                        //开启事务
                        using(TransactionScope scope=new TransactionScope())
                            {
                                //保存到数据库
                                myModal.Studentchart.AddRange(liststudent);
                                if (myModal.SaveChanges()==dtExcel.Rows.Count)
                                {
                                    scope.Complete();//提交事务
                                    msg.State = true;
                                    msg.Text = "导入成功";
                                }
                                else
                                {
                                    msg.Text = "导入失败";
                                }
                            }
                        }
                        else
                        {
                            msg.Text = "工作表为空";
                        }
                    }
                    else
                    {
                        msg.Text = "工作簿中没有工作表";
                    }
                }
                else
                {
                    msg.Text = "请选择Excel文件上传";
                }
            }
            catch (Exception)
            {
                msg.Text = "上传失败,类型不对应;请检查是否有工作表,是否有数据,";
            }
            return Json(msg, JsonRequestBehavior.AllowGet);
        }
       

以上是关于数据导入操作的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序代码片段

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

vscode代码片段生成vue模板

在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误