开发工具与关键技术:VS/MVC
作者:何桂朋
撰写时间:2019年4月23日
在ASP.NET MVC中,表格数据导出常用的容器是Excel。以学生信息为例。
在导出之前,要先引用NPOI插件备用,
导入部分的思路是:
(1) 查询出数据并转化成对象列表的格式。
查询出数据,然后用实体类接收注意一下,实体类要包含创建Excel表的表头的字段,
比如:学号(StudentNumber)、姓名(StudentName)、身份证号(StudentIDNum)、性别(StudentSex)、
学院(AcademeName)、专业(SpecialtyName)、班级(ClassName)等等
这是因为要和表的信息一一对应,如果需要筛选的话,可以添加各类ID字段,
作为筛选条件。再转化成对象列表的格式。
//转化为对象列表的格式
List<Student> listExaminee = listStu.ToList();
(2) 使用插件方法HSSFWorkbook创建工作簿;
HSSFWorkbook excelBook = new HSSFWorkbook();
(3) 使用插件方法ISheet创建工作表并命名;
CreateSheet方法是 在工作簿中添加ISheet,并将其参数作为名称。
//为工作簿创建工作表并命名
NPOI.SS.UserModel.ISheet sheet1 = excelBook.CreateSheet("考生信息");
(4)书写工作表表头(学号 姓名 身份证号 性别 学院 专业 年级 班级);
CreateRow()方法 是获取工作表的行数。
CreateCell()方法 是获取工作表的行中的列。
SetCellValue() 方法 是给单元格赋值。
//创建第一行
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
//创建9列并赋值
row1.CreateCell(0).SetCellValue("学号");
row1.CreateCell(1).SetCellValue("姓名");
row1.CreateCell(2).SetCellValue("身份证号");
row1.CreateCell(3).SetCellValue("性别");
row1.CreateCell(4).SetCellValue("学院");
row1.CreateCell(5).SetCellValue("专业");
row1.CreateCell(6).SetCellValue("年级");
row1.CreateCell(7).SetCellValue("班级");
(5)linq查询数据list 书写到工作表;
//创建数据行
for (int i = 0; i < listStu.Count(); i++){
//创建行
NPOI.SS.UserModel.IRow rowTemp = sheet1.CreateRow(i + 1);
rowTemp.CreateCell(0).SetCellValue(listExaminee[i].StudentNumber);
rowTemp.CreateCell(1).SetCellValue(listExaminee[i].StudentName);
rowTemp.CreateCell(2).SetCellValue(listExaminee[i].StudentIDNum);
rowTemp.CreateCell(3).SetCellValue(listExaminee[i].StudentSex);
rowTemp.CreateCell(4).SetCellValue(listExaminee[i].AcademeName);
rowTemp.CreateCell(5).SetCellValue(listExaminee[i].SpecialtyName);
rowTemp.CreateCell(6).SetCellValue(listExaminee[i].GradeName);
rowTemp.CreateCell(7).SetCellValue(listExaminee[i].ClassName);
rowTemp.CreateCell(8).SetCellValue(listExaminee[i].UserNuber);
}
(6)使用IO流写出数据
//文件名
var fileName = "考生信息" + DateTime.Now.ToString
("yyyy-MM-dd-HH-mm-ss-ffff")+ ".xls";
//将Excel表格转化为流,输出
//创建文件流
MemoryStream bookStream = new MemoryStream();
//文件写入流(向流中写入字节序列)
excelBook.Write(bookStream);
//输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
bookStream.Seek(0, SeekOrigin.Begin);
return File(bookStream, "application/vnd.ms-excel", fileName);
因为时间是唯一的,所以用文件命名使其唯一;工作簿不能直接输出,所以用二进制的流接收
然后用File将其输出。