Asp.net MVC 简单实现生成Excel并下载

2018-06-22 06:17:57来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

由于项目上的需求,需要导出指定条件的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,
   }
View Code

 

在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);
        } 
View Code

 

完成了生成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 {
                    //错误操作
                }
            });
        });
    });
View Code

 

以上就是我们项目中关于Excel生成到下载的全部操作。

考虑的情况比较少,写的比较简单。

如果大家有什么好的想法,可以留言,我肯定会学习并实践好再拿出来分享。

非常感谢。

如果对您有帮助,请点赞!

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:MVC5中Model层开发数据注解

下一篇:有关MVC产品的 分层规划