加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 将响应下载为excel文件

发布时间:2020-12-17 17:04:37 所属栏目:安全 来源:网络整理
导读:文件未在浏览器下载.我正在准备文件并将其写入响应的输出流. Rest API在那里: @RequestMapping(value = "/export-companies",method = {RequestMethod.GET,RequestMethod.HEAD}) @Timed public void downloadCompanies(HttpServletResponse response) throw
文件未在浏览器下载.我正在准备文件并将其写入响应的输出流.

Rest API在那里:

@RequestMapping(value = "/export-companies",method = {RequestMethod.GET,RequestMethod.HEAD})
    @Timed
    public void downloadCompanies(HttpServletResponse response) throws URISyntaxException {
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Sample sheet");

        Map<String,Object[]> data = new HashMap<String,Object[]>();
        data.put("1",new Object[] {"Emp No.","Name","Salary"});
        data.put("2",new Object[] {1d,"John",1500000d});
        data.put("3",new Object[] {2d,"Sam",800000d});
        data.put("4",new Object[] {3d,"Dean",700000d});

        Set<String> keyset = data.keySet();
        int rownum = 0;
        for (String key : keyset) {
            Row row = sheet.createRow(rownum++);
            Object [] objArr = data.get(key);
            int cellnum = 0;
            for (Object obj : objArr) {
                Cell cell = row.createCell(cellnum++);
                if(obj instanceof Date)
                    cell.setCellValue((Date)obj);
                else if(obj instanceof Boolean)
                    cell.setCellValue((Boolean)obj);
                else if(obj instanceof String)
                    cell.setCellValue((String)obj);
                else if(obj instanceof Double)
                    cell.setCellValue((Double)obj);
            }
        }

        try {
            ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
            workbook.write(outByteStream);
            byte [] outArray = outByteStream.toByteArray();
            response.setContentType("application/ms-excel");
            response.setContentLength(outArray.length);
            response.setHeader("Expires:","0"); // eliminates browser caching
            response.setHeader("Content-Disposition","attachment; filename=template.xls");
            OutputStream outStream = response.getOutputStream();
            outStream.write(outArray);
            outStream.flush();
            workbook.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

从前端(使用Angular JS):

(function() {
    'use strict';

    angular
        .module('MyApp')
        .factory('CompanyExportService',CompanyExportService);

    CompanyExportService.$inject = ['$resource'];

    function CompanyExportService ($resource) {
        var service = $resource('api/export-companies',{},{
            'get': {
                method: 'GET',isArray: false
            }
        });

        return service;
    }
})();

文件内容作为不可读格式响应.但是文件不会在浏览器下载.

解决方法

Angular将仅接收文件内容的字符序列.您需要从这些字符创建文件并在前端启动浏览器下载.

你可以这样做 –

var blob = new Blob([data],{type: 'application/vnd.openxmlformat-officedocument.spreadsheetml.sheet;'});
saveAs(blob,fileName);

数据是您从API收到的回复. saveAs函数是FileSaver.js库的一部分.虽然你可以看看如何手动这样做,但为什么要重新发明轮子?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读