js下载Excel

现在前端一直习惯直接使用ajax做页面局部刷新,但是用它来做文件下载是不行的,因为它的响应类型没有流文件,可以通过以下方式实现:

第一种:通过get请求的方式实现下载

window.open("http:localhost:8080/v1/download/sheetdata");

这种方式就是通过get请求访问一个URL,参数都拼在url后面来实现。这种方式简单,但是每次都会瞬间打开一个新窗口,不太友好,最重要的是火狐浏览器不支持。

第二种:通过XMLHttpRequest实现下载。

不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的。IE 浏览器使用 ActiveXObject,而其他的浏览器使用名为 XMLHttpRequest 的 JavaScript 内建对象。Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。

下面就是我用XMLHttpRequest实现下载的代码

function exportData(){
        var index = layer.load(2);
        var showName = "";
        $.ajax({
			url:visuUrls+"/download/getDownloadName",
			type:"GET",
			async:false,
			data:{"tableName":tableName},
			dataType:"json",
			success:function (data) {
				if(data.code==200){
				    showName=data.data;
				}
            },
			error:function () {

            }
		})
        // 判断下载文件名
		if(showName==""){
            layer.close(index);
            layer.msg('下载失败', {icon: 2});
            return;
		}
        var url = visuUrls+"/download/v1/table-data?tableName="+tableName+"&flag="+flag+"&name="+$("input[name='name']").val();
        var xhr = getHttpObj();//创建新的XHR对象
        xhr.open('post', url,true);//指定获取数据的方式和url地址
        xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8')
        xhr.responseType = 'blob';//以blob的形式接收数据,一般文件内容比较大
        xhr.onload = function(e) {
            var blob = this.response;//Blob数据
            if (this.status == 200) {
                if (blob && blob.size > 0) {
                    console.log(xhr.response)
                    var blob = new Blob([xhr.response], {type: 'Files'});
                    var csvUrl = URL.createObjectURL(blob);
                    var link = document.createElement('a');
                    link.href = csvUrl;
                    // 下载xlsx文件
                    link.download = showName+".xlsx";
                    link.click();
                }
                layer.close(index);
            }else {
                layer.close(index);
                layer.msg('下载失败', {icon: 2});
			}
        };
        xhr.send(null) //post请求传的参数
    }
    function getHttpObj() {
        var xmlhttp=null;
        if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        } else{// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        return xmlhttp;
    }

这种方式最坑的就是IE浏览器不兼容。

关于XMLHttpRequest的兼容性可以参考这篇文章:你真的会使用XMLHttpRequest吗?

第三种,通过form表单实现

var $eleForm = $("<form method='post'></form>");
$eleForm.attr("action",dbUrls+"/v1/download/sheetdata");
$eleForm.append("<input name='tableName' type='hidden' value='"+table_name+"'>");
$eleForm.append("<input name='showName' type='hidden' value='"+name_ch+"'>");
$eleForm.append("<input name='username' type='hidden' value='"+uname+"'>");
$eleForm.append("<input name='userid' type='hidden' value='"+uid+"'>");
$(document.body).append($eleForm);
//提交表单,实现下载
$eleForm.submit();
$eleForm.remove();

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值