最近看园里有几篇写有关导出导入excel的博客,我正好最近在项目中也有涉及想来一起分享一下,正好整理一下自己的思路。

一、异步的方式是通过iframe来实现,代码如下:

if ($('#downloadexcel').length <= 0)
$('body').append("<iframe id=\"downloadexcel\" style=\"display:none\"></iframe>");
$('#downloadexcel').attr('src', url);

二、生成excel文件用的第三方组件NPOI,具体如何用园子里有很多关于这方面的资料,这里就不展开了。

三、这里主要介绍一下如何简化HttpResponse到前端生成excel,下面会贴出核心代码,希望给大家有所帮助。

  1. 声明一个excel返回实体,代码如下:

    /// <summary>
    /// 表示返回的流数据。
    /// </summary>
    [DataContract]
    public class ExcelResultMessage
    {
    #region [ Privates ] private MessageType type = MessageType.Info;
    private string description = string.Empty; #endregion #region [ Properteis ] /// <summary>
    /// 返回结果信息提示类型。
    /// </summary>
    [DataMember(Order=)]
    public MessageType Type
    {
    get { return this.type; }
    set { this.type = value; }
    } /// <summary>
    /// 返回结果信息提示。
    /// </summary>
    [DataMember(Order=)]
    public string Description
    {
    get { return this.description; }
    set { this.description = value; }
    } /// <summary>
    /// 返回结果数据。
    /// </summary>
    [DataMember(Order=)]
    public MemoryStream Data { get; set; } /// <summary>
    /// 文件名
    /// </summary>
    [DataMember(Order = )]
    public string FileName { get; set; } #endregion
    }
  2. 声明一个excel数据容器,代码如下:
    /// <summary>
    /// 表示返回的excel数据容器。
    /// </summary>
    [DataContract]
    public class ExcelResult
    {
    #region [ Properteis ] /// <summary>
    /// 编码格式。
    /// </summary>
    public Encoding ContentEncoding { get; set; } /// <summary>
    /// 内容类型。
    /// </summary>
    public string ContentType { get; set; } /// <summary>
    /// 数据。
    /// </summary>
    [DataMember]
    public ExcelResultMessage Message { get; set; } #endregion #region [ Methods ] /// <summary>
    /// 执行结果。
    /// </summary>
    /// <param name="context"></param>
    public void ExecuteResult(HttpContext context)
    {
    if (context == null)
    {
    throw new ArgumentNullException("context");
    } HttpResponse response = context.Response;
    response.ClearContent();
    if (!String.IsNullOrEmpty(ContentType))
    {
    response.ContentType = ContentType;
    }
    else
    {
    response.ContentType = "application/vnd.ms-excel";
    }
    if (ContentEncoding != null)
    {
    response.ContentEncoding = ContentEncoding;
    } response.Clear();
    if (this.Message != null)
    {
    response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", this.Message.FileName));
    response.BinaryWrite(this.Message.Data == null ? new byte[] : this.Message.Data.GetBuffer());
    response.End();
    }
    } #endregion
    }
  3. 声明一个excel页面基类,代码如下:
    /// <summary>
    /// excel页面基类。
    /// </summary>
    public abstract class ExcelPageBase : PageBase
    {
    #region [ Privates ] #endregion #region [ Contructors ] /// <summary>
    ///
    /// </summary>
    public ExcelPageBase()
    : base()
    {
    } #endregion #region [ Properties ] /// <summary>
    /// excel数据结果。
    /// </summary>
    protected ExcelResult ExcelResult { get; set; } #endregion #region [ Events ] /// <summary>
    /// 页面加载。
    /// </summary>
    protected override void OnPreRender(EventArgs e)
    {
    SetNoCache();
    this.ExcelResult = new ExcelResult();
    GenerateExcelResult(this.ExcelResult);
    ExcelResult.ExecuteResult(this.Context);
    } /// <summary>
    /// 集成Json结果数据。
    /// </summary>
    protected abstract void GenerateExcelResult(ExcelResult result); #endregion
    }
  4. 在实际导出excel中,只要实现这个excel页面基类,然后关注如何生成excel的MemoryStream就可以了,实例代码如下:
        public partial class ExportFile : ExcelPage
    {
    protected override void GenerateExcelResult(ExcelResult result)
    {
    result.Message = new ExcelResultMessage();
    SaleOrderResponse response = FinanceService.GetSaleOrderResponse(SaleModel.BuildSaleOrderQueryCondition(this.UserInfo), true);
    MemoryStream stream = SaleModel.ExportToExcel(response);
    result.Message.Data = stream;
    result.Message.FileName = HttpUtility.UrlEncode(string.Format("{0}{1}.xls", this.BuildContent("AuditSaleOrder"), DateTime.Now.ToString("yyyyMMddhhmmss")));
    }
    }

