У меня есть реагирующий интерфейс и java сервер, использующий инфраструктуру Micronaut. В BaseController
моего Micronaut Framework я создаю файл XLSX, а затем отправляю ответ, чтобы он загружался при вызове из кода внешнего интерфейса.
BaseController
@Inject ExportService exportService
@Controller('/abc/api/v1')
@Slf4j
class BaseController implements CachingHandler, CommonUtils {
@Post('/export/{name}')
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.ALL)
executeExporter(String name, @Nullable @Body LinkedHashMap payload) {
def handler = { LinkedHashMap paramMap ->
List paramMapList = paramMap.get("data") as List
Byte[] resultBytes = exportService.exportToXLSX(paramMapList, getFileName(getLookupValue(name), paramMap.get("key") as String), true)
log.info String.format("About to return XLSX file %s for %s",getFileName(getLookupValue(name), paramMap.get("key") as String), name)
return resultBytes
}
def results = handler.call(payload)
InputStream inputStream = new ByteArrayInputStream(results)
return new StreamedFile(inputStream, getFileName(getLookupValue(name), payload["key"] as String))
}
}
ExportService
Примечание : использование метода main этого класса Я могу создать файл TestReport.xlsx
. Класс XLSXExporter
использует библиотеку Apache POI
для создания файла XLSX.
@Prototype
@Slf4j
class ExportService implements CommonUtils {
Byte[] exportToXLSX(List response, String fileName, boolean isDelete) {
def headers = []
try {
headers = response[0].keySet()
} catch(Exception e) {
e.printStackTrace()
}
Map params = [:]
params[Constants.HEADERS] = headers
params[Constants.DATA] = response
XLSXExporter xlsxExporter = new XLSXExporter()
boolean fileCreated = xlsxExporter.writeData(Constants.DEFAULT_SHEET_NAME, fileName, params)
if (fileCreated) {
Byte[] workbookContent = xlsxExporter.getFile(fileName, isDelete)
return workbookContent
} else {
return new Byte[0]
}
}
static void main(String[] args) {
def param = []
for (int i in 1..5) {
def paramMap = [:]
paramMap["key1"] = "data"+i
paramMap["key2"] = "data"+i
paramMap["key3"] = "data"+i
param.add(paramMap)
}
ExportService exportService = new ExportService()
Byte[] resultBytes = exportService.exportToXLSX(param, "TestReport.xlsx", false)
/**
I am able to create a proper TestReport.xlsx file using this main method
**/
}
}
Я протестировал вышеуказанный API от Postman, и он может загрузить файл XLSX.
![enter image description here](https://i.stack.imgur.com/ubQav.png)
Когда я вызываю вышеуказанный API экспорта с помощью моего приложения (javascript), он может загрузить файл xlsx, но это не открывается.
Javascript код для вызова API экспорта
const exportData = (filteredRows, activity) => {
let filename = "TestReport.xlsx";
return axios({
headers: {
'Content-type': 'application/json'
},
accept:'application/x-www-form-urlencoded',
url: '/abc/api/v1/export/'+ activity,
method: 'post',
data: {
"key": "8575",
"type":"userdetails",
"data":filteredRows
}
}).then(resp => {
var blob = resp.data;
if(window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, filename);
}
else{
var downloadLink = window.document.createElement('a');
downloadLink.href = window.URL.createObjectURL(new Blob([blob], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}));
downloadLink.download = filename;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
});
}
Как только я нажимаю "Да" на В приведенном выше диалоге я получаю сообщение об ошибке, и ничего не отображается, в отличие от файла, загруженного из Почтальона. ![enter image description here](https://i.stack.imgur.com/fl3aC.png)