由于项目上的需求,需要导出指定条件的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并下载的更多相关文章

  1. ASP.NET MVC 简单介绍①

    ASP.NET  MVC 简单介绍① 只做了重要描述,内容出自菜鸟教程网站内容. 目录 1布局 2HTML 帮助器 3.Razor 语法 4.添加样式 5.Layout 6. Controllers ...

  2. ASP.NET MVC 简单事务添加

    ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...

  3. ASP.NET MVC 简单分页代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  4. Asp.net MVC 简单分页 自做简单分页

    Asp.net MVC 简单分页:   public static string Pager(int page,int pageSize,int total)         {           ...

  5. phpexcel生成excel并下载

    Loader::import('PHPExcel.Classes.PHPExcel'); // tp5中只需将phpexcel文件放入extend文件夹中,即可采用该方法引入,需要先 use thin ...

  6. ASP.NET MVC 解析模板生成静态页一(RazorEngine)

    简述 Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.在早期的MVC版本中默认使用的是ASPX模板引擎,Razor在语法上的确不错,用起来非常方便,简洁的语法 ...

  7. Asp.Net MVC学习总结(一)——Asp.Net MVC简单入门

    一.MVC简单入门 1.1.MVC概念 视图(View) 代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML.XML和Applet. 模型(Model) 表示用户对其数 ...

  8. ASP.NET MVC简单编程之(二)经典路由篇

    话题:请求从路由开始 在实际的ASP.NET MVC开发中,URL访问规则----路由的定义是非常重要的.因为任何一个请求都离不开路由.理解它,我们将能理解MVC处理请求的整个过程,灵活地定义系统各种 ...

  9. ASP.NET MVC API 路由生成规则

    我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action.RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定 ...

随机推荐

  1. Cordova使用build命令出错: Could not create the Java Virtual Machine.

    这是因为虚拟机内存不足导致的,解决方案如下: _JAVA_OPTIONS=-Xmx512M

  2. Python 解决面试题47 不用加减乘除做加法

    在看<剑指Offer>过程中,面试题47不用加减乘除做加法,给出的思路是使用二进制的异或以及与运算,总之就是使用二进制.但是在使用Python实现的过程中,对于正整数是没有问题的,但是对于 ...

  3. mapbox-gl象形文字字体glyph生成

    简介 mapbox-gl可以对文字显示各种字体(依赖ttf文件),内部采用的是读取protobuf文件 环境条件 硬件:mac.网络 软件:nodejs.npm 创建mapbox-gl可用的字体pro ...

  4. C#抓取和分析网页的类

    抓取和分析网页的类. 主要功能有: Ontology 1.提取网页的纯文本,去所有html标签和javascript代码 2.提取网页的链接,包括href和frame及iframe 3.提取网页的ti ...

  5. pycharm安装和首次使用

    PyCharm 是由 JetBrains 打造的一款 Python IDE,支持 macOS. Windows. Linux 系统. PyCharm 功能 : 调试.语法高亮.Project管理.代码 ...

  6. [转载] Java并发编程:Lock

    转载自http://www.cnblogs.com/dolphin0520/p/3923167.html 以下是本文目录大纲: 一.synchronized的缺陷 二.java.util.concur ...

  7. python进阶------进程线程(五)

    Python中的IO模型 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别 ...

  8. python基础-------模块与包(二)

    sys模块.logging模块.序列化 一.sys模块 sys.argv           命令行参数List,第一个元素是程序本身路径 sys.exit(n)        退出程序,正常退出时e ...

  9. P3092 [USACO13NOV]没有找零No Change

    题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...

  10. phpcms v9 sql注入脚本

    phpcms v9 SQL注入脚本 用法:python phpcms.py http://www.baidu.com import requests,sys,urllib url = sys.argv ...