Я создал файл Excel с использованием библиотеки Apache POI, в Excel есть несколько листов. Код работает нормально, но единственная проблема заключается в том, что я создаю файл в текущем каталоге (каталог проекта). Есть ли способ построить Excel в памяти и передать байт для его загрузки вместо создания внешнего файла ("ExcelDownload.xlsx")
ServiceClass ниже
public class GenericExcelService {
public static <T> void writeToExcelInMultiSheets(final String fileName, final String sheetName, final List<T> data) {
XSSFWorkbook workbook = null;
FileOutputStream fos = null;
try {
File file = new File(fileName);
Sheet sheet = null;
if (file.exists()) {
workbook = (XSSFWorkbook) WorkbookFactory.create(new FileInputStream(file));
} else {
workbook = new XSSFWorkbook();
}
sheet = workbook.createSheet(sheetName);
.
.
.
.
.
fos = new FileOutputStream(file);
workbook.write(fos);
fos.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (workbook != null) {
workbook.close();
}
} catch (IOException e) {
System.out.println("Inside Last IOException");
}
}
}
}
Контроллер ниже
@RequestMapping(value = "/downloadExcel", method = RequestMethod.GET)
public void writeToExcelInMultiSheets(){
File currDir = new File(".");
String path = currDir.getAbsolutePath();
String fileLocation = path.substring(0, path.length() - 1) + "ExcelDownloadDemo.xlsx";
GenericExcelService.writeToExcelInMultiSheets(fileLocation, "Person Details", persons);
GenericExcelService.writeToExcelInMultiSheets(fileLocation, "User Details", users);
GenericExcelService.writeToExcelInMultiSheets(fileLocation, "Contact Details", contacts);
}
Я пытался реализовать тот же код для не пустого метода, чтобы вернуть загружаемый файл Excel, используя ByteArrayInputStream
, но я не смог вернуть больше, чем одно значение Пожалуйста, помогите Внесены следующие изменения в controller
& service
, но они не работают.
изменение в service
ниже, вместо void возвращаемый тип - ByteArrayInputStream
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//in place of
//fos = new FileOutputStream(file);
//workbook.write(fos);
workBook.write(outputStream);
return new ByteArrayInputStream(outputStream);
изменить тип возврата контроллера на ResponseEntity<InputStreamResource>
и ниже
ByteArrayInputStream bis;
bis = GenericExcelService.writeToExcelInMultiSheets(fileLocation, "Contact Details", contacts);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(org.springframework.http.MediaType.APPLICATION_OCTET_STREAM);
headers.add("Content-Disposition", "attachment; filename=" + "Details.xlsx");
return ResponseEntity
.ok()
.headers(headers)
.body(new InputStreamResource(bis));
Может кто-нибудь, пожалуйста, помогите мне с этим.