使用NPOI导出数据到Excel表格的思路
开发工具与关键技术:Visual Studio
作者:胡宁淇
撰写时间:2019年4月6日
引用我自己敲的代码
第一步首先要把NPOI插件引用到自己的项目里面
第二步把要导入的数据查询出来,并进行数据的筛选
刚开始我们可以看到一共有5000多条数据,从页面上可以看出我们可以通过四个条件进行筛选,所以我们就给这个方法定义了四个变量用来接收页面那边传来的数据int AcademeID(接收页面传过来的学院ID), int GradeID(接收页面传过来的年级ID), int ClassID(接收页面传过来的班级ID), string StudentInfo(接收页面传过来的学号/姓名)
上图是筛选完后的数据总数
public ActionResult ExportToExccl(int AcademeID, int GradeID, int ClassID, string StudentInfo)
{
var listStu = from tbStudent in myModels.PW_Student//学生表
join tbAcademe in myModels.SYS_Academe on tbStudent.AcademeID equals tbAcademe.AcademeID//学院表
join tbSpcialty in myModels.SYS_Specialty on tbStudent.SpecialtyID equals tbSpcialty.SpecialtyID//专业表
join tbGrade in myModels.SYS_Grade on tbStudent.GradeID equals tbGrade.GradeID//年级表
join tbClass in myModels.SYS_Class on tbStudent.ClassID equals tbClass.ClassID//班级表
join tbUser in myModels.PW_User on tbStudent.UserID equals tbUser.UserID//用户表
orderly tbStudent.studentID descending
select new Student//构建的实体类
{
studentID = tbStudent.studentID,//学生ID
UserID = tbStudent.UserID,//用户ID
StudentNumber = tbStudent.StudentNumber,//学号
StudentName = tbStudent.StudentName,//姓名
StudentIDNum = tbStudent.StudentIDNum,//身份证号
StudentSex = tbStudent.StudentSex,//性别
AcademeName = tbAcademe.AcademeName,//学院
SpecialtyName = tbSpcialty.SpecialtyName,//专业
GradeName = tbGrade.GradeName,//年级
ClassName = tbClass.ClassName,//班级
UserNuber = tbUser.UserNuber,//账号
AcademeID = tbStudent.AcademeID,//学院ID
SpecialtyID = tbStudent.SpecialtyID,//专业ID
GradeID = tbStudent.GradeID,//年级ID
ClassID = tbStudent.ClassID//班级ID
};
下面是进行数据的筛选,如果页面传输过来的ID大于0,那么你传过来的ID就跟从数据库查询出来的ID相等
if (AcademeID > 0)
{
//筛选学院数据
listStu = listStu.Where(m =>m.AcademeID == AcademeID);
}
if (GradeID > 0)
{
listStu = listStu.Where(m =>m.GradeID == GradeID);
}
if (ClassID > 0)
{
listStu = listStu.Where(m =>m.ClassID == ClassID);
}
如果传过来的学号或姓名不为空,那么将传过来的数据跟数据库的数据进行一个模糊查询Contains()
if (!string.IsNullOrEmpty(StudentInfo))
{
listStu = listStu.Where(m =>m.StudentNumber.Contains(StudentInfo) || m.StudentName.Contains(StudentInfo));
}
//将查询出来的数据转化为对象列表的格式
List<Student> listExaminee = listStu.ToList();
第三步:使用NPOI插件里面的方法HSSFWorkbook创建工作簿
//创建工作簿Excel
HSSFWorkbook excelBook = new HSSFWorkbook();
第四步:使用插件方法ISheet创建工作表并命名,这一步就相当于通过代码实现将Sheet1这个工作表命名为“考生信息”
//为工作簿创建工作表并命名
NPOI.SS.UserModel.ISheet sheet1 = excelBook.CreateSheet("考生信息");
第五步:书写工作表表头(学号 姓名 身份证号 性别 学院 专业 年级 班级 账号),这一步就是用代码创建Excel表格的第一行并进行赋值
创建第一行
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("班级");
row1.CreateCell(8).SetCellValue("账号");
//(2)数据:listStu
for (int i = 0; i < listStu.Count(); i++)
{
接下来就是通过for循环创建行和列,页面有多少数据传过来就创建多少行和多少列。注:因为第一行是表头行,已经创建了,所以i+1
NPOI.SS.UserModel.IRow rowTemp =
sheet1.CreateRow(i + 1);
在创建得行里创建9列并赋值
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);
}
给这个Excel表格通过时间来命名,这样可以保证文件名永远不会重复。
注:文件的后缀名必须是“.xls”或“.xlsx”才是Excel表格
var fileName = "考生信息" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";
第六步:使用IO流写出数据,数据的传输都是通过流文件传输
//将Excel表格转化为流,输出
//创建文件流
MemoryStream bookStream = new MemoryStream();
文件写入流(向流中写入字节序列)
excelBook.Write(bookStream);
//输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
bookStream.Seek(0, SeekOrigin.Begin);
返回流文件,并用Excel打开
return File(bookStream, “application/vnd.ms-excel”, fileName);
}