Экспорт данных из базы данных в файл xlsx (Excel) с использованием Spring - PullRequest
0 голосов
/ 15 января 2020

Мне нужно экспортировать данные из базы данных в документ Excel, используя Spring. Но когда я загружаю из контроллера документ, я получаю сообщение об урезанном файле или неправильном расширении.

private static final String EXCEL_FILE_NAME = "UserExcelExport.xlsx";
@GetMapping("/download")
  public void download(HttpServletResponse response) throws Exception {

    List<User> users = userService.getUsers();

    Workbook workbook = new HSSFWorkbook();
    Sheet sheet = workbook.createSheet("All Users List");
    Row header = sheet.createRow(0);
    header.createCell(0).setCellValue("Username");
    header.createCell(1).setCellValue("First name");
    header.createCell(2).setCellValue("Last name");
    header.createCell(3).setCellValue("E-mail");
    int rowNum = 1;
    for (User user : users) {
      Row row = sheet.createRow(rowNum++);
      row.createCell(0).setCellValue(user.getUsername());
      row.createCell(1).setCellValue(user.getFirstName());
      row.createCell(2).setCellValue(user.getLastName());
      row.createCell(3).setCellValue(user.getEMail());
    }

    response.setHeader("Content-disposition", "attachment; filename=" + EXCEL_FILE_NAME);

    workbook.write(response.getOutputStream());
  }

Ответы [ 2 ]

0 голосов
/ 17 января 2020

У меня такая же проблема. Я попытался использовать ваше предложение.

@GetMapping("/download")

publi c void download (HttpServletResponse response) выдает исключение {

List<User> users = userService.getUsers();
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("All Users List");
Row header = sheet.createRow(0);
header.createCell(0).setCellValue("Username");
header.createCell(1).setCellValue("First name");
header.createCell(2).setCellValue("Last name");
header.createCell(3).setCellValue("E-mail");

int rowNum = 1;

for (User user : users) {
  Row aRow = sheet.createRow(rowNum++);
  aRow.createCell(0).setCellValue(user.getUsername());
  aRow.createCell(1).setCellValue(user.getFirstName());
  aRow.createCell(2).setCellValue(user.getLastName());
  aRow.createCell(3).setCellValue(user.getEMail());
}


response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("content-disposition", "attachment; filename=myfile.xlsx");
workbook.write(response.getOutputStream());

}

Но при загрузке с контроллера документ я получаю это: enter image description here

0 голосов
/ 15 января 2020

Отсутствует тип содержимого:

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

Также используйте XSSFWorkbook для создания файла .xlsx:

XSSFWorkbook wb = new XSSFWorkbook ();

Edit ~~~~

Вот полный пример, который работает, я использую SpringBoot 2.2.2 и POI 3.15.

@GetMapping(value = "/main/export")
public void export(HttpServletResponse response) throws Exception {

    // user list  
    List<UserDto> users = new ArrayList<>();
    users.add(new UserDto(1L, "user1"));
    users.add(new UserDto(2L, "user2"));

    XSSFWorkbook workbook = new XSSFWorkbook();

    Sheet sheet = workbook.createSheet("All Users List");
    Row header = sheet.createRow(0);
    header.createCell(0).setCellValue("Username");
    header.createCell(1).setCellValue("First name");
    header.createCell(2).setCellValue("Last name");
    header.createCell(3).setCellValue("E-mail");

    int rowNum = 1;

    for (UserDto user : users) {
        Row aRow = sheet.createRow(rowNum++);
        aRow.createCell(0).setCellValue(user.getId());
        aRow.createCell(1).setCellValue(user.getName());
    }

    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("content-disposition", "attachment; filename=myfile.xlsx");
    workbook.write(response.getOutputStream());

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