视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Asp.net MVC实现生成Excel并下载功能
2020-11-27 22:35:07 责编:小OO
文档


本文实例为大家分享了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 = 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 {
 //错误操作
 }
 });
 });
 });

下载本文
显示全文
专题