学习笔记(5)

在MVC中,不只是有查询、新增、修改、删除中几个的存在,在这几个基础上还可以做些对数据的批量的处理,批量处理数据多条的保存到数据库里,用Excel表格进行对数据的批量导入,相对于Word文档导入,Excel导入还是简单的接下来要完成的几个功能。
功能:下载模板(本地下载)、把数据存进Session中,并让数据先保存在临时表中、然后在把数据存到数据库中,基本上级这样了,
一、 下载模板(本地下载):
先在视图里搭建页面,页面个新增、修改中的基本一样,就是form中的不一样:
在这里插入图片描述
Action:提交路径,
Method:method 属性规定如何发送表单数据(表单数据发送到 action 属性所规定的页面)。表单数据可以作为 URL 变量(method=“get”)或者 HTTP post (method=“post”)的方式来发送。
Enctype:enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)。
接下来一样,表单清空-清空临时表-禁用数据库的按钮-打开模态框
在这里插入图片描述
在这里插入图片描述
在Windows打开窗口
在这里插入图片描述
拿到路径,到控制器也是简单的写法:
在这里插入图片描述
下载首先获取模板物理路径,物理路径应该就是自己的电脑上实打实的路径,Server(服务器),MapPath(路径),
判断文件是否存在,不存在就提示模板不存在。
System.IO:只是一个引用路径,
File:System.IO里的一个成员:提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 System.IO.FileStream 对象。
Exists: System.IO.File的成员:用于确定指定的文件是否存在。返回结果:如果调用方具有要求的权限并且 path 包含现有文件的名称,则为 true;否则为 false。如果 path 为 null、无效路径或零长度字符串,则此方法也将返回 false。如果调用方不具有读取指定文件所需的足够权限,则不引发异常并且该方法返回 false,这与 path 是否存在无关。用到Exists 似乎都和Path结合用。
获取文件名:Path:System.IO的成员:用于对包含文件或目录路径信息的 string 实例执行操作。这些操作是以跨平台的方式执行的。GetFileName:System.IO.Path 的成员 用于返回指定路径字符串的文件名和扩展名。
返回文件类型File new出新的实例FileSrteam,FileMode在指定的系统打开文件,返回获取文件名称。

二、把数据存进Session中,并让数据先保存在临时表中
表格、数据重载忽略掉万年不变的东西,用ajax提交表单,前面禁用了数据库按钮,到这里要启用数据库按钮
在这里插入图片描述
把状态设置为false就可以了。输出、清空临时表单,拿到提交表单的路径到控制器
在这里插入图片描述
HttpPostedFileBase似乎拿来上传文件 通过Http协议用Post方法来提交文件。参数file一定要和form表单中的input中的name值一样,不然就提交不了数据,
下面对HttpPostedFileBase的一些认识
在这里插入图片描述
思路:先获取文件后缀名-声明二进制数组(byte)-将文件转化成二进制数组-二进制数组转化成内存流-内存流转化成Excel表格(NPOI方法)创建工作薄-工作表(NPOI方法)-创建DataTable(内存中的数据表)获取相对应的数据-创建新StudentVo装遍历循环后的每一条数据-保存数据到Session中,基本思路就这样了;

1、 获取文件后缀:用System.IO.Path中的成员GetExtrnsion,他和上面的GetFileName有些不同。GetExtrnsion获取文件的扩展名,比如Excel的扩展名数.xls,指定的路径的扩展名(包含句点“.”)。GetFileName获取文件的文件名和扩展名,比如Excel命名为数据表,GetFileName获取的就是数据表,path 中最后的目录字符后的字符
在这里插入图片描述
判断文件是否上传为Excel(.xls) 大写或者小写,否则放回else并提示上传正确的文件类型,
在这里插入图片描述
2、 声明二进制数组(byte):ContentLength:在派生类重写时,获取已上传文件的大小写(以字节为单位)
在这里插入图片描述
3、 将文件(file)转化成二进制数组:InputStream:在派生类重写时,获取一个Stream对象,该对象指向一个上载文件,已准备读取该文件内容,Read(byte[] buffer, int offset, int count)一一对应上
在这里插入图片描述
4、 二进制数组转化成内存流:MemoryStream:基于指定的字节数组初始化 System.IO.MemoryStream 类的无法调整大小的新实例。MemoryStream(byte[] buffer)把声明的数组放进去
在这里插入图片描述
5、 内存流转化成Excel表格(NPOI方法)创建工作薄:判断工作表中有没有数据没有数据就返回else提醒用户
在这里插入图片描述
6、 工作表(NPOI方法):new一个新的对象列表StudentVo,用于存放导入学生信息,获取工作薄中的第一张工作表,GetSheetAt(int index)用PhysicalNumberOfRows判断数据表中是否有数据没有数据就返回else提醒用户,PhysicalNumberOfRows 获取物理行数,也就是不包括那些空行(隔行)的情况,
在这里插入图片描述
7、 创建DataTable(内存中的数据表)获取相对应的数据:定义DataTable,获取数据表中的第一行
在这里插入图片描述
获取表格列数 FirstCellNum 获取某行第一个单元个下标
LastCellNum 获取某行的列数
FirstRowNum 获取第一个实际行的下标
LastCellNum 获取最后一个实际行的下标
For循环每一个表头单元格。将读取后的数据放到DataTable中,
在这里插入图片描述
读取Excel表格数据创建行和列,for循环获取第一行数据,第一行数据为标题,获取行的数据(1行、2行等等直 到n行),创建DataTale行,遍历Excel表格中的所有单元格,创建中的单元格不能为空
在这里插入图片描述
查询相对应的表的ID,这几张表不知学生表里,要把他们获取一遍,
在这里插入图片描述
获取到相对应的表,用foreach遍历一条一条的数据新增到每一行中,在studentVo里有想要的数据,创建新的studentVo ,在学生表没有的字段都在studentVo里拿,学院-专业-年级-班级都能一一拿到。
在这里插入图片描述
拿到学院-专业-年级-班级名称后,在拿学生表中的各个字段,可以在studentVo里直接拿,学生表本身就有的,
在这里插入图片描述
一条一条添加后保存到声明学生对象列表中
再把数据存到Session中

三、 把数据存到数据库中
页面忽略,数据从Session中拿过来,先从Session中获取数据,new一个对象列表StudentVo,用来接收Session中的数据
在这里插入图片描述
获取Session后用foreach遍历循环listStudent保存到数据库,到下面跟新增一样了,见图:
流程一样 判断导入新增的是否和数据库中的重复—新增用户表—新增角色明细表—保存
在这里插入图片描述
在用户表中获取用户Id,new一张新的学生表出来,新的学生表字段等于上面遍历Student字段
在这里插入图片描述 完成!!!!!