导入Excel表格

导入Excel表格
开发工具与关键技术:VS MVC
作者:木林森
撰写时间:2019年 5月12日

在做项目时,我们常需要对数据进行新增、修改、查询。在新增数据时,我们可以输入一条需要新增的信息,然后再进行保存,对于新增多条数据,重复步骤就行。但是在一些大型项目中,我们需要用到的数据非常多,此时如果有一个Excel表格,里面保存了我们需要用到的数据,那么我们怎样将它新增在我们的项目的项目呢?
在控制器中,导入Excel表格步骤如下:

  1. 下载模板
    首先在项目名称上右键—在文件资源管理器中打开文件—新建文件并命名为Document,然后在Document中新建文件并命名为Template,然后将需要用到的Excel表格放在里面(注意:此处的文件命名自己起,只要路径跟取的名字一致就行)。在下载模板的时候要先获取到模板的路径,然后判断模板是否存在,存在就获取文件的名称,然后返回文件;不存在就提示,模板不存在。
    例子代码如下:
    下载模板
    public ActionResult DownImportTemplate(){
    string filePath = Server.MapPath("~/Document/Template/员工信息导入模板.xls");
    if (System.IO.File.Exists(filePath)){
    string fileName = Path.GetFileName(filePath);
    return File(new FileStream(filePath, FileMode.Open), “application/octet-stream”, fileName);
    }else{return Content(“模板文件不存在,请联系系统运维人员。”);}
    }

  2. 将导入的Excel表格的数据保存到Session
    首先要清空Session中的ImportExcel,目的是避免残留有以前的数据
    然后判断页面传过来的文件是否为Excel表格,然后将Excel表格保存到Session中
    Excel表格的数据保存到Session分为4步:
    2.1:获取读取的文件:主要是获取文件的后缀,Excel文件后缀的大小写 (.XLS或.xls)
    2.2:把文件转化为二进制数组
    2.3:将二进制数组转成内存流
    将二进制数组转成内存流后再将内存流再转化为工作簿,再判断工作簿中是否有工作表,有就查询出表格数据对应的名称,用来根据名称获取对应的ID,接着声明一个对象列表,用于存放查询出的表格数据,然后获取第一个工作表,判断工作表中是否有数据,有就定义一个DataTable,将获取到的数据放到DataTable中,接着获取标题行、列数、行数,然后创建dataTable中的列,循环添加标题行中各个单元格的数据,再遍历表头行中每一个单元格,获取标题行各个单元格的数据,将获取到的标题行的数据放到dataTable中。完成这里后就可以读取Excel表格中的数据了,如果有需要的话还可以声明变量,记录成功和失败数据的条数,最后遍历DataTable中的数据,其中需要创建一个对象保存每一条数据,再获取Excel表格中需要用到的数据,将数据添加到对象列表中,遍历完后就可以将数据保存到Session中了。
    2.4:利用NPOI把内存流中的数据读取成Excel

  3. 提取Session中的数据并进行分页操作:先计算数据总条数,然后获取当前页面的数据,再实例化,最后返回数据

  4. 保存到数据库:这里需要判断上传的数据是否和数据库中已有数据重复,如果已经重复就不需要新增该条数据,如果没有就可以进行新增操作。
    在控制器中导入Excel表格的流程上面已经讲得很详细了,那么下面的就是在视图中我们需要做的:
    首先我们需要布局好弹出的模态框,例子代码如图1:
    导入Excel表格
    图1
    上面例子中需要注意四个点:
    1、 需要给模态框一个ID,当点击导入按钮时弹出模态框;
    2、 from表单要给它一个接收地址和发送方式,还需要给它一个ID,用于后面的表单重置;
    3、 需要给下载模板按钮和导入数据库按钮一个点击事件;
    4、 在临时表中需要给它一个ID,用于表格的渲染。
    在渲染完成后的表格如图2:
    导入Excel表格图2

在视图中,导入Excel的代码比较简单,代码请看下表:

1.弹出导入的Excel模态框 2、下载模板
function openImportExcel() {{
//重置表单 $("#formImportExcel").resetForm();
//禁用保存到数据库的按钮
$("#btnSaveImport").prop(“disabled”, true);
//清空临时表
employeeImport.reload({
url: “”, data: [] });
//点击背景时不关闭动态模态框,按下esc时不关闭动态模态框
KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲modImportExamin…("#modImportExaminee").modal(“show”);
} function downImportTemplate() {
//打开一个新的窗口,并在窗口中装载指定URL地址的网页window.open(“DownImportTemplate”);
}
3、上传Excel表格,保存到临时表 4、保存导入的Excel表格到数据库
function upExcel() {
//避免取消选择文件后触发上传
if ($("#fileUploadExecl").val() == “” || $("#fileUploadExecl").val() == undefined) {return;}
var layIndex = layer.load();//显示加载层
//提交表单 $("#formImportExcel").ajaxSubmit(function (Msg) {layer.close(layIndex);
if (Msg.State) { //启用保存到数据库的按钮 $("#btnSaveImport").prop(“disabled”, false);
employeeImport.reload({//表格数据重载
url: “SelectSessImportStudent” });
layer.alert(Msg.Text, { icon: 1, title: “提示” });
}else {
employeeImport.reload({//清空临时表 table
url: ‘’, data: []});
layer.alert(Msg.Text, { icon: 0, title: “提示” });
}
});
} function saveImport() {
//打开加载层
var layIndex = layer.load();
//请求保存导入的数据的url
$.post(“SaveImport”, function (Msg) {
layer.close(layIndex); //关闭加载层
//关闭模态框 $("#modImportExaminee").modal(“hide”);
//输出
layer.alert(Msg, { icon: 0, title: “提示” });
//刷新
searchTabStudent();
});
}
按步骤一步步做,就能够导入Excel 表格啦……