用ajax下载字节流形式的excel文件

原因:ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件。

解决方法:使用form表单提交实现文件下载

1,后台代码实现方法:

// 生成excel文件
    @RequestMapping(value = "/study", method = RequestMethod.POST)
    public void study(@RequestBody ParamVO paramVO, HttpServletResponse response) throws UnsupportedEncodingException {
        response.setContentType("application/octet-stream;charset=utf-8");
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment;filename=" + new String(paramVO.getFileName().getBytes("utf-8"), "iso-8859-1"));
        try (ByteArrayOutputStream bos = templateService.excel(paramVO);
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream())) {
            out.write(bos.toByteArray());
            response.setHeader("Content-Length", String.valueOf(bos.toByteArray().length));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2,前端页面使用Ajax下载文件

var xhr = new XMLHttpRequest();
        xhr.open(‘post‘, ‘http://localhost:8080/user/export‘, true);
        xhr.responseType = ‘blob‘;
        xhr.setRequestHeader(‘Content-Type‘, ‘application/json;charset=utf-8‘);
        xhr.onload = function () {
            if (this.status == 200) {
                var blob = this.response;
                var a = document.createElement(‘a‘);
                var url = window.URL.createObjectURL(blob);
                a.href = url;
                //设置文件名称
                a.download = ‘用户信息.xls‘;
                a.click();
            }
        }
        xhr.send(JSON.stringify({
           "type" : 1,
           "startDate" : "2018-01-01",
           "endDate" : "2018-12-31"
        }));
    }

或者前端也可以这样实现:

{
        var xhr = new XMLHttpRequest();
      xhr.open(‘post‘, ‘http://localhost:8080/user/export‘, true);
      xhr.responseType = ‘blob‘;
      xhr.onload = function () {
      var blob = this.response;
      if(window.navigator.msSaveOrOpenBlob){
          window.navigator.msSaveBlob(blob, ‘msSaveBlob_testFile.txt‘);
      }else{
          var link = document.createElement(‘a‘);
          link.href = window.URL.createObjectURL(blob);
          link.download = ‘msSaveBlob_testFile.txt‘;
          link.click();
          window.URL.revokeObjectURL(link.href);
      }
      xhr.send(null);
      }
}

本文转自:https://blog.csdn.net/hj7jay/article/details/86309968

原文地址:https://www.cnblogs.com/nizuimeiabc1/p/10534415.html

时间: 2024-08-03 19:18:47

用ajax下载字节流形式的excel文件的相关文章

通过XML转换下载.xlsx格式的excel文件

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件. <img class="alignnone size-full wp-image-2802" src="http://www.baidusap.com/wp-content/uploads/2017-02-04_15-28-29.png"

◆◆0通过XML转换下载.xlsx格式的excel文件

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件. 这个功能很方便,因为下载的结果和ALV中看到的是一样的. debug研究了一下标准代码,发现是将需要下载的内表先转换成XML stream,然后再通过gui_download的BIN模式将xml stream下载成.xlsx文件. 写了一个简单的程序供大家参考 1 2 3 4 5 6

jQuery+php+ajax+PHPExcel实现上传excel文件导入数据库

项目中需要批量导入数据,感觉这个需求以后也会经常用,必须总结分享下: 引入jquery的第三方表单插件: <scripttype="text/javascript"src="/js/lib/jquery.ajax.form.js"></script> 视图文件:goods_list.ctp(商品列表), <div class="btnimport"> <form class='myupload' acti

C# 读取EXCEL文件的三种经典方法

1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;"; OleDb

.NET从EXCEL文件导入数据

.NET com组件 这种方法在计算机没有安装office套件时,也是能够使用的.所以不依赖于软件, 但是还是需要xcel.exe编译后的dll文件打包到相应的程序中来引用.这样将dll文件" 随身携带",就可以了.还是挺不错的! 1.注册Microsoft.Office.Interop.Excel.dll 在office安装文件夹下找到excel.exe,路径D:\Program Files(x86)\Microsoft Office\Office15.将excel.exe文件复制到

C# 读取EXCEL文件

1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended P

c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件

1.引用Microsoft.Office.Interop.Excel.dll 2.引用命名空间.使用别名 [csharp] view plaincopy using System.Reflection; using Excel = Microsoft.Office.Interop.Excel; 3.写入excel 写入函数 [csharp] view plaincopy public void ToExcel(string strTitle) { int nMax = 9; int nMin =

取EXCEL文件的3种方法

1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;"; OleDb

Java读写Excel文件DEMO

下载一定格式的Excel文件: @RequestMapping("/xxxx/xxxx/xxxx/copyfiledownload") @ResponseBody public void copyfiledownload(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception{ response.setContentType("text/html; char