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库的一部分.虽然你可以看看如何手动这样做,但为什么要重新发明轮子? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |