在平时的系统后台管理系统中会有很多的数据导入与导出,而这个时候兼容性很好的Excel表格就成了首选。而这个导入与导出成了一个很常见的问题,下边就解释一下我用的这一个,希望适合你呀。
一、导入
先看效果图(请忽略我的行内编辑):
这是一个效果图,接下来直接就上代码了。
先看前台吧。@**@
这是弹出的表格。用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 Listlist = new List (); 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")";}
就一个接受后台方法的时间,然后引入到前台代码就好了,是不是很简单呢。
欢迎关注点赞哦。