异步导出excel的更多相关文章

  1. 多线程异步导出excel

    先新建一个执行类 @Service public class MultiService { private static final Logger logger = LoggerFactory.get ...

  2. POI导出Excel不弹出保存提示_通过ajax异步请求(post)到后台通过POI导出Excel

    实现导出excel的思路是:前端通过ajax的post请求,到后台处理数据,然后把流文件响应到客户端,供客户端下载 文件下载方法如下: public static boolean downloadLo ...

  3. ASP.NET MVC导出excel(数据量大,非常耗时的,异步导出)

    要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指 ...

  4. MVC学习笔记---MVC导出excel(数据量大,非常耗时的,异步导出)

    要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指 ...

  5. Java 导出Excel的各种尝试

    最近的一个项目比较忙,一直没时间过来跟新博客.今天过来分享一下在此项目中遇到的一个小问题:导出Excel:相信导出Excel这个功能是特别常见的,也有很多的方式.好了,不多说了,直接说说自己遇到的各种 ...

  6. 使用NPOI导出Excel引发异常(IsReadOnly = “book.IsReadOnly”引发了类型“System.NotImplementedException”的异常)

    前言: 本人调式npoi导入.导出试用成功后,引入到项目中,导入完美运行,但是导出怎么样都看不到现在的页面,而且浏览器和后台都没有报任务错误,让人好事纳闷,后来去调式,发现在除了一个IsReadOnl ...

  7. java POI导出Excel文件数据库的数据

    在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...

  8. 采用Post请求的方式提交参数并导出excel

    一般情况下,我们都是采用get请求的方式导出excel.例如采用如下方式: var exportUrl = '/xxx;'; window.open(exportUrl); 导出excel所需的逻辑参 ...

  9. PHP配合JS导出Excel大量数据

    一般使用PHP导出Excel表格都会用PHPExcel,但是当遇到要导出大量数据时,就会导致超时,内存溢出等问题.因此在项目中放弃使用这种方式,决定采用前段生成Excel的方式来解决问题. 步骤如下: ...

随机推荐

  1. SparkSQL On Yarn with Hive,操作和访问Hive表

    转载自:http://lxw1234.com/archives/2015/08/466.htm 本文将介绍以yarn-cluster模式运行SparkSQL应用程序,访问和操作Hive中的表,这个和在 ...

  2. .NET基础操作回顾_使用ADO.NET操作SqlServer使用的类

    有些工具用的久了或者有新工具出现后,就慢慢的遗忘了很多,它们从熟悉的变成陌生,当然,对于我们来说不是好事吧. 今天回顾一下ADO.NET用到的MS的基础类库,先上代码(标准的SqlServer操作) ...

  3. Arch yaourt 安装

    安装yaourt,最简单安装Yaourt的方式是添加Yaourt源至您的 /etc/pacman.conf:[archlinuxcn]#The Chinese Arch Linux communiti ...

  4. OC基础(12)

    new方法实现原理 类的本质 类的启动过程 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bo ...

  5. linux tar 命令 --致力于“一眼看懂,随手就用”的随笔

    基本玩法: 压缩: tar -czf txt.tar.gz *.txt // 将当前目录下的所有txt文件,创建一个tar包,并用gzip算法,压缩成txt.tar.gz 文件 解压: tar -xz ...

  6. POJ2376_Cleaning Shifts_C++

    题目:http://poj.org/problem?id=2376 英文题强行看不懂,只看的懂输入输出,输入n,m,下接n行每行一个区间两个数左端点 l,有端点 r 给出n个闭区间,求选择最少的区间能 ...

  7. 菜鸟学sql,Oracle数据库结构比较

    转载自:http://www.cnblogs.com/tianqing/archive/2008/06/25/1229419.html 做oracle下数据库结构比较,比较具体详细差异,例如:2个库具 ...

  8. MATLAB mex文件

    MATLAB的mex文件是一种特征的函数封装形式,这类函数一般由C/C++语言编写的,经过MATLAB编译器处理而生成的二进制文件.它是可以被MATLAB解释器自动装载并执行的动态链接程序,类似于wi ...

  9. THE ONE THING PEOPLE WILL MASSIVELY OVERPAY FOR (有一个东西人们是愿意出高价购买的)

    THE ONE THING PEOPLE WILL MASSIVELY OVERPAY FOR有一个东西人们是愿意出高价购买的 by GARY VAYNERCHUK 点此直达湾区日报简评 I don' ...

  10. MWC飞控增加声纳定高的方法

    MWC飞控增加声纳定高的方法 2015.12.17 更新:经过2个周末的上机测试,该算法效果很好,在低空超声锁高之后离地高度非常稳定,现在已经成功应用在低空航拍上了. 现状 MWC开源飞控已经很有点年 ...