导入
HTML代码
<div class="modal fade" id="modExcelData" data-backdrop="static">
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header bg-green">
<h4 class="modal-title">导入Excel数据</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body" style="height:400px;">
<div class="container-fluid">
<div class="row">
<div class="col">
<form action="/" method="post" id="frmExcelData">
<input type="file" name="file" accept=".xls" value="dd" onchange="upExcel()">
</form>
</div>
<div class="col text-right">
<button class="layui-btn layui-btn-sm" id="ImportDatabase">导入到数据库</button>
</div>
</div>
<div class="row ">
<div class="col">
<table id="tabStuExcel" class="layui-table" layui-filter="tabStuExcel"></table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
109
第一步、弹出模态框
function openImportModal() {
$("#importStudentModal").modal();
$("#fileExcel").val(null);
}
110
第二步:点击下载 下载Excel模板文件
Js代码:
//下载上传模板
function downImportTemplate() {
window.open("/Student/DownImportTemplete");
}
C#代码
public ActionResult DownImportTemplete()
{
string templatePath = Server.MapPath("~/Document/考生信息导入模板.xls");
if (System.IO.File.Exists(templatePath))
{
//返回文件,通过EXCEL打开
return File(templatePath, "application/vnd.ms-excel", "123.xls");
}
else
{
return Content("模板文件不存在");
}
}
第三步:选择上传文件 (注意:不要修改模板的基本格式)
js代码:
function uploadExcelFile() {
//files获取上传的文件
var fileExcel = $("#fileExcel").get(0).files[0];//先获取fileExcel input标签然后通过get(0)把它转化为一个JS对象,再调用files属性
var formData = new FormData();//创建一个formData ,把要上传的数据添加formData 里面
formData.append("excelFile", fileExcel);
var layerIndex = layer.load();//加载层
//通过异步数据提交把formData提交到指定的路径下面
$.ajax({
url: '/Student/ImportExcel',//路径
method: 'post',//提交方式
contentType: false,//让Ajax不指定数据类型
processData: false,//让Ajax不对数据进行处理
data: formData,//要上传的数据
success: function (jsonMsg) {
layer.close(layerIndex);
layer.alert(jsonMsg.Text);
if (jsonMsg.state) {
StudentReload();//刷新表格
$("#importStudentModal").modal("hide");//关闭模态框
}
}
})
}
需引用NPOI
112
C#思路:
- 获取读取的文件
- 把文件转换为二进制数组
- 二进制数组转成内存流
- 利用NPOI把内存流中的数据读取成Excel
代码:(有点多喔!!!)
public ActionResult ImportExcel(HttpPostedFileBase excelFile)
{
returnJson msg = new returnJson();//NPOI对Excel文件进行读写操作
try
{
//获取文件后缀
string fileExtension = Path.GetExtension(excelFile.FileName);
//判断文件类型是否为指定的文件类型 ".xls",".xlsx"
if (".xls".Equals(fileExtension) || ".XLS".Equals(fileExtension))
{
//声明一个二进制的变量存放数组
byte[] fileBytes = new byte[excelFile.ContentLength];
//把传入文件转化为二进制的数组存入fileBytes
excelFile.InputStream.Read(fileBytes, 0, excelFile.ContentLength);
//将二进制数组转换为内存流
//MemoryStream 创建其支持存储区为内存的流。
MemoryStream excelFiledStream = new MemoryStream(fileBytes);
//将内存流转换为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFiledStream);
//判断工作簿中是否有工作表
if (workbook.NumberOfSheets > 0)
{
List<SYS_Academe> dbAcademe = myModel.SYS_Academe.ToList();
List<SYS_Specialty> dbSpecialty = myModel.SYS_Specialty.ToList();
List<SYS_Grade> dbGrade = myModel.SYS_Grade.ToList();
List<SYS_Class> dbClass= myModel.SYS_Class.ToList();
//对象列表--存放要保存的数据
List<SYS_Student> listStudent = new List<SYS_Student>();
//获取第一个工作表
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 dbColum = new DataColumn(rowHeader.GetCell(i).StringCellValue);
//将获取到的标题行的数据放到datatable中
dtExcel.Columns.Add(dbColum);
}
//读取Excel中的数据
//(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息
#region 将Excel中的数据添加到dtExcel
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)
{
//遍历一行中所有的单元格
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
#region 将dtExcel中的数据读取出来 转换为student对象 然后将学生数据添加到listStudent列表中
//遍历 根据名称匹配 学院ID 专业ID 年级ID 班级ID
for (int i = 0; i < dtExcel.Rows.Count; i++)
{
DataRow row = dtExcel.Rows[i];
//创建student对象保存每一条数据
SYS_Student student = new SYS_Student();
//获取学院ID
//通过dataTable中的AcademeName到dbAcademe中查找相应的
try
{
student.academeID = dbAcademe.Where(m => m.academeName == row["学院"].ToString().Trim()).Single().academeID;
}catch(Exception e)
{
Debug.WriteLine(e);
msg.Text = string.Format("第{0}学生数据 学院无法匹配",i+1);
return Json(msg, JsonRequestBehavior.AllowGet);
}
//获取专业id和名称
//根据学院ID和专业名称获取相应的专业ID
string specialtyName = row["专业"].ToString().Trim();
try
{
student.specialtyID = dbSpecialty.Where(p => p.academeID == student.academeID && p.specialtyName == specialtyName).Single().specialtyID;
}
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.academeID == student.academeID && 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&班级名称获取班级ID
string className = row["班级"].ToString().Trim();
try
{
student.classID = dbClass.Where(p => p.academeID == student.academeID && p.specialtyID == student.specialtyID && p.gradeID == student.gradeID && p.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.studentNumber = row["学号"].ToString().Trim();
student.studentName = row["姓名"].ToString().Trim();
student.studentSex = row["性别"].ToString().Trim();
student.studentIDNum = row["身份证号"].ToString().Trim();
//将每一条数据都添加到对象列表中
listStudent.Add(student);
}
#endregion
//保存数据到数据库
//myModel.SYS_Student.AddRange(listStudent);
//myModel.SaveChanges();
using(TransactionScope scope=new TransactionScope())
{
//保存数据到数据库
myModel.SYS_Student.AddRange(listStudent);
if (myModel.SaveChanges() == listStudent.Count)
{
scope.Complete();//提交事务
msg.state = true;
msg.Text = "导入成功";
}
else
{
msg.Text = "导入失败";
}
}
}
else
{
msg.Text = "工作表中无数据";
}
}
else
{
msg.Text = "该工作簿中没有工作表";
}
}
else
{
msg.Text = "选择的文件类型不正确";
}
}
catch(Exception e)
{
Debug.WriteLine(e);
msg.Text = "数据导入异常";
}
return Json(msg, JsonRequestBehavior.AllowGet);
}