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函数时传入的参数去匹配系统定 ...
随机推荐
- Nginx实现负载均衡&Nginx缓存功能
一.Nginx是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl ...
- 洛谷 P3384 【模板】树链剖分
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...
- [转载] Redis之七种武器
转载自http://blog.nosqlfan.com/html/2942.html?ref=rediszt 长生剑.孔雀翎.碧玉刀.多情环.离别钩.霸王枪.拳头是古龙笔下的七种武器,而本文打算将Re ...
- raid卡MegaCli工具使用说明
一.DELL&IBMMegaCli -AdpAllInfo -aALL —看配置项 #检查raid级别MegaCli -LDInfo -Lall -aALL | grep 'RAID Leve ...
- vim编辑器介绍及其常用命令
vim简单的介绍 Vim 编辑器是一个模式编辑器 . 这意味着在不同状态下编辑器有不同的行为模式 . 两个基本的模式是 Normal 模式和 Insert 模式 ,还有可视模式. 在 Normal 模 ...
- Linux上安装和卸载mysql数据库 (一)
一.前言 第一次写博客,很激动同时有点畏惧,激动是我可以将我的经验进行分享,畏惧是我怕我写的东西,大家借鉴的时候,有些步骤不能成功.不过,我还是很有信息的,我分享的经验都是我搭建成功以后才分享出来.这 ...
- Eclipse创建一个JAVA WEB项目
继上一篇博客,Eclipse的Tomcat已经配置好了,现在我们开始创建web项目. 1.打开Eclipse,选择菜单栏的file>New>Dynamic Web Project 弹出窗口 ...
- 关于Excel数据批量导入数据库的案例
写这个案例主要是感觉这个功能挺实用,很多地方会用得到的,废话就不多说了,直接上对应的源码. 这个案例我运用的是Winform窗体程序实现数据的导入. 首先是数据库的登陆界面如下: 源码如下: usin ...
- selenium定位tr及td,并获取其文本及属性
#获取所有的trtrlist=brower.find_elements_by_tag_name("tr")for tr in trlist: #获取tr中的所有td tdlist= ...
- ctrl+z 以后怎么恢复挂起的进程
(1) CTRL+Z挂起进程并放入后台 (2) jobs 显示当前暂停的进程 (3) bg %N 使第N个任务在后台运行(%前有空格) (4) fg %N 使第N个任务在前台运行 默认bg,fg不带% ...