Не удалось загрузить электронную таблицу Excel с данными выходного потока из бэкэнда

Метод REST для возврата данных outputStream для загрузки электронной таблицы Excel:

@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); 
        }
}

Я получаю данные в виде байтов, но в Angular я пытаюсь представить их в виде электронной таблицы 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-вызов из внешнего интерфейса, используя Angular, и вызываю внутренний интерфейс для загрузки данных в виде электронной таблицы Excel, но он не может преобразовать выходной поток в blob/excel. Как я могу представить электронную таблицу Excel для скачивания?


person user3428736    schedule 25.09.2016    source источник
comment
Можете ли вы уточнить он не загружается? Вы получаете какие-либо ошибки в консоли? Что происходит после вызова window.open()?   -  person Phil    schedule 26.09.2016
comment
Возможный дубликат имя файла большого двоичного объекта JavaScript без ссылки   -  person Phil    schedule 26.09.2016
comment
Я не получаю никакого window.open в html. Я получаю байты от бэкэнда к пользовательскому интерфейсу (также, если я пытаюсь написать excel в бэкэнде, это нормально), и в пользовательском интерфейсе у меня есть окно модели, чтобы щелкнуть параметр загрузки (‹ класс ввода =btn btn-primary type=submit value=Download ng-click=download()›) и я вызываю свой JS для загрузки. Я не получаю никаких ошибок в консоли, но если попытаться отобразить данные, они отображаются в консоли как байты. Пожалуйста, предложите Есть ли какие-либо изменения, которые мне нужно добавить в HTML и JS, чтобы получить файлы.   -  person user3428736    schedule 26.09.2016
comment
Я пытался использовать FileSaver, он загружается, но байты записываются в Excel. Пожалуйста, подскажите, почему данные не конвертируются из байтов.   -  person user3428736    schedule 26.09.2016


Ответы (1)


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

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

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"
        );
    }                        
}

Попробуйте и посмотрите, работает ли это.

person Akshay Singh    schedule 01.12.2017