导入表格到数据库

开发工具与关键技术:vs asp.net mvc
作者:修
撰写时间:2019.5.4
导入表格的知识分两个方面来讲:一、页面的知识点、二、控制器的知识点。首先是讲解页面那边的知识点,如下图:
导入表格到数据库_第1张图片
这里是创建一个方法来装导入表格的代码的,如图中方法里面的第一句代码就是重置表单也就是清空表单的意思;第二句代码的意思是禁用某个按钮的意思在这也就是禁用导入数据库的按钮目的是防止数据库导入出错然后就是清空临时表单,接着就是设计点击背景时模态框不会关闭最后就是打开模态框了。这样就把模态框的的内容写完了接下来就是上传表格了,如下图:
导入表格到数据库_第2张图片
上图这个方法就是上传表格数据进数据库的,不过这表格要是Excel表格表格里的数据的表头要与数据库中的数据表头一样才可以不然数据会出错的那么接下来就是讲解这个方法里面的代码和知识点了,如图中方法里面的第一句代码的意思是判断表格数据是否为空和是否是没定义如果是的话那就直接退出,或者是避免点击取消文件时触发上传,然后就是打开加载层接着就是用ajaxSubmit这个方法提交表单,提交表单之后就是关闭加载层然后就进行判读表单是否有数据如果没有就清空表单如果有的话那就是把导入数据按钮启用这样就可以把数据导进数据库中了,接着就是表格重载也就是把数据显示在页面上,最后就是提示。这样页面这边的表格上传也就算完成了。接着就是把表格里的数据上传到数据库里面如下图:
导入表格到数据库_第3张图片
这张图片里的方法是保存导入的Excel表格数据到数据库中的方法,这个方法里面的第一句代码是打开加载层,然后用post请求把控制器那边的方法给获取过来然后就是把加载层和上传数据的模态框给关闭。接着就是代码提示语最后就是调用多条件查询这个方法把数据库中的数据给查询出来与导进数据库的比较看看是否存在。这样页面这边的代码就没了接着就是控制器那边的代码与知识点了,如下图:
导入表格到数据库_第4张图片
上图是为了将导入的Excel表格的数据保存到session而创建的类,这个类里的第一句代码的意思是引用一个叫ReturnJsonVo的类,引用这个类的目的是为了方便写提示和判读这个类里面某个元素的状态的真假;然后就是把session中的ImportExcel移除避免残留以前数据;接着就是获取文件的后缀名然后进行判断页面传过来的文件是否是Excel表格如果不是的话请看上图的判断是给有提示的,然后就是声明二进制数组来存放文件也就是图中的byte[]这里接着就是将传入的文件转化为二进制的数组存入fileBytes这里,接下来就是声明一个元素excelFileStream来将二进制的数组转化为内存流名为图中的excelFileStream;然后就是将内存流excelFileStream转换成工作部workbook;最后就是判断工作簿中是否有工作表,如果有就接着查询数据了图中查询的是学院,专业,年级,班级 的信息,而且根据名称获取对应的ID来声明对象列表,存放导入的学生信息也就是图中的List listStudentVo = new List();这就一句代码;接着就是获取第一个工作表也就是图中判读里面最后一句代码:NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);获取到第一个工作表之后就是对工作表进行判断了判断工作表是否有数据,如图:
导入表格到数据库_第5张图片
这张图的代码就是判断工作表是否有数据,它是连接在获取第一个工作表的代码的后面的也就是在NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);这句代码的后面,其中PhysicalNumberOfRows 这个元素获取的是物理行数,也就是不包括那些空行(隔行)的情况。然后就是将数据传到DataTable命名为dtExcel,接着就是获取标题行了( 注意FirstCellNum:获取某行第一个单元格下标;LastCellNum:获取某行的列数;FirstRowNum:获取第一个实际行的下标;LastRowNum:获取最后一个实际行的下标 ),然后就是获取某行的列数,接着就是获取表格行数(最后一行下标+1);然后就是for in 循环创建dataTable中的列,循环添加标题行中各个单元格的数据;接下来就是遍历表头行中每一个单元格,获取标题行各个单元格的数据,给它声明变量命名为dtColumn;其次就是获取到的标题行的数据并且把它们放到dataTable中,然后再一次for in 循环,读取Excel中的数据,注意:(sheet.FirstRowNum) 表示的是第一行是标题,然后就是获取表格每行的数据这里是排除标题的,接着就是创建DataTable行接下来就是判断如果有行数就遍历excel表格中一行所有的单元格,最后就是把新行添加到dataTable中这样就把Excel表格中的数据读取完整了,接下来就到了这个类的最后一部分了如下图:
导入表格到数据库_第6张图片
这张图里面的代码是连接在判断工作表是否有数据的里面第二个for in循环外面的也就是 for (int i = sheet.FirstRowNum + 1; i < rowCount; i++){}这个for in 循环的后面。然后就是解释这里代码的意思了首先是声明两个变量来记录成功和失败数据的条数,接着就是遍历dataTable中的数据也就是图中的foreach,接着就是声明一个对象命名为student来保存数据,然后就是通过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID,即是在student中的 AcademeName和AcademeID查找学院id并给AcademeName赋值如是名称的都这样写; student.AcademeName = row[“学院”].ToString().Trim()。Trim是去除多余空格的意思,而id就是把上边查询到的表单赋值给student这里条件是名称相同如:student.AcademeID = dbAcademe.Where(m=>m.AcademeName==student.AcademeName).SingleOrDefault().AcademeID;这是用Lambda表达式来写的这里的条件是AcademeName必须和student里面的AcademeName相同,在这里的SingleOrDefault的意思与single差不多,single是只能返回唯一的一个值而SingleOrDefault的意思是返回唯一的值或者返回空而single不能返回空。接着就是通过AcademeID也就是学院id和专业名称来获取专业id,依次类推把年级id和班级id给获取出来,获取到这几个id后就直接把关于Excel里面的有关数据给获取出来并赋值。接着就是将每一条数据都添加到对象列表中和记录成功的数据,最后就是将获取到的数据保存到session中。这样我们就把整个类给写完了也就是把导入的Excel表格的数据保存到session这个类写完了。接着就是新建一个类来对session中的数据进行处理并进行分页,如下图:
导入表格到数据库_第7张图片
上图中的这个类因为是进行分页的所以要引用插件也就是LayuiTablePage这个插件进行分页,接着就是新建一个列表命名为listStudentVo,然后就是对导入Excel表格的数据到数据库中的数据进行判断如果有数据接着就是给listStudentVo赋值,然后就是计算数据接着就是进行分页查询其中OrderByDescending(m => m.studentID)对listStudentVo这张列表根据studentID进行降序的排序,最后就是实例化数据。这样对数据进行分页也就完成了那么接下来就是导入表格的最后一个类了如下图:
导入表格到数据库_第8张图片
这个类是的作用是把数据保存到数据这里很容易出现异常所以为了避免出现异常控制器感应不到所以用了try catch来捕获异常接着就是声明两个变量来记录保存成功的数据条数和记录数据库已经存在的数据而保存失败的数据条数;接着就是判断session中有没有数据如果有就给上图新建的列表赋值也就是给listStudentVo 赋值接着用foreach循环来判断数据是否与数据库中已有数据重复,这里的查询是根据上面的student和数据库中的表单来比较的,如果数据没有重复就新增表单然后就保存这里新增的是用户表而且新增了用户里面的所有元素。接着就是保存的数据了,然后就是判断是否有保存的数据如下图:
导入表格到数据库_第9张图片
这张图是连接着上面的那张图片的,这里面的代码是连接在上面的那张图里面有两个//1的那里的,如果有保存的数据那么接下来就是声明一个变量来获取新增的用户id,接着就是添加用户明细表并且把它命名为dbUserRoleDetail,根据获取到的用户id来把用户明细表来连接起来,然后添加用户明细表里面的内容,并且设计添加用户明细表的用户类型的id是哪一种类型的就该那一种类型如图中的dbUserRoleDetail.UserTypeID = 6;这里的意思是用户明细表的用户类型id为6,也就是说你添加的用户类型必须为用户类型为6的那一个,这里的6是学生的意思,也就是说你添加的用户类型必须是学生的不然就添加不了。接着就是添加学生表,给学生表里面的元素都赋值,也即是把导入数据库中的数据全给赋值给学生表也就是把图中的student里面的元素给赋值给dbStudent,然后把学生的状态都给设计为应届。最后把学生表给添加进去这样全程的导入表格到数据库也就算是圆满了。
然后就是总结一下里面的知识点:如foreach循环我给它写了个方便与我们了解的笔记就是:foreach (1,2,in 3 ){}这里的1可以是变量或者是类,2:随便起的命名;3:在某个表格或者是前面的变量。

你可能感兴趣的:(导入表格到数据库)