在平时的系统后台管理系统中会有很多的数据导入与导出,而这个时候兼容性很好的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")";
}
就一个接受后台方法的时间,然后引入到前台代码就好了,是不是很简单呢。
欢迎关注点赞哦。