导出的主要思路:先创建一个工作簿,再创建工作表,接着创建表头把数据绑定,使用IO流写出数据,最后就重命名文件。
导出肯定是要用到插件的,我们的第一步当然是引入插件啦,但是这个插件与平常的js插件不一样,它是vs的配置文件,使用引用的方法也不一样。这里所使用的插件就是NPOI,引用的方法就是先复制NPOI插件,然后找到项目的bin文件的目录下面粘贴
然后就在vs里面找到,并添加引用就可以啦,这样我们就可以对里面达到方法进行操作了。
因为导出数据不需要写页面布局,所以主要的还是控制器。
第一步,也是需要对数据查询出全部数据的,这个查询的方法和前面渲染表格的查询是一模一样的,也只是去掉了分页。
查询出来的数据后,就要给每一个手动地写代码添加到Excel表格里面。Excel后面的就需要做两步操作:一先做出一个表头,表头就是表的顶部那些“姓名,性别”的提示行,再把数据放入表格中。
- 创建Excel
这时NPOI就派上用场了,我们要用的就是它创建Excel的功能,使用它当然就是要把它实例化先,这句代码的效果就是新建了一个Excel的表格。
HSSFWorkbook ExcelBook = new HSSFWorkbook()
- 创建工作表
这个也是用到NPOI里面的一个函数ISheet,因为工资表它就是一个Sheet,后面括号里面就是给它命名的。
NPOI.SS.UserModel.ISheet sheet1 = ExcelBook.CreateSheet("学生信息");
- 编写工作表
1.1 表头
因为第一行比较特殊,所以要单独把它创建出来。
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
并且要确认表格到底有多少列,有多少列就创建多少列,给每一个列的第一个的单元格写上提示的内容。
row1.CreateCell(0).SetCellValue("学号");
row1.CreateCell(1).SetCellValue("姓名");
row1.CreateCell(2).SetCellValue("性别");
表格的第一行就这样完成了,接着下面就是要把数据写到表格上面了。
3.2数据
先把查询出来的表格数据,并且要转化为列表的格式。
List<Student> listEquer = listStu.ToList();
填写表格的数据,就是用for循环给每一个单元格添加数据,数据有多少行它就会创建多少,listStu主要是用来获取总数的。因为Excel表格的第一行刚才已经创建出来了,所以填写数据的行数是从第二行开始的,它的下标是加1的。接着里面列的绑定注意序号要和上面已经创建的列对应起来,然后给它对应的行数绑定数据库需要显示的字段。
for (int i = 0; i <
listStu.Count(); i++)
{
NPOI.SS.UserModel.IRow rowTeta = sheet1.CreateRow(i + 1);
rowTeta.CreateCell(0).SetCellValue(listEquer[i].StudentNumber);
rowTeta.CreateCell(1).SetCellValue(listEquer[i].StudentName);
rowTeta.CreateCell(2).SetCellValue(listEquer[i].StudentSex);
}
然后就是重命名表格,想必大家都应该知道的一点,系统同一路径下的文件名称是不能重复的,所以我们就需要给它创建一个不会重复名称的表格,这里比较简单的方法是给文件名拼接上当前的时间,接着后面拼接文件格式的类型。
var fileName = "学生信息" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";
文件还必须要文件流的格式读取,就先把Excel转换为流才能输出,
MemoryStream bookOrigin = new MemoryStream();
ExcelBook.Write(bookOrigin);
传输之前要确定读取的开始位置,0表示不偏移把全部数据读取。
bookOrigin.Seek(0, SeekOrigin.Begin);
最后以文件格式返回
return File(bookOrigin, "application/vnd.ms-excel", fileName);
视图部分,
-
先提取查询的条件,获取到当前这个table的条件,然后拿到查询出来的条件和导出的条件进行比较,判断它们如果相等,就说明查询出来的数据和导出的数据是相等的,反之,不相等就不能导出。
-
接着判断查询的条件是否和拼接的字符串相等,如果相等就提醒操作者,确定导出筛选出来的数据,然后打开新的页面下载Excel文件,最后执行控制器的方法。