2016-09-25 6 views
4

Метода REST для возврата данных OutputStream, чтобы загрузить электронную таблицу Excel:Невозможно загрузить Excel таблицу с данными OutputStream из бэкэнда

@RequestMapping(value = "/downloadxls", method = RequestMethod.GET) 
public @ResponseBody void getRecordsAndExportExcel(@RequestParam("search_param") String students, HttpServletResponse response) { 
    response.setContentType("application/vnd.ms-excel"); 

Workbook hssfWorkbook = exportExcelService.getExcelStudents(students); 
     try { 
      OutputStream out = response.getOutputStream(); 
      hssfWorkbook.write(out); 
      out.flush(); 
      out.close(); 

     } catch (IOException e) { 
      logger.error("Error exporting to excel:" + e); 
     } 
} 

Я получаю данные в виде байт, но в Угловом я пытаюсь представить его как электронная таблица Excel; но он не будет загружаться. Я делаю это для преобразования:

var blob = new Blob([result.data], {type : 'application/vnd.openxmlformats-officedocument.presentationml.presentation;charset=UTF-8'}); 
     FileSaver.saveAs(blob, "MyData.xls"); 

запрос и ответ заголовки:

Access-Control-Allow-Headers:x-requested-with, content-type 
Access-Control-Allow-Methods:GET OPTIONS 
Access-Control-Allow-Origin:* 
Access-Control-Max-Age:3600 
Content-Type:application/vnd.ms-excel;charset=UTF-8 
Server:Apache-Coyote/1.1 
Transfer-Encoding:chunked 
X-Application-Context:application:8080 

заголовков запроса

Accept:application/json, text/plain, */* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8,ms;q=0.6 
Connection:keep-alive 
Host:localhost:8080 
Origin:http://localhost:9000 
Referer:http://localhost:9000/ 

Я делаю GET-вызов от внешнего интерфейса с помощью угловых и призывающую backend для загрузки данных в виде таблицы Excel, но он не способен преобразовать выходной поток в blob/excel. Как я могу представить таблицу Excel как загрузку?

+0

Можете ли вы подробно остановиться на * «он не будет загружать» *? Вы получаете какие-либо ошибки в консоли? Что происходит после вызова 'window.open()'? – Phil

+0

Возможный дубликат [JavaScript blob filename без ссылки] (http://stackoverflow.com/questions/19327749/javascript-blob-filename-withoutlink) – Phil

+0

Я не получаю никакого window.open в html. Я получаю байты от бэкэнд до ui (также, если я пытаюсь написать excel в backend, это прекрасно), а в пользовательском интерфейсе у меня есть окно модели для загрузки опции загрузки (), и я вызываю свой JS для загрузки. Я не получаю никаких ошибок в консоли, но если пытаюсь отображать данные, они отображаются в виде байтов в консоли. Пожалуйста, предложите какие-либо изменения, которые мне нужно добавить в HTML и JS, чтобы получить файлы. – user3428736

ответ

0

То, как я представляю лист Excel в своем приложении, заключается в том, чтобы вернуть путь + имя файла листа excel для отображения, а затем открыть ссылку, используя углы в новой вкладке.

В классе обслуживания

ExportExcel response = new ExportExcel(); 
response.setPath(excelPath); 
return response; 

класс контроллера

Response response = excelService.generateExcel(); 
return new ResponseEntity<>(response, HttpStatus.OK); 

В вашей угловой контроллер:

if(response.status === 200){ 
var excelPath = response.data.path; 
var win = window.open(excelPath, '_blank'); 
if (win) { 
     //Browser has allowed it to be opened 
     win.focus(); 
} else { 
     //Browser has blocked it 
     swal( 
      "Error!", 
      'Please allow popups for this website', 
      "error" 
     ); 
    }       
} 

Try и посмотреть, если это работает.