以前习惯用一些框架来实现Excel文件数据导出,工作中也经常用到:比如extJs、easyUI、angularJs等,最近在做mvc程序的时候要实现该功能,相信这种功能在我们实际工作中是很常见,尤其是一些后台系统,导出报表之类的。因为本人在实际工作项目中开发一直都是用Ajax实现,所以这里也是一样,废话就不多说了,直接上代码:

1.后台新闻Index页面

 @model IEnumerable<MSCampus.MvcWebSite.Areas.Admin.Models.NewsViewModel>

 @{
ViewBag.Title = "Index";
}
</script>
<script>
//全选 反选功能
function selectAll(o) {
var chklist = document.getElementsByName("chkList");
for (var i = ; i < chklist.length; i++) {
chklist[i].checked = o.checked;
}
}
//批量删除
function delList() {
var flag = false;
var ids = '';
var chklist = document.getElementsByName("chkList");
for (var i = ; i < chklist.length; i++) {
if (chklist[i].checked) {
flag = true;
ids += chklist[i].value + ",";
}
}
if (flag) {
if (confirm("确定删除吗?")) {
$.ajax({
type: "post",
url: "/Admin/News/Delete",
data: { ids: ids.substr(, ids.length - ) },
success: function (data) {
if (data.result) {
alert(data.msg);
window.location.href = "/Admin/News/Index";
} else {
alert(data.msg);
}
}
});
}
} else {
alert("至少选中一项进行操作");
return false;
}
} //导出Excel
function ExportData() {
var ids = '';
var chklist = document.getElementsByName("chkList");
for (var i = ; i < chklist.length; i++) {
if (chklist[i].checked) {
flag = true;
ids += chklist[i].value + ",";
}
}
$.ajax({
type: 'POST',
url: '/Admin/News/ExportExcelFile',
data: { idlist: ids },
//contentType: 'application/json; charset=utf-8',
//dataType: 'json',
success: function (data) {
if (data.fileName != "") {
window.location = '/Admin/News/Download?file=' + data.fileName;
}
}
});
}
</script> <p>
@Html.ActionLink("发布新闻", "Create", null, new { @class = "btn btn-primary" }) &nbsp;
<input type="button" value="删除" onclick="delList()" class="btn btn-danger" />&nbsp;
<input type="button" value="导出Excel" class="btn btn-warning" onclick="ExportData()" />
</p>
<div class="main-content">
<div class="panel panel-default">
<a href="#page-stats" class="panel-heading" data-toggle="collapse">新闻列表 </a>
<div id="page-stats" class="panel-collapse panel-body collapse in">
<table class="table">
<tr>
<th><input type="checkbox" id="selectAll" onclick="selectAll(this)" /></th>
<th>
@Html.DisplayNameFor(model => model.Title)
</th>
<th>
@Html.DisplayNameFor(model => model.ViewTimes)
</th>
<th>
@Html.DisplayNameFor(model => model.CreateDate)
</th>
<th>操作</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
<input type="checkbox" name="chkList" value="@item.Id" />
</td>
<td title="@item.Title">
@if (item.Title.Length > )
{
@(item.Title.Substring(, ) + "...")
}
else
{
@item.Title
}
</td>
<td>
@Html.DisplayFor(modelItem => item.ViewTimes)
</td>
<td>
@Html.DisplayFor(modelItem => item.CreateDate)
</td>
<td>
@Html.ActionLink("编辑", "Edit", new { id = item.Id }) |
@Html.ActionLink("详细", "Details", new { id = item.Id })
</td>
</tr>
}
</table>
@Html.Partial("Paging")
</div>
</div>
</div>

2.请求控制器代码实现

[HttpPost]
public JsonResult ExportExcelFile(string idlist)
{
DataTable dt = _NewsBll.GetDataTableByIds(idlist.TrimEnd(',')); var fileName = string.Format("{0}新闻信息.xls", DateTime.Now.ToString("yyyyMMddHHssmm"));
//判断文件目录是否存在,不存在则创建
if (!Directory.Exists(Server.MapPath("~/MyTempFiles")))
{
Directory.CreateDirectory(Server.MapPath("~/MyTempFiles"));
}
//将生成的文件保存到服务器临时文件夹中
string fullPath = Path.Combine(Server.MapPath("~/MyTempFiles"), fileName); using (var exportData = NPOIExcelHelper.ExportToExcelStream(dt, "新闻列表"))
{
//创建一个文件
FileStream file = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
exportData.WriteTo(file);
file.Close();
}
//返回生成的文件名
return Json(new { fileName = fileName });
}

  3.使用NPOI生成文件返回IO流

   public static MemoryStream ExportToExcelStream(DataTable dt, string sheetName)
{
//创建一个工作簿
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
NPOI.SS.UserModel.ISheet sheet = book.CreateSheet(sheetName); //创建sheet //Excel表头
NPOI.SS.UserModel.IRow row = sheet.CreateRow(0); //创建行
ICellStyle style = book.CreateCellStyle(); //创建单元格
style.Alignment = HorizontalAlignment.Center; //对齐方式
style.VerticalAlignment = VerticalAlignment.Center; //单元格居中对齐 //表头
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
cell.CellStyle = style;
cell.SetCellValue(dt.Columns[i].ColumnName);
} #region 填充数据
for (int i = 1; i <= dt.Rows.Count; i++)//遍历DataTable行
{
DataRow dataRow = dt.Rows[i - 1];
row = sheet.CreateRow(i);//在工作表中添加一行 for (int j = 0; j < dt.Columns.Count; j++)//遍历DataTable列
{
ICell cell = row.CreateCell(j);//在行中添加一列
cell.SetCellValue(dataRow[j].ToString());//设置列的内容
}
}
#endregion
MemoryStream ms = new MemoryStream();
book.Write(ms);
return ms; //返回文件流
}

  

