导入数据
1.
下载导入数据模板
相对应的物理文件路径 string filePath = Server.MapPath("~/Document/学生导入模板.xls");
首先判断文件是否存在
if (System.IO.File.Exists(filePath))
{
如果存在获取文件的名称
string strfileName =
Path.GetFileName(filePath);
// 参数:File(fileStream要发送到响应的流,
// contentType内容类型(MIME 类型),
fileDownloadName浏览器中显示的文件下载对话框内要使用的文件名。) */
return File(new FileStream(filePath,
FileMode.Open), “application/octet-stream”, strfileName);
}
else
{
//使用字符串创建一个内容结果对象。
return Content("模板文件不存在,请联系系统运维人员。");
}
2.上传
//定义表单数据对象
FormData
var fdObj = new FormData();
//获取表单中的数据
var xlsFile =
$(’#fileExcel’).get(0).files[0];
//向对象中添加要发送的数据
fdObj.append(“xlsFile”, xlsFile);
//创建XMLHttpRequest对象
var xhr = new
XMLHttpRequest();
var layerIndex =
layer.load();//打开加载层
//指定提交类型和选择要发送的地址 上传文件只能使用POST请求,不能用get请求
xhr.open("post",
“@Url.Content(”~/Main/ImportExcel")");
1、获取上传的文件;
2、把文件转换为二进制数组;
3、二进制数组转成内存流;
4、利用NPOI把内存流中的数据读取成Excel
5、使用NPOI读取数据
传递文件的方式
public ActionResult ImportExcel(HttpPostedFileBase xlsFile)
获取文件的后缀
string fileExtension = Path.GetExtension(xlsFile.FileName);
声明二进制数组存放文件
byte[] fileBytes = new byte[xlsFile.ContentLength];
将传入的文件转化为二进制的数组存入fileBytes
InputStream.Read(fileBytes,
0, xlsFile.ContentLength);
//将二进制数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
//将内存流转化为工作簿
NPOI.SS.UserModel.IWorkbook workbook = new
NPOI.HSSF.UserModel.HSSFWorkbook(excelFileStream);
判断是否存在工作表如果存在获取第一个工作表
if
(workbook.NumberOfSheets > 0)
NPOI.SS.UserModel.ISheet sheet =
workbook.GetSheetAt(0);
判断工作表是否有数据
PhysicalNumberOfRows
获取的是物理行数,也就是不包括那些空行(隔行)的情况。
if
(sheet.PhysicalNumberOfRows > 0)
将数据添加到 DataTable
DataTable dtExcel = new DataTable();
获取表格列数
int cellCount =
rowHeader.LastCellNum; 获取列的总数
bool rowDataIsEmpty = true;//表示是否是空行默认为空行
for (int j = 0; j <
dtExcel.Columns.Count; j++)
{
判断数据是否为空
if (!string.IsNullOrEmpty(dtExcel.Rows[i][j].ToString().Trim()))
{
rowDataIsEmpty =
false;
}
}
if (rowDataIsEmpty == true)
{
removeList.Add(dtExcel.Rows[i]);
}
}
移除掉空格
for (int i = 0; i <
removeList.Count; i++)
{
dtExcel.Rows.Remove(removeList[i]);
}
查询出所有数据(用于后面判断导入的数据的准确性)
List<S_Student> tudent = (from tbstudent
in myModel.S_Student
select tbstudent
).ToList();
查询出所有数据(用于后面判断导入的数据的准确性)
List<S_Class> classnt = (from
tbcalssName in myModel.S_Class
select tbcalssName
).ToList();
将dataTable中的数据转换为List<S_User>
定义存放容器(用于保存新增的数据)
List<S_Student> saveUsers = new
List<S_Student>();
遍历datatable中的数据
for (int i = 0; i < dtExcel.Rows.Count; i++){
try
{
DataRow dr = dtExcel.Rows[i];
创建一个S_User实例保存一条用户数据
S_Student addUser = new S_Student();
获取表格行数
int rowCount =
sheet.LastRowNum + 1;//工作表获取行总数
所有的行
for (int i = 0; i < dtExcel.Rows.Count; i++)
{
添加到要保存的列表saveUsers
aveUsers.Add(addUser);
添加到用于查重的列表allUsers
tudent.Add(addUser);
保存到数据库