由于项目上的需求,需要导出指定条件的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 = 1, ?????/// <summary> ?????/// 错误 ?????/// </summary> ?????Error = -1, ?????/// <summary> ?????/// 提示信息 ?????/// </summary> ?????Hint = 0, ?????/// <summary> ?????/// 提醒登录 ?????/// </summary> ?????Login = 5, ?????/// <summary> ?????/// 提示重定向 ?????/// </summary> ?????Redirect = 6, ??}
在Controller中定义ExportExcel ActionResult
[HttpPost] ???????public ActionResult ExportExcel(SearchModel model) ???????{ ??????????????????????????????????StatusMessageData result = new StatusMessageData(); ???????????if (model.Data == null || model.Data.Count <= 0) ???????????{ ???????????????result.MessageType = StatusMessageType.Error; ???????????????result.MessageContent = "没有要下载的数据"; ???????????????return Json(result); ???????????} ???????????string fileglobal = ""; ???????????//组织Excel表格 ???????????StringBuilder sb = new StringBuilder(400); ???????????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 > 0) ???????????????{ ???????????????????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并下载
原文地址:http://www.cnblogs.com/sheldon-blog/p/8086010.html