Создайте Multi Sheet Excel и отправьте его как ByteArrayInputStream для загрузки. - PullRequest
0 голосов
/ 06 февраля 2020

Я создал файл 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));

Может кто-нибудь, пожалуйста, помогите мне с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...