开发工具与关键技术:VS C#
作者:梁茵茵
撰写时间:2019年 5月 6日
把数据导入到页面上的时候,也就是把数据导入到数据库。所以不是直接点击导入按钮选择要导入的数据就可以直接把数据导入到页面上的,而是要下载一个模板,这个模板的格式要跟页面的格式一致。下载的模板的第一行也就是表头的列,要对应页面表格第一行的表头的列。导入表格的格式要跟页面表格的格式一一对应,这样导入进来的数据才匹配。
下面便是把Excel表格的数据导入到页面的操作步骤:
首先,当用户点击“导入”这个按钮的时候会弹出一个提示框,这是一个有两个按钮的提示框。一个按钮是“下载导入模板”,一个按钮是“导入到数据库”。为了不让用户直接把数据导入到页面,所以要禁用“导入到数据库”这个按钮。
//禁用导入数据库的按钮
$("#导入到数据库").prop("disabled", true);
把编写好的模板放在项目的文件夹里,这样用户就可以下载这个模板了。通过Server找到服务器的路径,再通过MapPath找到文件在项目的位置来获取这个模板。判断如果获取不了这个模板就要联系维护人员;如果获取这个模板就用IO流来读取这个文件,以文件流的格式返回来。在获取文件的时候是要通过一个IO流来获取,不可以直接获取,要通过一个中间值来接收数据。流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
public ActionResult DownImportTemplate(HttpPostedFileBase file)
{
string filePath = Server.MapPath("~/Document/Template/考生信息导入模板.xls");
if (System.IO.File.Exists(filePath))
{
string strfileName = Path.GetFileName(filePath);
return File(new FileStream(filePath, FileMode.Open),
"application/octet-stream", strfileName);
}
else
{
return Content("模板文件不存在,请联系系统运维人员。");
}
}
下载的模板会默认到你电脑指定的位置上,不同的浏览器默认下载的路径不同。
function downImportTemplate() {
window.open('/ExaminationManagement/SetExaminee/DownImportTemplate');
}
其次,当用户下载好模板后,就可以在下载好的模板里填写要导入的数据,点击Browse这个按钮可以进行筛选要导入的数据,不是说所有的文件都可以选择并进行导入的,一定要选择xls格式的Excel表格的文件才可以导入数据。
1、获取文件的后缀:
string fileExtension = Path.GetExtension(file.FileName);
2、判断类型是不是: .xls或.XLS 格式的,否则提醒用户"选中的文件类型不正确!":
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插件将内存流转化为工作簿:
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
3、获取工作簿之后就判断是否有工作表,否则提醒用户"工作簿中没有工作表!":
if (workbook.NumberOfSheets > 0)
因为一个工作簿可以有多个工作表,所有获取第一个工作表,索引值为0:
NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
4、如果有工作表就判断工作表是否有数据,否则提醒用户"工作表数据为空":
if (sheet.PhysicalNumberOfRows > 0)
定义datatable,将数据先装到datatable中:
DataTable dtExcel = new DataTable();
获取标题行,第二行,索引为1;模板的第一行是表头,数据从第二行开始获取:
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1);
获取表格列数:
int cellCount = rowHeader.LastCellNum;
获取表格行数,要加上表头行:
int rowCount = sheet.LastRowNum + 1;
5、判断数据的准确性,要判断导入进来的数据是否有重复的,表头的数据是否一一对应,学院、专业、年级、班级这些表跟表之间的关系。用Linq语句来查询,学院、专业、年级、班级必须是已经录入的数据;专业和年级必须是所填学院下的,班级必须是该学院的所填专业和年级下的。经过一系列的判断之后才可以执行导入操作,将每一条数据都添加到对象列表中,并记录导入成功和导入失败的条数:
listStudentVo.Add(student);
intSuccess++;//记录成功的条数
intFail++;//记录失败的条数
把数据保存到Session当中:
Session["ImportExcel"] = listStudentVo;
returnJson.State = true;
{0},{1}和{2}是占位符,分别给dtExcel.Rows.Count,intSuccess和intFail占位的:
returnJson.Text = String.Format("success;excel文件中共{0}条信息,{1}条匹配成功,{2}条匹配失败",
dtExcel.Rows.Count, intSuccess, intFail);
为了保证每次导入数据的时候没有之前的痕迹,所有把session中的ImportExcel移除避免残留以前数据
Session.Remove("ImportExcel");
效果图如下:
最后,还要对Excel表格的数据转换成在页面上显示是有分页的格式,当用户点击Browse这个按钮的时候,Excel表格的数据就会显示在页面上,被禁用的“导入到数据库”这个按钮就可以执行导入操作了。把数据导入到页面其实就是把数据新增到数据库,所以就重复再写一下新增的代码即可。
启用“导入到数据库”这个按钮:
$("#btnSaveImport").prop('disabled', false);