4.后台请求处理完成数据生成的文件然后进行下载

/// <summary>
/// 下载完后需要自动删除该文件 过滤器
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpGet]
[DeleteFile]
public ActionResult Download(string file)
{
string fullPath = Path.Combine(Server.MapPath("~/MyTempFiles"), file);
return File(fullPath, "application/vnd.ms-excel", file);
}

  5.同时考虑到服务器资源磁盘空间的占用,这里写了一个过滤器,文件生成下载成功后删除。

/// <summary>
/// 下载完文件后删除
/// </summary>
public class DeleteFileAttribute:ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Flush();
//将当前filtercontext 转换成具体操作的文件并获取文件路径
string filePath = (filterContext.Result as FilePathResult).FileName;
//有文件路径就可以直接删除相应文件
System.IO.File.Delete(filePath);
base.OnResultExecuted(filterContext);
}
}

  总结:以上是全部代码的实现,如有问题欢迎批评指正,谢谢!

ASP.NET MVC 异步Excel数据选择导出的更多相关文章

  1. Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel

    Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...

  2. asp.net mvc异步查询

    对于asp.net mvc异步查询 如何做MVC异步查询,做列表页面. 查询是项目中必不可少的工作,而且不同的项目不同的团队,都有自己的简单方法.Asp.net mvc 有自己独特的优势,下面是结合m ...

  3. ASP.NET MVC 5 - 将数据从控制器传递给视图

    在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果 ...

  4. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

  5. [转]ASP.NET MVC 5 - 将数据从控制器传递给视图

    在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果 ...

  6. Access中一句查询代码实现Excel数据导入导出

    摘 要:用一句查询代码,写到vba中实现Excel数据导入导出,也可把引号中的SQL语句直接放到查询分析器中执行正 文: 导入数据(导入数据时第一行必须是字段名): DoCmd.RunSQL &quo ...

  7. OpenXml Excel数据导入导出(含图片的导入导出)

    声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...

  8. 【ASP.NET MVC系列】数据验证和注解

    [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...

  9. ASP.NET MVC异步验证是如何工作的03,jquery.validate.unobtrusive.js是如何工作的

    在上一篇"ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建"中了解了ASP.NET异步验证是如何创建表单元素的,本篇体验jquery.validate.uno ...

随机推荐

  1. 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

    原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...

  2. 【SSRS】入门篇(二) -- 建立数据源

    原文:[SSRS]入门篇(二) -- 建立数据源 通过 [SSRS]入门篇(一) -- 创建SSRS项目 这篇,我们建立了一个SSRS项目: 接下来,我们以 AdventureWorks2012 示例 ...

  3. Android项目----dispathTouchEvent

    说到dispathTouchEvent,就不得不说一个最贱的屏幕触摸动作触发的一些列Touch事件: ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->A ...

  4. 使用 ArcGIS Online和APP进行监控操作和数据采集

    主要介绍的App是Operations Dashboard for ArcGIS 和 Collector for ArcGIS,它们 提高了组织内日常操作的效率.精度和响应速度. 已经购买了 ArcG ...

  5. ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统

    构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)   我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方 ...

  6. Linux : fedora 安装 vnc server

    Linux配置VNC服务 安装VNC服务端 #yum install vnc-server 配置VNC服务参数文件 编辑vncservers文件追加如下 #vi /etc/sysconfig/vncs ...

  7. Aforge.net 一个专门为开发者和研究者基于C#框架设计

    时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈...前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会. 这个系列我们 ...

  8. poj 2184(dp变形,进一步加深01背包)

    点击打开链接 题意: 给你n个物品,每个物品都有两个属性,s和f,要求选择一些物品,使sum(s)+sum(f)最大,并且sum(s)>=0&&sum(f)>=0, 根据0 ...

  9. c# in deep 之委托

    通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做.使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收.尤其是假如某“短命”的对象调用 ...

  10. c# in deep 之LINQ读取xml(2)

    假如有以下xml文件 <?xml version="1.0" encoding="utf-8" ?><Date>  <Produc ...