Asp.net MVC 简单实现生成Excel并下载
由于项目上的需求,需要导出指定条件的Excel文件。经过一翻折腾终于实现了。
现在把代码贴出来分享
(直接把我们项目里面的一部份辅助类的代码分享一下)
我们项目使用的是Asp.Net MVC4.0模式。
每个ActionResult必然会返回一个View或Json等(View或Json中的参数都是object类型的)
所以我们需要一个公共类来统一定义操作的“成功或失败”的状态或返回操作的消息 ,以及有利于使用jquery $.get() 、$.post()的接收返回参数时的统一性。
以下是StatusMessageData类。(当然,如果只想要导出Excel,这个类是不需要定义的。)
/// <summary>
/// 辅助传输StatusMessage数据
/// </summary>
[Serializable]
public sealed class StatusMessageData
{
private StatusMessageType messageType;
/// <summary>
/// 提示消息类别
/// </summary>
public StatusMessageType MessageType
{
get { return messageType; }
set { messageType = value; }
} private string messageContent = string.Empty;
/// <summary>
/// 信息内容
/// </summary>
public string MessageContent
{
get { return messageContent; }
set { messageContent = value; }
} private object data; /// <summary>
/// 数据
/// </summary>
public object Data
{
get { return data; }
set { data = value; }
}
/// <summary>
/// 构造器
/// </summary>
/// <param name="messageType">消息类型</param>
/// <param name="messageContent">消息内容</param>
public StatusMessageData(StatusMessageType messageType, string messageContent, object data)
{
this.messageType = messageType;
this.messageContent = messageContent;
this.data = data;
}
public StatusMessageData(StatusMessageType messageType, string messageContent)
{
this.messageType = messageType;
this.messageContent = messageContent;
}
public StatusMessageData()
{
}
} /// <summary>
/// 提示消息类别
/// </summary>
public enum StatusMessageType
{
/// <summary>
/// 成功
/// </summary>
Success = , /// <summary>
/// 错误
/// </summary>
Error = -, /// <summary>
/// 提示信息
/// </summary>
Hint = ,
/// <summary>
/// 提醒登录
/// </summary>
Login = ,
/// <summary>
/// 提示重定向
/// </summary>
Redirect = ,
}
在Controller中定义ExportExcel ActionResult
[HttpPost]
public ActionResult ExportExcel(SearchModel model)
{ StatusMessageData result = new StatusMessageData();
if (model.Data == null || model.Data.Count <= )
{
result.MessageType = StatusMessageType.Error;
result.MessageContent = "没有要下载的数据";
return Json(result);
}
string fileglobal = "";
//组织Excel表格
StringBuilder sb = new StringBuilder();
sb.Append("<table cellspacing='0' rules='all' border='1'>");
sb.Append("<thead>");
sb.Append("<tr>");
sb.Append("<th>列一</th>");
sb.Append("<th>列二</th>");
sb.Append("<th>列三</th>");
sb.Append("<th>列四</th>");
sb.Append("</tr>");
sb.Append("</thead>");
sb.Append("<tbody>");
try
{
foreach (var item in model.Data)
{
sb.Append("<tr>");
sb.Append("<td>");
sb.Append(item.column1);
sb.Append("</td>");
sb.Append("<td>");
sb.Append(item.column2);
sb.Append("</td>");
sb.Append("<td>");
sb.Append(item.column3);
sb.Append("</td>");
sb.Append("<td>");
sb.Append(item.column4);
sb.Append("</td>");
sb.Append("</tr>"); }
} sb.Append("</tbody>");
sb.Append("</table>");
//以UTF8格式写入文件
byte[] contentBytes = Encoding.UTF8.GetBytes(sb.ToString()); string rootDirServerPath = "将生成的文件保存在指定的目录名称";
//由于我们项目上下载Excel文件基本没有并发的情况,所以只用年月日时分秒来命名文件就可以避免生成相同文件名文件的问题。
string fileSaveName = "下载的文件名称_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; string rootDirServerPhysicPath = Server.MapPath("~" + rootDirServerPath);
if (!Directory.Exists(rootDirServerPhysicPath))
{
Directory.CreateDirectory(rootDirServerPhysicPath);
}
string[] strFiles = Directory.GetFiles(rootDirServerPhysicPath);
if (strFiles.Length > )
{
foreach (string strFile in strFiles)
{
System.IO.File.Delete(strFile);
}
}
//以下是将文件保存到指定目录
string userFailedSummaryFileSavePath = rootDirServerPhysicPath + "/" + fileSaveName;
if (System.IO.File.Exists(userFailedSummaryFileSavePath))
{
System.IO.File.Delete(userFailedSummaryFileSavePath);
}
System.IO.File.WriteAllBytes(userFailedSummaryFileSavePath, contentBytes);
//拼装好要下载文件的全路径。
fileglobal = rootDirServerPath + "/" + fileSaveName;
}
catch (Exception ex)
{
result.MessageType = StatusMessageType.Error;
result.MessageContent = ex.Message.ToString();
return Json(result);
}
result.MessageType = StatusMessageType.Success;
result.MessageContent = "正在下载,请稍候...";
result.Data = fileglobal;
return Json(result);
}
完成了生成Excel的操作后,在页面进行异步调用。
$("#export-excel").click(function (e) {
e.preventDefault();
$.post("Controller/ExportExcel.aspx", $("#Form1").serialize(), function (data) {
art.dialog.tips(data.MessageContent, 1.5, data.MessageType, function () {
if (data.MessageType == 1) {
window.open(data.Data);
} else {
//错误操作
}
});
});
});
以上就是我们项目中关于Excel生成到下载的全部操作。
考虑的情况比较少,写的比较简单。
如果大家有什么好的想法,可以留言,我肯定会学习并实践好再拿出来分享。
非常感谢。
如果对您有帮助,请点赞!
Asp.net MVC 简单实现生成Excel并下载的更多相关文章
- ASP.NET MVC 简单介绍①
ASP.NET MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...
- ASP.NET MVC 简单事务添加
ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...
- ASP.NET MVC 简单分页代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- Asp.net MVC 简单分页 自做简单分页
Asp.net MVC 简单分页: public static string Pager(int page,int pageSize,int total) { ...
- phpexcel生成excel并下载
Loader::import('PHPExcel.Classes.PHPExcel'); // tp5中只需将phpexcel文件放入extend文件夹中,即可采用该方法引入,需要先 use thin ...
- ASP.NET MVC 解析模板生成静态页一(RazorEngine)
简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是ASPX模板引擎,Razor在语法上的确不错,用起来非常方便,简洁的语法 ...
- Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门
一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...
- ASP.NET MVC简单编程之(二)经典路由篇
话题:请求从路由开始 在实际的ASP.NET MVC开发中,URL访问规则----路由的定义是非常重要的.因为任何一个请求都离不开路由.理解它,我们将能理解MVC处理请求的整个过程,灵活地定义系统各种 ...
- ASP.NET MVC API 路由生成规则
我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action.RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定 ...
随机推荐
- 在为知笔记中使用Markdown和思维导图
为知笔记Wiz是一款很好的网摘和笔记工具,作为为知的忠实用户,我在为知收费后第一时间就购买了两年的授权,毕竟这么多年积累的资料都在为知上,我也习惯了使用Wiz来做些工作相关的笔记.为知笔记自带Mark ...
- 40个Java多线程问题
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- Celery 源码解析四: 定时任务的实现
在系列中的第二篇我们已经看过了 Celery 中的执行引擎是如何执行任务的,并且在第三篇中也介绍了任务的对象,但是,目前我们看到的都是被动的任务执行,也就是说目前执行的任务都是第三方调用发送过来的.可 ...
- FLP不可能性(FLP impossibility)
FLP不可能性(FLP impossibility) FLP impossibility是一个定理,它证明了在分布式情景下,无论任何算法,即使是只有一个进程挂掉,对于其他非失败进程,都存在着无法达成一 ...
- MongoDB的mongos实例因无法分配mlock内存挂掉
问题版本 mongodb-v3.4.4 问题描述 mongos两天死了两次,死前遗言只有日志: 2017-11-01T11:25:27.135+0800 F - [NetworkInterfaceAS ...
- [转载] PHP 线程,进程和并发
转载自http://chenpeng.info/html/3021 进程 进程是什么?进程是正在执行的程序:进程是正在计算机上执行的程序实例:进程是能分配给处理器并由处理器执行的实体. 进程一般会包括 ...
- Python和Excel交互
Python和Excel交互 使用的python包为XlsxWriter 下载的链接 https://pypi.python.org/pypi/XlsxWriter 初级的例子: def write_ ...
- 【转】MYSQL 使用SQLyog导入遇到问题解决
原文地址:http://blog.163.com/o5655@126/blog/static/1667428342010910112510738/ 昨天公司想要将一个数据库的数据导出再导入到另外一个 ...
- Java提高十七:TreeSet 深入分析
前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...
- 打字机效果-so easy
html <p> <span>有了梦想,我们的心有了飞翔:有了飞翔,我们的梦想不再遥远......</span> </p> js $(function( ...