У меня проблемы с экспортом таблиц в javascript. Backend - весна, и мой метод в контроллере выглядит так.
@PostMapping(produces = "application/vnd.ms-excel")
public void report(@RequestBody @Validated final ReportRequest reportRequest, final HttpServletResponse response, final Principal principal) {
log.info("'{}' Requested report '{}'", principal.getName(), reportRequest);
final List<Data> dataList = dataRepository.findAll(
findByCriteria(
reportRequest.getFilterDatas(),
reportRequest.getId(),
reportRequest.getStartDate(),
reportRequest.getEndDate()));
final SXSSFWorkbook workbook = excelService.generateExcelFromDraData(dataList, FILE_NAME);
writeToOutputStream(response, workbook);
}
В интерфейсе я использую vue.js и axios для http-клиента. И метод экспорта:
axios.post(
url+'report',
query,
{headers: {
"Access-Control-Allow-Headers" : "*",
"X-XSRF-TOKEN": this.$cookie.get('XSRF-TOKEN')
}
}
)
.then((response) => {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
var blob = new Blob([response.data], {type: "application/vnd.ms-excel"});
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = 'report.xlsx';
a.click();
window.URL.revokeObjectURL(url);
}, (error) => {
}
)
Когда я нажимаю "Отправить и Скачивать" с почтальоном, я получаю превосходство, которое я хочу. Но когда я делаю это от клиента, я получаю байты в ответ в console.log, но I'cant open excel с сообщением "excel не может открыть файл, потому что формат файла или расширение файла недействительны...". Если я поставил report.xls для имени, я получаю excel, который я могу открыть, но с некоторыми байтами, которые ничего не значат.
Любое предложение, что не так?
.xlsx имеет другой тип MIME:
.xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Обратите внимание, что браузеры обрабатывают загрузку файлов по-разному. Я успешно использовал следующий код (вам придется немного изменить его в своем приложении):
function successCallback (data) { //In my case data was already a Blob
if (window.navigator.msSaveOrOpenBlob) { //for IE
window.navigator.msSaveOrOpenBlob(data, 'file.xlsx');
} else {
var a = document.createElement("a");
a.href = window.URL.createObjectURL(data.slice());
a.target = '_blank';
a.download = 'file.xlsx';
a.dataset.downloadurl = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', a.download, a.href].join(':');
//a.click() got cancelled in firefox
var event = document.createEvent("MouseEvent");
event.initMouseEvent(
"click",
true /* bubble */,
false /* cancelable */,
window, null,
0, 0, 0, 0, /* coordinates */
false, false, false, false, /* modifier keys */
0 /*left*/, null
);
a.dispatchEvent(event);
}
}
axios.post
параметра конфигурацииaxios.post
responseType: 'blob'
вместо того, чтобы конвертировать его в обратный вызов.