数据导入操作
Posted 是小叶的呢.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据导入操作相关的知识,希望对你有一定的参考价值。
效果图如下:
点击导入,把表中的数据导入在数据表格里面
需要导入的数据如下:
数据成功导入数据表格
html部分如下:
<div class="modal fade" id="importStudentModal" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">导入学生</h5>
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="container-fluid">
<form id="formImport">
<div class="row">
<div class="col">
<span>1、请先下载模板文件:</span>
<button type="button" class="btn btn-primary btn-sm" onclick="downImportTemplate()">下载</button>
</div>
</div>
<div class="row mt-3">
<div class="col">
<span>2、将需要导入的数据填写到模板中。请不要修改模板的基本格式</span>
</div>
</div>
<div class="row mt-3">
<div class="col">
<span>3、选择填写好数据的excel文件(.xls):</span>
<input type="file" class="form-control" accept=".xls" id="fileExcel" />
</div>
</div>
<div class="row mt-3">
<div class="col">
<button type="button" class="btn btn-primary btn-sm" onclick="uploadExcelFile()">上传</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
javascript部分如下:
function uploadExcelFile() {
var fileExcel = $("#fileExcel").get(0).files[0];
var formData = new FormData();
formData.append("excelFile", fileExcel);
var layerIndex = layer.load();
$.ajax({
url: "/BaseInfor/Student/uploadInfor",
method: 'post',
contentType: false,//让Ajax不指定数据类型
processData: false,//让Ajax不对数据进行处理
data: formData,
success: function (jsonMsg) {
layer.close(layerIndex);
layer.alert(jsonMsg.Text);
if (jsonMsg.State) {
tabStudentSearch();
$("#importStudentModal").modal('hide');
}
}
});
}
控制器部分如下:
// 上传导入的excel表格
public ActionResult uploadInfor(HttpPostedFileBase excelFile)
{
ReturnJson msg = new ReturnJson();
try
{
//思路:
// 1、获取读取的文件
// 2、把文件转换为二进制数组
// 3、二进制数组转换成内存流
// 4.利用NPOI把内存流中的数据读取成Excel
//获取文件的扩展名
string fileExtension = Path.GetExtension(excelFile.FileName);
//判断文件类型是否为指定的文件类型
if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))
{
//声明二进制数组存放文件
byte[] fileBytes = new byte[excelFile.ContentLength];
//将传入的文件转化为二进制数组存入fileBytes
excelFile.InputStream.Read(fileBytes, 0, excelFile.ContentLength);
//将二进制数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
//将内存流转化为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
//判断工作簿中是否有工作表
if (workbook.NumberOfSheets > 0)
{
//查询出学院 专业 年级 班级 的信息:用来根据名称获取对应的ID
List<Collegechart> dbcollege = myModal.Collegechart.ToList();
List<Zhuanyechart> dbzhuanye = myModal.Zhuanyechart.ToList();
List<Gradechart> dbgrade = myModal.Gradechart.ToList();
List<Classchart> dbclass = myModal.Classchart.ToList();
//对象列表--存放要保存的数据
List<Studentchart> liststudent = new List<Studentchart>();
//获取第一个工作表
NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
//PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)
//判断工作表中是否有数据
if (sheet.PhysicalNumberOfRows > 0)
{
//将数据先装到datatable中
//定义datatable
DataTable dtExcel = new DataTable();
//获取标题行 第二行索引值为1
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
//FirstCellNum:获取某行第一个单元格下标
//LastCellNum:获取某行的列数
//FirstRowNum:获取第一个实际行的下标
//LastRowNum:获取最后一个实际行的下标
//获取表格列数
int cellCount = rowHeader.LastCellNum;
//获取表格行数
int rowCount = sheet.LastRowNum + 1;
//创建datatable中的列,循环添加标题行中各个单元格的值
for (int i = rowHeader.FirstCellNum; i < cellCount; i++)
{
//通过遍历行中的每一个单元格,获取标题行各个单元格的数据
DataColumn dtColum = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将获取到的标题行的数据放到datatable中
dtExcel.Columns.Add(dtColum);
}
//读取excel中的数据
//(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
#region 读取第一个工作表中的数据 到DataTable中
for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++)
{
//获取行(1、2、3...)数据
NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
//创建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);
}
}
#endregion
//遍历根据名称匹配 学院ID 专业ID年级ID 班级ID
# region 遍历根据名称匹配 学院ID 专业ID年级ID 班级ID
for(int i = 0; i < dtExcel.Rows.Count; i++)
{
DataRow row = dtExcel.Rows[i];
//创建student对象保存每一条数据
Studentchart student = new Studentchart();
//获取学院ID
//通过dataTable中的dbcollege中查找相应的collegeID
string collegeName = row["学院"].ToString().Trim();
try
{
student.collegeID = dbcollege.Where(o => o.collegeName ==
collegeName).Single().collegeID;
}
catch (Exception e)
{
Debug.WriteLine(e);
msg.Text = string.Format("第{0}学生数据 学院 无法匹配", i +1);
return Json(msg, JsonRequestBehavior.AllowGet);
}
//获取年级ID 和名称
//根据学院ID以及年级名称获取相应的年级ID
string gradeName = row["年级"].ToString().Trim();
try
{
student.gradeID = dbgrade.Where(p => p.collegeID == student.collegeID
&& p.gradeName == gradeName)
.Single().gradeID;
}
catch (Exception e)
{
Debug.WriteLine(e);
msg.Text = string.Format("第{0}学生数据 年级 无法匹配", i + 1);
return Json(msg, JsonRequestBehavior.AllowGet);
}
//获取专业id和名称
//根据学院ID和专业名称获取相应的专业ID
string zhuanye = row["专业"].ToString().Trim();
try
{
student.zhuanyeID = dbzhuanye.Where(p => p.collegeID == student.collegeID
&& p.zhuanyeName == zhuanye)
.Single().zhuanyeID;
}
catch (Exception e)
{
Debug.WriteLine(e);
msg.Text = string.Format("第{0}学生数据 专业 无法匹配", i + 1);
return Json(msg, JsonRequestBehavior.AllowGet);
}
//获取班级ID和名称
//通过dataTable中的dbcollege中查找相应的zhuanyeID
string className = row["班级"].ToString().Trim();
try
{
student.classID = dbclass.Where(o => o.collegeID == student.collegeID
&& o.zhuanyeID == student.zhuanyeID&&o.className==className).Single().classID;
}
catch (Exception e)
{
Debug.WriteLine(e);
msg.Text = string.Format("第{0}学生数据 班级 无法匹配", i + 1);
return Json(msg, JsonRequestBehavior.AllowGet);
}
if (!IdCardHelper.CheckIdCard(row["身份证号"].ToString().Trim()))
{
msg.Text = string.Format("第{0}学生数据 身份证号不正确", i + 1);
return Json(msg, JsonRequestBehavior.AllowGet);
}
student.studentCode = row["学号"].ToString().Trim();
student.studentName = row["姓名"].ToString().Trim();
student.idCard = row["身份证号"].ToString().Trim();
student.studentSex = row["性别"].ToString().Trim();
//将每一条数据添加对象列表中
liststudent.Add(student);
}
#endregion
//开启事务
using(TransactionScope scope=new TransactionScope())
{
//保存到数据库
myModal.Studentchart.AddRange(liststudent);
if (myModal.SaveChanges()==dtExcel.Rows.Count)
{
scope.Complete();//提交事务
msg.State = true;
msg.Text = "导入成功";
}
else
{
msg.Text = "导入失败";
}
}
}
else
{
msg.Text = "工作表为空";
}
}
else
{
msg.Text = "工作簿中没有工作表";
}
}
else
{
msg.Text = "请选择Excel文件上传";
}
}
catch (Exception)
{
msg.Text = "上传失败,类型不对应;请检查是否有工作表,是否有数据,";
}
return Json(msg, JsonRequestBehavior.AllowGet);
}
以上是关于数据导入操作的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程