zoukankan      html  css  js  c++  java
  • 关于导出Excel

    Asp.Net

      在刚毕业那会,做项目全是服务器控件。导出Excel的代码也很简单,在button触发后台事件后,后台生成一个excel文件,然后读取成字节,输出到客户端。

       Response.AddHeader("Content-Disposition", "attachment; filename=test.csv"); 
       Response.ContentType = "application/ms-excel"; 
       Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312"); 
       Response.BinaryWrite(by); //Excel文件字节数组
       Response.End();

    Ajax

      用ExtJS写UI,前台就无法使用任何服务器控件。同时也借此来代表纯用html控件来实现的页面,交互通常使用Ajax。说说我当时的做法,用几行伪代码表示。

    $("#Excel").click(function(){
        $.post('/url',{name:"111"},function(rdto){
            if(!rdto.Result)
            {
                alert(rdto.Message || '系统出错!');
                return;
            }
            var fileName = rdto.data;
            //打开新页面去下载文件
            window.open('file.aspx?fileName'+fileName,'xxx-xx');
        });
    },'json');

      思路则是,先将数据提交到后台,后台生成一个临时的Excel文件,然后将文件名返回给js,js在新开一个页面去下载Excel。这种方式,一般就会带来一个问题,新开的页面经常会被拦截,点击允许弹窗之后,浏览器又会刷新,然后再次点击导出,上次点击导出Excel临时生成的文件还在那静静的躺着。

    IFrame来帮忙

      上面的方法太蛋疼,生成一个临时文件,有可能还没有立马删除。在用一段伪代码表示。

    $("body").append("<iframe src='/home/excel?name=1'/>");

      这样就可以通过iframe发起一个get请求,后台按照asp.net的写法就可以了。

      但是get请求无法传递大量数据,系统要传递大量数据怎么办。比如说,直接把某个控件的html代码,或者是页面的html代码导出在Excel里。谈谈楼主目前的想法:

    首先发起一个post请求传参,后台存到Session中去,然后再发起上面的get请求,请求中去根据这个数据来生成文件。

    Form

      如果页面导出的数据来自于表单内容,可以通过form来操作,这里就很简单了,跟Asp.Net类似。form表单提交的地址,直接返回一个文件流。而form支持post和get,所以可以根据要求自己选择。

      当然也可以window.location.href = '/home/excel?t=1&...';  后台来返回文件流。

      方式很多,大家根据场景自行选择。

      

  • 相关阅读:
    有36辆自动赛车和6条跑道,没有计时器的前提下,最少用几次比赛可以筛选出最快的三辆赛车?----腾讯2016研发工程师在线模拟笔试题
    10G个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可
    计算机网络总结(二)
    计算机网络总结(一)
    最小编辑距离
    寻找两个有序数组的中位数
    Linux下几款C++程序中的内存泄露检查工具
    DDIA
    推荐引擎
    Innodb中的事务隔离级别和锁的关系
  • 原文地址:https://www.cnblogs.com/codealone/p/4616236.html
Copyright © 2011-2022 走看看