angularjs - 将响应下载为 excel 文件

标签 angularjs spring servlets spring-boot apache-poi

文件未在浏览器中下载。我正在准备文件并将其写入响应输出流。

休息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);

哪里data是您从 API 收到的响应。 saveAs函数是 FileSaver.js 的一部分图书馆。尽管您可以查看如何手动执行此操作,但为什么要重新发明轮子?

关于angularjs - 将响应下载为 excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38603209/

相关文章:

java - 在 Windows 10 中使用 ant 命令时出错

java - 如何使用 JdbcTemplate 返回自动生成的 id 进行插入?

Java : different init parameters to same servlet based on different URL patteren

Apache Tomcat 和 servlet

javascript - 在javascript函数中切换传入变量 boolean 值

javascript - 在 Angularjs 中管理多个计数器

java - RESTEasy-Spring 集成 web 应用程序抛出神秘错误 : NoResourceFoundFailure

javascript - 填充 Angular 用户界面 Bootstrap 弹出窗口

javascript - AngularJS - 无论返回的 http 状态如何,如何捕获从 GET 服务方法返回的 JSON

java - 在浏览器上打印多个空格时出现 java.io.PrintWriter 问题