MVC中Excel数据的导入与导出

在平时的系统后台管理系统中会有很多的数据导入与导出,而这个时候兼容性很好的Excel表格就成了首选。而这个导入与导出成了一个很常见的问题,下边就解释一下我用的这一个,希望适合你呀。

一、导入

先看效果图(请忽略我的行内编辑):

这里写图片描述

这是一个效果图,接下来直接就上代码了。
先看前台吧。

  @* <form id="fm" enctype="multipart/form-data" >*@
 @using (Html.BeginForm("Import", "ExcelText",FormMethod.Post, new { enctype = "multipart/form-data" }))
  {
   <table width="100%" border="0" cellspacing="0" cellpadding="0" class="tk_table">
     <tr>
         <td>
            <input type="file" name="excel" />
         </td>
         <td>
            <input type="button" class="easyui-linkbutton"    value="上传" onclick="AddExcel();" />
         </td>
      </tr>
         </table>
   }
@*</form>*@

这是弹出的表格。用Form表单也行,我用的是USing,都可以。

  function ExcelIn() {
            $("#dptdialog").dialog({
                title: "导入Excel"
            });
            $("#dptdialog").dialog("open");
        }
        function AddExcel() {

            $('#dptdialog form').form('submit', {
                url: '@Url.Action("Import")',
                success: function (data) {
                    $("#custromList").datagrid("load");
                    $('#dptdialog form').form("reset");
                }
            });
            $('#dptdialog').dialog("close");
        }

表单上传调用的方法和按钮的方法。可以自己改,自己写,我只是提供一个思路。

接下来是重点,后台的代码问题。

 public ActionResult Import()
        {
            string msg = "导入失败";

   HttpPostedFileBase file = Request.Files["excel"];
   //1、先保存上传的excel文件(这一步与上传图片流程一致)
string extName =Path.GetExtension(file.FileName).ToLower();
string newFileName = System.Guid.NewGuid().ToString();
string path = Server.MapPath("~/Files/");
file.SaveAs(path + newFileName + extName);
 //2、读取excel文件(通过oledb将excel数据填充到datatable)
 //HDR=Yes,这代表第一行是标题,不做为数据使用,IMEX的含义(0:写入,1:读取,2:读取与写入)
 string filePath = path + newFileName + extName;//必须是物理路径
string conStr ="Provider=Microsoft.ACE.OLEDB.12.0; Persist Security Info=False;Data Source=" + filePath + "; Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";

OleDbDataAdapter adp = new OleDbDataAdapter("select * From[Sheet1$]", conStr); 
            //默认读取的Sheet1,你也可以把它封装变量,动态读取你的Sheet工作表
            DataTable dt = new DataTable();
            adp.Fill(dt);
            //3、将table转化成list
            List<Customer> list = new List<Customer>();

            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    list.Add(new Customer()
                    {
                        //有哪个写哪个
                        C_name = item["姓名"].ToString(),
                        C_age = item["年龄"].ToString(),
                        C_date = Convert.ToDateTime(item["出生年月"]),
                    });
                }
            }

            //4、跨action传值用tempdata

            //TempData["list"] = list;
            //return RedirectToAction("List");

            //如果不直接导入数据库这里不用写
            Customer model = new Customer();
            for (int i = 0; i < list.Count;i++ )
            {
                model.C_age = list[i].C_age;
                model.C_name = list[i].C_name;
                model.C_date = list[i].C_date;
                if (Bll.Add(model))
                {
                    msg = "导入成功!";
                }
            }
            return Json(msg);
        }

上边很多内容都加了注释了,应该比较清楚,只是可能CSDN的代码排序有点问题。最后的添加到数据库可以不用,我只是为了让他可以直接添加到数据库。
1、MVC中上传文件类型HttpPostedFileBase
2、SaveAs保存上传文件内容
3、forea循环的是数据表中的列。进行每一列的上传。

二、导出

ajax貌似不能进行Excel数据导出,所以我才用了window.location.href,同步操作。当然表单提交也是可以的。

首先我的方法用到了NPOI第三方组件,这个自己导入就可以了。

先书写后台

 public ActionResult ExportByNPOI()
        {
            //1、获取数据源(List变量)
var list=
Bll.Search(x=>true).Select(x=>new{x.C_age,x.C_date,x.C_name,x.ID}).ToList();
//2、创建Excel文件的对象
NPOI.HSSF.UserModel.HSSFWorkbook excel = new NPOI.HSSF.UserModel.HSSFWorkbook();
 //添加一个sheet
 NPOI.SS.UserModel.ISheet sheet = excel.CreateSheet("Sheet1");
            //给sheet1添加标题行
            NPOI.SS.UserModel.IRow head = sheet.CreateRow(0);
            head.CreateCell(0).SetCellValue("编号");
            head.CreateCell(1).SetCellValue("姓名");
            head.CreateCell(2).SetCellValue("年龄");
            head.CreateCell(3).SetCellValue("出生年月");
            //将数据逐步写入sheet1各个行
            for (int i = 0; i < list.Count; i++)
            {
                NPOI.SS.UserModel.IRow row = sheet.CreateRow(i + 1);
                row.CreateCell(0).SetCellValue(list[i].ID);
                row.CreateCell(1).SetCellValue(list[i].C_name);
                row.CreateCell(2).SetCellValue(list[i].C_age);
                row.CreateCell(3).SetCellValue(list[i].C_date.Value.ToString("yyyy-MM-dd"));//对时间格式进行一下初始化。
            }
            // 写入到客户端 
System.IO.MemoryStream ms = new System.IO.MemoryStream();
            excel.Write(ms);
            ms.Seek(0, SeekOrigin.Begin);
            return File(ms, "application/vnd.ms-excel", "顾客信息表.xls");
        }

该注释的我都已经加了注释,相信都可以明白的命名之类的就不要在意了,随便写的。

接下来看前台

 function GetExcel() {
    //window.location.href刷新当前页面,当前页面打开URL页面,同步提交
    window.location.href = "@Url.Action("ExportByNPOI")";
}

就一个接受后台方法的时间,然后引入到前台代码就好了,是不是很简单呢。



欢迎关注点赞哦。

posted on 2017-08-03 15:16  Grant-fu  阅读(366)  评论(0编辑  收藏  举报

导航