开发工具与关键技术: VS ,数据表格的导入
作者:刘佳明
撰写时间:2019年 5 月 5 日
(注:本文章所使用插件,代码均来源于老师的课件!!!!!)
之前就有说过,MVC的一些基本功能,本次小编就会为大家详细阐述,MVC的导入;
MVC导入,顾名思义,就是使用MVC来完成我们所要的数据导入,目前小编只学习了数据表格的导入,及Word文档的导入,本文只详细介绍数据表格的导入,
需要完成数据表格的导入,主要的思路如下;
页面构建(需要导入时会有一个layui表格的构建,需要将我们导入的数据对应的放入到layui表格中去,便于导入查看)~~ 需要准备数据表格的模板(该模板需要后勤人员准备)~~使用插件,在数据表格的导入,导出中都需要就将数据转化为流的形式来进行编辑(本次讲解使用的插件为NPOI的插件,并非只限该一种插件方法)~~具体的数据导入操作
在完成vs的一系列的操作后,在控制器中编辑下载导入模块的方法:具体代码如下:
public ActionResult DownImportTemplate(HttpPostedFileBase file)
{
string filePath = Server.MapPath("~/Document/Template/考生信息导入模板.xls");//模块所存放的位置;
if (System.IO.File.Exists(filePath))
{
//获取文件的名称
string strfileName = Path.GetFileName(filePath);//Path 将文件转化为路径;
return File(new FileStream(filePath, FileMode.Open), "application/octet-stream", strfileName);
}
else
{
return Content("模板文件不存在,请联系系统运维人员。");
}
}
下截图是导入时所弹出的个关于下载的提示框
//思路:
//(1)判断类型是不是: .xls
//1、获取读取的文件; 2、把文件转换为二进制数组;3、二进制数组转成内存流;4、利用NPOI把内存流中的数据读取成工作簿Excel
//(2)工作簿中有工作表
//(3)工作表有数据
//(4)数据准确性(学院 专业 年级 班级 表跟表之间的关系)
//(5)数据都有,然后读取数据。
因数据导入 的方法代码过于的繁多,在本文中小编也就截取其中每一思路中比较重要的部分,来讲解;
//1、获取读取的文件; 2、把文件转换为二进制数组;3、二进制数组转成内存流;4、利用NPOI把内存流中的数据读取成工作簿Excel
if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))///判断文件名称的后缀
{
//声明二进制数组存放文件
byte[] fileBytes = new byte[file.ContentLength];
//将传入的文件转化为二进制的数组存入fileBytes
file.InputStream.Read(fileBytes, 0, file.ContentLength);
//将二进制数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
//将内存流转化为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
//(2)工作簿中有工作表
利用单表的linq语句查询出对应的数据信息,
//(4)数据准确性(学院 专业 年级 班级 表跟表之间的关系)
// 定义datatable
DataTable dtExcel = new DataTable();
//将数据先装到datatable中
//获取标题行--- 第二行,索引为1;第一行是说明
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
//获取表格列数
int cellCount = rowHeader.LastCellNum;
//获取表格行数
int rowCount = sheet.LastRowNum + 1;
//创建dataTable中的列,循环添加标题行中各个单元格的值
for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
{
//通过遍历行中的每一个单元格,获取标题行各个单元格的数据
DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将获取到的标题行的数据放到datatable中;
dtExcel.Columns.Add(dtColumn);
//(5)数据都有,然后读取数据。
//读取Excel中的数据
//(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)
{
//获取行(1、2、3...)数据
NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//1
//创建DataTable行
DataRow dtRow = dtExcel.NewRow();
if (row != null)
{
//遍历excel中一行的所有单元格
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
dtRow[j] = row.GetCell(j).ToString();
}
}
}
//将填入数据的dtRow添入dtExcel
dtExcel.Rows.Add(dtRow);
}
int intSuccess = 0;
int intFail = 0;
//(4)数据准确性(学院 专业 年级 班级 表跟表之间的关系)
//遍历datatable中的数据
foreach (DataRow row in dtExcel.Rows)
{
//创建studentVo对象保存每一条数据
Student student = new Student();
try
{
//获取学院ID 和学院名称
student.AcademeName = row["学院"].ToString().Trim();
//通过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID
student.AcademeID = dbAcademe.Where(p => p.AcademeName == student.AcademeName).SingleOrDefault().AcademeID;
//获取专业id和名称
//根据学院ID和专业名称获取相应的专业ID
student.SpecialtyName = row["专业"].ToString().Trim();
student.SpecialtyID = dbSpecialty.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyName == student.SpecialtyName).SingleOrDefault().SpecialtyID;
//获取年级ID 和名称
//根据学院ID以及年级名称获取相应的年级ID
student.GradeName = row["年级"].ToString().Trim();
student.GradeID = dbGrade.Where(p => p.AcademeID == student.AcademeID && p.GradeName == student.GradeName).SingleOrDefault().GradeID;
//获取 班级ID和名称
//根据学院ID&专业ID&班级名称获取班级ID
student.ClassName = row["班级"].ToString().Trim();
student.ClassID = dbClass.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyID == student.SpecialtyID && p.GradeID == student.GradeID && p.ClassName == student.ClassName).SingleOrDefault().ClassID;
student.StudentNumber = row["学号"].ToString().Trim();
student.StudentName = row["姓名"].ToString().Trim();
student.StudentIDNum = row["身份证号"].ToString().Trim();
student.StudentSex = row["性别"].ToString().Trim();
student.UserNuber = row["账号"].ToString().Trim();
//将每一条数据都添加到对象列表中
listStudentVo.Add(student);
intSuccess++;//记录成功的条数
(本来想对代码进行更加详细解释的,但发现一旁的备注已经将每部分的代码说明的很具体了,所以小编也就不在做具体的讲解,如果有什么疑问的,可以私聊我,就这样,啾咪!!?)